之前写过一篇博客简单提起过 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