我正在编写一本关于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有其他一些好处,任何人都可以帮助我吗?谢谢!
我假设我们在这里谈论浮点运算(否则"更好"的平均值将是可怕的).
在第二种方法中,中间结果(sum
)将趋于无限制地增长,这意味着你最终将失去低端精度.在第一种方法中,中间结果应保持与输入数据大致相似的幅度(假设您的输入没有巨大的动态范围).这意味着它将更好地保持精度.
但是,我可以想象,随着i
越来越大,其价值(x - avg) / i
将变得越来越不准确(相对).所以它也有它的缺点.
从某种意义上说它更好,它可以计算运行平均值,即您不需要提前获得所有数字。您可以边做边计算,或者当数字可用时进行计算。