平均浮动时保持精度
Maintain precision when averaging floats
假设我有大量的花车,例如100,我需要计算他们的平均值。
为了得到最准确的结果,我应该将所有数字相加然后除以 100 吗?
还是我应该将每个数字除以 100,然后将所有数字相加?
(如果重要,我在 Python 2 中编码。)
将它们相加,然后除以 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)
我应该注意,如果您的数字范围很广,您仍然会遇到问题。当您有可以相互抵消的非常大的正数和负数时,也是如此。在这种情况下可能必须使用其他方法;这些通常会考虑数字的大小和符号。
先相加再求平均值会得到最准确的平均值
如果您对准确性感兴趣,请使用Decimal
假设我有大量的花车,例如100,我需要计算他们的平均值。
为了得到最准确的结果,我应该将所有数字相加然后除以 100 吗?
还是我应该将每个数字除以 100,然后将所有数字相加?
(如果重要,我在 Python 2 中编码。)
将它们相加,然后除以 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)
我应该注意,如果您的数字范围很广,您仍然会遇到问题。当您有可以相互抵消的非常大的正数和负数时,也是如此。在这种情况下可能必须使用其他方法;这些通常会考虑数字的大小和符号。
先相加再求平均值会得到最准确的平均值
如果您对准确性感兴趣,请使用Decimal