假设我有大量的浮点值,例如100,我需要计算它们的平均值。
为了得到最准确的结果,我应该把所有的数字相加,然后除以100吗?
或者我应该把每个数字除以100,然后把它们加起来吗?
(如果重要的话,我用Python2.)
求和,然后除以100。一个很好的经验法则是,您通常可以通过执行较少的操作来最小化FP错误[1]。如果对它们求和,然后进行除法运算,则已执行了100次浮点运算。如果先除法后求和,则已执行了199次浮点运算。
[1] 也有例外,多次计算的舍入误差会完全抵消,但这种情况很少是偶然发生的——如果发生这种情况,通常是因为算法是由知道他们在做什么的人设计的。
我可以从一般的角度回答这个问题,而不是从Python的角度。问题的答案取决于几个因素,包括值的数量和值的范围。
把这些数字加在一起会导致糟糕的结果,这一点你是正确的。这被称为数值不稳定算法。这个问题发生在浮点运算中。在某个点x+1=x,因为没有x+1的表示。
然而,你可能不必担心100个数字,除非它们很大。这个问题通常发生在处理数百万个数字时,或者您可能会遇到整数运算的溢出问题。
除以总数也不一定是一个解决方案,因为你可能会遇到另一个方向的问题——太小了。
一种更稳定的方法是对平均值进行迭代计算:
avg(1) = x1
avg(2) = avg(1) * (1/2) + x2 * (1/2)
avg(3) = avg(2) * (2/3) + x3 * (1/3)
. . .
avg(n) = avg(n - 1) * ((n - 1) / n) + (x(n) / n)
我应该注意的是,如果你的数字范围很广,你仍然可能有问题。当你有非常大的正数和负数可以相互抵消时,这也是真的。在这种情况下,可能必须使用其他方法;这些通常会考虑数字的大小和符号。
先加后求平均值将获得最准确的平均
如果您对准确性感兴趣,请使用十进制