FPU 尝试从浮点计算中产生非常精确的结果。但是,在很多情况下这是不可能的,因为目标操作数可能无法精确表示计算结果。比如,假设现有一特定存储格式只允许 3 个小数位。那么,该格式可以保存形如 1.011 或 1.101 的数值,而不能保存形如 1.0101 的数值。
若计算的精确结果为 +1.0111 (十进制数 1.4375),那么,既可以通过加 0.0001 向上舍入该数,也可以通过减 0.0001 向下舍入:
若精确结果是负数,那么加 -0.0001 会使舍入结果更接近 -∞。而减去 -0.0001 会使舍入结果更接近 0 和 +8:
FPU 可以在四种舍入方法中进行选择:
1) 舍入到最接近的偶数 (round to nearest even):舍入结果最接近无限精确的结果。如果有两个值近似程度相同,则取偶数值 (LSB=0)。
2) 向 -∞ 舍入 (round down to -∞ ):舍入结果小于或等于无限精确结果。
3) 向 +∞ 舍入 (round down to +∞ ):舍入结果大于或等于无限精确结果。
4) 向 0 舍入 (round toward zero):也被称为截断法,舍入结果的绝对值小于或等于无限精确结果。
FPU 控制字用两位指明使用的舍入方法,这两位被称为 RC 字段,字段数值(二进制)如下:
舍入到最接近的偶数是默认选择,它被认为是最精确的,也最适合大多数应用程序。下表以二进制数 +1.0111 为例,展示了四种舍入方法。
方法 | 精确结果 | 舍入结果 | 方法 | 精确结果 | 舍入结果 |
---|---|---|---|---|---|
舍入到最接近的偶数 | 1.0111 | 1.100 | 向 +∞ 舍入 | 1.0111 | 1.100 |
向 -∞ 舍入 | 1.0111 | 1.011 | 向 0 舍入 | 1.0111 | 1.011 |
同样,下表展示了二进制数 -1.0111 的舍入结果。