购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

4.4 舍入

就精度而言,在计算过程中浮点运算函数产生的结果可能优于浮点格式支持的数值(计算过程中可以用保护位来保持这些额外的精度)。当计算最终完成并且结果需要保存到代码中的浮点变量时,需要处理这些额外的精度位。舍入(Rounding)就是系统运用保护位来影响其他位的方法,而且舍入的方法会影响计算的准确性。传统的浮点软件和硬件采用的舍入方法有四种:截断、上舍入、下舍入及四舍五入。截断最简单,但是用在连续计算中得到的结果最不准确。现代浮点系统很少使用截断方法,除非需要将浮点数转换为整数(截断是将浮点数强制转换为整数的标准做法)。

如果保护位全部为0,则上舍入什么都不会做,但是如果当前尾数超出了目标格式的长度,上舍入会将尾数设置为浮点格式能表示的大于当前尾数的最小值。和截断一样,上舍入也不是常见的舍入模式。但是,上舍入能够有效地实现ceil()函数。这个函数将浮点值舍入到大于该浮点值的最小整数。

下舍入和上舍入相似,只不过下舍入是将结果舍入到小于该浮点数的最大值。这看起来和截断一样,但这两种方法有一个细微的差别:截断总是舍入到0。正数的截断和下舍入是等价的。负数的截断只会使用尾数中现有的位。而如果结果为负,则下舍入还需要在低位加1。下舍入也不是常见的舍入模式,但能够有效地实现floor()这样的函数。这个函数将浮点值舍入到小于该浮点值的最大整数。

最符合直觉的处理保护位的方法是四舍五入。如果保护位表示的值小于尾数低位表示的值的一半,则四舍五入会将结果下舍入到小于该浮点值的最大值(忽略符号位)。如果保护位表示的值大于尾数低位表示的值的一半,则四舍五入会将尾数上舍入到大于该浮点值的最小值(忽略符号位)。如果保护位表示的值恰好是尾数最低位表示的值的一半,则IEEE浮点标准的要求是上舍入和下舍入应保持机会各半。具体实现可以是将尾数舍入到低位为0。也就是说,如果当前尾数的最低位已经为0,则使用当前尾数;如果当前尾数的最低位为1,则在最低位加1将其舍入到大于该浮点值且低位为0的最小值。IEEE浮点标准强制要求使用的这种方案在发生精度损失时能得到最佳结果。

下面是一些舍入的例子,用到了24位尾数和4位保护位(这些例子使用四舍五入的算法将28位数字舍入到24位数字): pusCYjCNxsI+G+MyTufK9uYWX6bILFlBWTI5IuW10T5XumwAh7Pe1jCWkJYapAXG

img
点击中间区域
呼出菜单
上一章
目录
下一章
×