CSAPP
向偶数舍入初看上去好像是个相当随意的目标——有什么理由偏向取偶数呢?为什么不始终把位于两个可表示的值中间的值都向上舍入呢?使用这种方法的一个问题就是很容易假想到这样的情景:这种方法舍入一组数值,会在计算这些值的的平均数中引入统计偏差。我们采用这种方法舍入一组数的平均值将比这些数本身旳平均值略高一些。相反,如果我们总是把两个可表示值中间的数字向下舍入,那么舍入出的一组数的平均值将比这些数本身的平均值略低一些。向偶数舍入在大多数现实情况中避免了这种统计偏差。在50%的时间里,它将向上舍入,而在50%的时间里,它将向下舍入。
如何向偶数舍入
要点
- 只有在两个可表示的数中间的数才会进行偶数舍入
- 其余情况为,舍入到靠近的那个可表示的数
十进制
舍入到小数点后两位
1.2349999
舍入为1.23
1.2350001
舍入为1.24
- 因为它们不是
1.23
和1.24
的正中间
1.2350000
舍入为1.24
1.2450000
舍入为1.24
- 因为前者处于
1.23
和1.24
的正中间,后者处于1.24
和1.25
的正中间,且4为偶数
二进制
舍入到小数点后两位
两个二进制数的正中间
- 现在是舍入到小数点后两位,那么我们看从小数点后三位开始的数字,就叫它多余数字
- 当多余数字正好为
100000000...
时,它的大小是正好是上一位为1所代表的数的一半,也就是说,在正中间 - 当多余数字第一位为0,比如
01001001000...
,它小于中间值,所以向下舍入 - 当多余数字第一位为1,且其他位还有1,比如
10000010001...
,它大于中间值,所以向上舍入
二进制小数的偶数
我们将最低有效位的值为0认为是偶数,1认为是奇数
例
10.00011
舍入为10.00
10.00110
舍入为10.01
- 因为它们不是
10.00
和10.01
的中间值
10.11100
舍入为11.00
10.10100
舍入为10.10
- 它们的多余数字均为中间值,所以进行向偶数舍入
- 前者最低有效位为1,则进1,使之为0
- 后者最低有效位为0,则舍去多余数字即可
舍入前 | 1.01011 | 1.01100 | 1.01101 | 1.01110 | 1.01111 | 1.10000 | ... | 1.10100 |
---|---|---|---|---|---|---|---|---|
舍入后 | 1.01000 | 1.10000 | 1.10000 | 1.10000 | 1.10000 | 1.10000 | ... | 1.10000 |
状态 | 向下 | 向偶数 | 向上 | 向上 | 向上 | 向下 | ... | 向偶数 |