IEEE 754 的舍入规则

之前写过一篇博客简单提起过 IEEE 754,最近在读 CSAPP,又再次接触到这个浮点数标准。对于其中的舍入规则,书里面讲得不是很清楚,所以断断续续花了几天的时间,才算弄懂了具体的规则,所以打算写篇博客好好记录下。

对于这种数值表示的标准,一定会考虑的情况就是当发生溢出的时候(有可能是正溢出或者负溢出),数值应该怎样表示。在查阅资料的过程中,也发现了一个有趣的概念,偏差。

偏差

对于舍入,可以有很多种规则,可以向上舍入,向下舍入,向偶数舍入。如果我们只采用前两种中的一种,就会造成平均数过大或者过小,实际上这时候就是引入了统计偏差。如果是采用偶数舍入,则有一半的机会是向上舍入,一半的机会是向下舍入,这样子可以避免统计偏差。而 IEEE 754 就是采用向最近偶数舍入(round to nearest even)的规则。

舍入规则

舍入的规则需要区分三种情况,

  • 当具体的值大于中间值的时候,向上舍入
  • 当具体的值小于中间值的时候,向下舍入
  • 当具体的值等于中间值的时候,向偶数舍入

向偶数舍入指的是要保留的最低有效位为偶数,具体规则,

  • 要保留的最低有效位如果为奇数,则向上舍入
  • 要保留的最低有效位如果为偶数,则向下舍入

中间值

上面的舍入规则,提到了一个很重要的概念,中间值。怎样才能确定这个中间值呢?这也是我花了最多时间理解的。

要找到中间值,先确定要保留的有效数字,找到要保留的有效数字最低位的下一位。如果这位是进制的一半,而且之后的位数都为 0,则这个值就是中间值。

上面的描述比较抽象,来看两个例子

  • 十进制的 1.2500,要保留到小数点后一位,下一位是 5,是进制的一半,后面位数都为 0,所以这个值就是中间值
  • 二进制的 10.0110,要保留到小数点后两位,下一位是 1,是进制的一半,后面位数都为 0,所以这个值就是中间值

例子

知道了舍入规则之后,我们来看几个具体的例子,以二进制为例,有效位数保留到小数点后两位

  • 10.00011,中间值为 10.00100,小于中间值,向下舍入为 10.00
  • 10.00110,中间值为 10.00100,大于中间值,向上舍入为 10.01
  • 10.11100,中间值为 10.11100,等于中间值,要保留的最低有效位 1 为奇数,向上舍入为 11.00
  • 10.10100,中间值为 10.10100,等于中间值,要保留的最低有效位 0 为偶数,向下舍入为 10.10

参考资料

2019.04.11
Powered by Cubi,  Hosted by Coding Pages