之前写过一篇博客简单提起过 IEEE 754,最近在读 CSAPP,又再次接触到这个浮点数标准。对于其中的舍入规则,书里面讲得不是很清楚,所以断断续续花了几天的时间,才算弄懂了具体的规则,所以打算写篇博客好好记录下。
对于这种数值表示的标准,一定会考虑的情况就是当发生溢出的时候(有可能是正溢出或者负溢出),数值应该怎样表示。在查阅资料的过程中,也发现了一个有趣的概念,偏差。
对于舍入,可以有很多种规则,可以向上舍入,向下舍入,向偶数舍入。如果我们只采用前两种中的一种,就会造成平均数过大或者过小,实际上这时候就是引入了统计偏差。如果是采用偶数舍入,则有一半的机会是向上舍入,一半的机会是向下舍入,这样子可以避免统计偏差。而 IEEE 754 就是采用向最近偶数舍入(round to nearest even)的规则。
舍入的规则需要区分三种情况,
向偶数舍入指的是要保留的最低有效位为偶数,具体规则,
上面的舍入规则,提到了一个很重要的概念,中间值。怎样才能确定这个中间值呢?这也是我花了最多时间理解的。
要找到中间值,先确定要保留的有效数字,找到要保留的有效数字最低位的下一位。如果这位是进制的一半,而且之后的位数都为 0,则这个值就是中间值。
上面的描述比较抽象,来看两个例子
1.2500,要保留到小数点后一位,下一位是 5,是进制的一半,后面位数都为 0,所以这个值就是中间值10.0110,要保留到小数点后两位,下一位是 1,是进制的一半,后面位数都为 0,所以这个值就是中间值知道了舍入规则之后,我们来看几个具体的例子,以二进制为例,有效位数保留到小数点后两位
10.00011,中间值为 10.00100,小于中间值,向下舍入为 10.0010.00110,中间值为 10.00100,大于中间值,向上舍入为 10.0110.11100,中间值为 10.11100,等于中间值,要保留的最低有效位 1 为奇数,向上舍入为 11.0010.10100,中间值为 10.10100,等于中间值,要保留的最低有效位 0 为偶数,向下舍入为 10.10