什么是数值计算平均值的最佳方法

Tob*_*ner 19 c++ numerical-methods

什么是计算平均值的最佳方法?有了这个问题,我想知道在数值意义上用于计算平均值的算法是最好的.它应该具有最小的舍入误差,不应对上溢或下溢等敏感.

谢谢.


附加信息:首选增量方法,因为值的数量可能不适合RAM(对大于4 GB的文件进行多次并行计算).

MSa*_*ers 8

如果你想要一个O(N)算法,看看Kahan求和.


Jit*_*sen 7

你可以看一下http://citeseer.ist.psu.edu/viewdoc/summary?doi=10.1.1.43.3535(Nick Higham,"浮点求和的准确性",SIAM Journal of Scientific Computation,1993) .

如果我没记错的话,如果所有数字都是正数,则补偿求和(Kahan求和)是好的,至少与排序它们并按升序添加它们一样好(除非有非常多的数字).如果有些数字为正数且有些数字为负数,则故事要复杂得多,以便取消.在这种情况下,有一个参数可以按降序添加它们.

  • @MSalters你为什么要分开总结它们?如果要最小化舍入误差,则中间结果应尽可能小(绝对值).单独求和它们会产生相反的效果. (3认同)
  • 正如您自己注意到的那样,如果所有数字都具有相同的符号,则补偿求和是好的. (2认同)

Dav*_*nan 5

按数量级升序对数字进行排序。将它们相加,首先是低震级。除以计数。


Dav*_*ave 5

我总是使用以下伪代码:

float mean=0.0; // could use doulbe
int n=0;  // could use long

for each x in data:
    ++n;
    mean+=(x-mean)/n;
Run Code Online (Sandbox Code Playgroud)

我没有其稳定性的正式证明,但您可以看到,假设数据值表现良好,我们不会遇到数值溢出问题。高德纳 (Knuth) 的《计算机编程艺术》中提到了这一点