所谓舍入,就是数超出了某个数据类型所能表示的范围,“两害相权取其轻”,
舍入的核心目的即是尽可能使舍入后的结果与真实值误差最小(尽可能减小舍入处理的影响)。
下面我们以二进制浮点数为例,谈谈舍入到底应该如何进行。
假定有效数位(也称保留位)是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.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),则向上舍入