汇编语言FPU舍入:计算浮点数的精确结果

FPU 尝试从浮点计算中产生非常精确的结果。但是,在很多情况下这是不可能的,因为目标操作数可能无法精确表示计算结果。比如,假设现有一特定存储格式只允许 3 个小数位。那么,该格式可以保存形如 1.011 或 1.101 的数值,而不能保存形如 1.0101 的数值。

若计算的精确结果为 +1.0111 (十进制数 1.4375),那么,既可以通过加 0.0001 向上舍入该数,也可以通过减 0.0001 向下舍入:

(a) 1.0111 -> 1.100
(b) 1.0111 -> 1.011

若精确结果是负数,那么加 -0.0001 会使舍入结果更接近 -∞。而减去 -0.0001 会使舍入结果更接近 0 和 +8:

(a) -1.0111 -> -1.100
(b) -1.0111 -> -1.011

FPU 可以在四种舍入方法中进行选择:

1) 舍入到最接近的偶数 (round to nearest even):舍入结果最接近无限精确的结果。如果有两个值近似程度相同,则取偶数值 (LSB=0)。

2) 向 -∞ 舍入 (round down to -∞ ):舍入结果小于或等于无限精确结果。

3) 向 +∞ 舍入 (round down to +∞ ):舍入结果大于或等于无限精确结果。

4) 向 0 舍入 (round toward zero):也被称为截断法,舍入结果的绝对值小于或等于无限精确结果。

FPU 控制字

FPU 控制字用两位指明使用的舍入方法,这两位被称为 RC 字段,字段数值(二进制)如下:
  • 00:舍入到最接近的偶数(默认)。
  • 01:向负无穷舍入。
  • 10:向正无穷舍入。
  • 11:向 0 舍入(截断)。

舍入到最接近的偶数是默认选择,它被认为是最精确的,也最适合大多数应用程序。下表以二进制数 +1.0111 为例,展示了四种舍入方法。

方法 精确结果 舍入结果 方法 精确结果 舍入结果
舍入到最接近的偶数 1.0111 1.100  向 +∞ 舍入 1.0111 1.100
向 -∞ 舍入 1.0111 1.011 向 0 舍入 1.0111 1.011

同样,下表展示了二进制数 -1.0111 的舍入结果。