让我们说我有大量的浮子,例如100,我需要计算他们的平均值。
为了获得最准确的结果,我应该将所有数字相加,然后除以100吗?
或者我应该将每个数字除以100,然后将它们全部加起来?
(如果重要的话,我在Python 2中进行编码。)
答案 0 :(得分:3)
求和它们然后除以100.一个好的经验法则是通常可以通过执行更少的操作来最小化FP误差[1]。如果将它们相加然后除以,则执行了100次浮点运算。如果除以然后求和,则执行了199次浮点运算。
[1]有一些例外,其中多次计算的舍入误差完全取消,但这很少偶然发生 - 如果发生这种情况通常是因为算法被设计为由那些知道它们的人以这种方式工作正在做。
答案 1 :(得分:0)
我可以从一般的角度来回答这个问题,而不是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)
我应该注意,如果你的数字范围很广,你仍然可以遇到问题。当您有非常大的正数和负数可以相互抵消时也是如此。在这种情况下可能必须使用其他方法;这些通常会考虑数字的大小和符号。
答案 2 :(得分:0)
首先添加,然后平均值将获得最准确的平均值
如果您对准确性感兴趣,请使用Decimal