深入探讨浮点数舍入问题

所谓舍入,就是数超出了某个数据类型所能表示的范围,“两害相权取其轻”, 舍入的核心目的即是尽可能使舍入后的结果与真实值误差最小(尽可能减小舍入处理的影响)

下面我们以二进制浮点数为例,谈谈舍入到底应该如何进行。

假定有效数位(也称保留位)是4,以下面几组例子来说明:

· 1.001 011经舍入处理后的结果为1.001。为什么呢?我们可以计算一下舍入后的结果与1.001和1.010的距离。
|1.001011-1.001|=0.000011,而|1.001011-1.010|=0.00101。很明显前者更接近真实值,因此我们选择舍入后的结果为1.001,也即是向下舍入(此时舍入后的结果比真实值小)
· 1.001101经舍入处理后的结果为1.010。同样的道理,我们来看一下这个1.001和1.010与这个值的距离。
|1.001101-1.001|=0.000101,而|1.001101-1.010|=0.000011。很明显后者更接近真实值,因此这里我们选择舍入后的结果为1.010,也即是向上舍入(此时舍入后的结果比真实值大)


现在,我们差不多可以发现, 当有效位的后一位是0时,此时即将被舍去的值小于最后一位有效位数值的一半,那么应该向下舍入; 当有效位的后一位是1时,而且后面的数位不全为0,此时即将被舍去的值大于最后一位有效数值的一半,那么应该向上舍入。


讨论完这两种情况,我们再来看一种特殊情况:有效位后一位是1,后面数位全是0,此时即将被舍去的值刚好是有效位数值的一半,那么应该怎么进行舍入呢?
如果始终选择向上或者向下舍入都会使结果比真实值大或者小。因此,这里我们需要选择向偶数舍入,也即是将数字向上或者向下舍入,使得结果的 最低有效位是偶数。这样,在50%的时间里,它将向上舍入,而在50%的时间里,它将向下舍入。

具体应该如何进行向偶数舍入呢?
按照同样的思路,我们再来看看下面两个例子:


·1.001100:距它最近的两个偶数分别是1.000和1.010。|1.001100-1.000|=0.001100,而|1.001100-1.010|=0.000100,很明显后者距离更近。因此我们选择舍入后的结果为1.010
· 1.100100:据它最近的两个偶数分别是1.100和1.110。|1.100100-1.100|=0.000100,而|1.100100-1.110|=0.001100,显然前者距离更近。因此我们选择舍入后的结果为1.100
从这个例子我们可以归纳出,如果即将被舍的值刚好等于一半,如果最低有效位为奇,则向上舍入,如果为偶,则向下舍入,从而实现使最低有效位始终为偶数


说了这么多,我们可以作出如下总结:

如果以形式1.RR..RDD..D表示浮点数(R表示有效位,或保留位,而D表示舍去位),舍入规则就是:

如果DD..D < 10..0,则向下舍入

如果DD..D > 10..0,则向上舍入

如要DD..D = 10..0,则向最近偶数舍入,细则如下 :

a. 如果RR..R = XX..0 (最低有效位是0),则向下舍入

b. 如果RR..R = XX..1(最低有效位是1),则向上舍入

猜你喜欢

转载自blog.csdn.net/qq_42372980/article/details/80554247