更好的算法找平均值

Oli*_*er 16 c algorithm

我正在编写一本关于C的编程书A Book.练习建议找到一组数字的平均值,算法:

avg += (x - avg) / i;
Run Code Online (Sandbox Code Playgroud)

比以下更好:

sum += x;
avg = sum / i;
Run Code Online (Sandbox Code Playgroud)

'x'是用于存储输入数字的变量.它还建议除了防止溢出之外,第一个算法确实比第二个algorthim有其他一些好处,任何人都可以帮助我吗?谢谢!

Oli*_*rth 9

我假设我们在这里谈论浮点运算(否则"更好"的平均值将是可怕的).

在第二种方法中,中间结果(sum)将趋于无限制地增长,这意味着你最终将失去低端精度.在第一种方法中,中间结果应保持与输入数据大致相似的幅度(假设您的输入没有巨大的动态范围).这意味着它将更好地保持精度.

但是,我可以想象,随着i越来越大,其价值(x - avg) / i将变得越来越不准确(相对).所以它也有它的缺点.

  • @Algorithmist:考虑浮点表示的结构; a*尾数*和*指数*.尾数表示精度,即有效数字,并且有固定数量的数字.随着您的数字变大,指数将开始增加,这意味着您的有效数字开始远离二进制点. (3认同)

mba*_*rov 4

从某种意义上说它更好,它可以计算运行平均值,即您不需要提前获得所有数字。您可以边做边计算,或者当数字可用时进行计算。

  • -1:两者都能够计算运行平均值。 (7认同)
  • 您将能够在恒定时间内计算每个增量平均值,而不是 O(N) (2认同)