深入探讨浮点数舍入问题

 

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

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

假定有效数位(也称保留位)是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),则向上舍入

 

  • 40
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值