当值恰好在周围整数之间时,Scheme(R5RS)和Python(请参见此问题)之类的编程语言会向最接近的偶数整数取整。
这背后的原因是什么?
是否有一个数学思想可以简化以下计算的推理?
(R5RS引用IEEE浮点标准作为此行为的来源。)
当值恰好在周围整数之间时,Scheme(R5RS)和Python(请参见此问题)之类的编程语言会向最接近的偶数整数取整。
这背后的原因是什么?
是否有一个数学思想可以简化以下计算的推理?
(R5RS引用IEEE浮点标准作为此行为的来源。)
Answers:
前一阵子,我构建了一个用于连续取整的测试程序,因为它基本上是用于取整算法的最坏情况下的压力测试。
对于从0到9,999的每个数字,它首先四舍五入到最接近的10,然后四舍五入到最接近的100,然后再四舍五入到最接近的1000。(您也可以认为这是[0,1]中的10,000点)被四舍五入到3位,然后到2,然后到1。)这组数字的平均值为4999.5。
如果使用“四舍五入”方法完成所有三个舍入,则结果如下(第一列是舍入结果,第二列是对该结果舍入了多少个数字,即它是直方图)。
0 445
1000 1000
2000 1000
3000 1000
4000 1000
5000 1000
6000 1000
7000 1000
8000 1000
9000 1000
10000 555
结果从一次“四舍五入”到每10,000中最接近的一千五百五十次不等,平均舍入值为5055(比原始平均值高55.5)。
如果通过“四舍五入”完成所有三个舍入,则结果为:
0 556
1000 1000
2000 1000
3000 1000
4000 1000
5000 1000
6000 1000
7000 1000
8000 1000
9000 1000
10000 444
结果从单个“向下取整”到10,000中的最接近的一千五百五十次不同,并且平均取整值为4944(太低了55.5)。
如果所有三个舍入均使用“四舍五入”进行,则结果为:
0 445
1000 1111
2000 889
3000 1111
4000 889
5000 1111
6000 889
7000 1111
8000 889
9000 1111
10000 444
结果从一个“四舍五入的奇数”到10,000中最接近的一千五百五十次不等,平均舍入值为4999.5(正确)。
最后,如果所有三个舍入均使用“半舍入”进行,则结果为:
0 546
1000 909
2000 1091
3000 909
4000 1091
5000 909
6000 1091
7000 909
8000 1091
9000 909
10000 1091
结果从一个“四舍五入”到10,000中最接近的千次450次,平均舍入值为4999.5(正确)。
我认为很明显,向上舍入和向下舍入都会使舍入值产生偏差,因此舍入值的平均值不再具有与原始值的平均值相同的期望,并且“舍入为偶数”和“舍入为奇数”消除偏见的方法是,一半时间一次处理5,另一半时间另一种方法。连续的舍入会增加偏差。
四舍五入的偶数和四舍五入的奇数会给分布带来自己的偏差:分别偏向偶数和奇数。同样,在这两种情况下,此偏差都会乘以连续的舍入,但是对于舍入为奇数的情况则更糟。我认为这种情况下的解释很简单:5是一个奇数,因此,半数奇数的结果以5结尾比偶数半数更多,因此,更多的结果将需要在下一个舍入中专门处理。
因此,无论如何,在这四个选择中,只有两个是无偏的,在这两个无偏的选择中,如果经过反复四舍五入,则舍入的一半甚至会表现出最佳的分布。
这称为银行家四舍五入。这样做的目的是使许多舍入操作产生的累积误差最小。
假设您总是四舍五入。想想所有这些很少的利息支出,银行每次赚五分钱。
假设您总是四舍五入。会计将大声疾呼,因为您支付的利息超出了您应有的水平。