编程语言,如Scheme (R5RS)和Python (见这个问题),当值恰好位于周围整数之间时,就会向最近的偶数方向旋转。
这背后的原因是什么?
是否有一种数学思想能使下列计算更容易推理?
(R5RS引用IEEE浮点标准作为此行为的来源。)
发布于 2014-09-15 08:51:23
不久前,我构建了一个连续四舍五入的测试程序,因为它基本上是对舍入算法的最坏的压力测试。
对于从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次中,最接近的1,000次为1,5550次,平均四舍五入值为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次中,有1,000次降至最近的1,550次,且舍入值和平均值为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次中,最接近的5,550次,平均四舍五入值为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次中最接近的1,450次,平均舍入值为4999.5 (正确)。
我认为很明显,四舍五入对四舍五入值有偏差,所以四舍五入值的平均值不再与原始值的平均值相同,而“四舍五入”和“四舍五入”消除了偏倚,用另一半的方式和另一半的方式处理。连续四舍五入会使偏差相乘。
圆半偶数和圆半奇向分布引入了各自的偏差:分别对偶数位和奇数位的偏倚。在这两种情况下,同样,这种偏差被乘以连续四舍五入,但是对于四舍五入来说更糟糕。我认为这个例子的解释很简单:5是奇数,所以整半奇数的结果比整半偶数有更多的结果,因此,在下一次四舍五入时必须特别处理的结果更多。
因此,不管怎么说,在这四种选择中,只有两种是无偏的,而在这两种无偏的选择中,循环一半甚至在重复四舍五入的情况下给出了最优的分布。
发布于 2014-09-14 16:09:14
这叫做银行家的四舍五入。这样做的目的是将许多舍入操作的累积误差降到最低。
让我们假设你总是把.5四舍五入。想想那些小小的利息,银行每次赚半美分.
比方说,你总是把.5加起来。会计会尖叫,因为你支付的利息比你应该支付的多。
https://softwareengineering.stackexchange.com/questions/256265
复制相似问题