首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >求平均值的更好算法

求平均值的更好算法
EN

Stack Overflow用户
提问于 2011-06-03 21:15:12
回答 7查看 11.4K关注 0票数 16

我正在做一本关于C语言的编程书籍的练习。该练习建议,要找出一组数字的平均值,算法:

代码语言:javascript
运行
复制
avg += (x - avg) / i;

比:

代码语言:javascript
运行
复制
sum += x;
avg = sum / i;

'x‘是一个用来存储输入数字的变量。它还表明,除了防止溢出,第一种算法确实比第二种算法有一些其他的好处,有人能帮我吗?谢谢!

EN

回答 7

Stack Overflow用户

发布于 2011-06-03 21:39:08

我假设我们在这里讨论的是浮点算术(否则“更好”的平均值将是可怕的)。

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

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

票数 9
EN

Stack Overflow用户

发布于 2011-06-03 21:20:59

从它计算运行平均值的意义上来说,它更好,也就是说,你不需要提前得到所有的数字。您可以根据实际情况进行计算,也可以根据可用的数据进行计算。

票数 4
EN

Stack Overflow用户

发布于 2011-06-03 21:39:03

后一种算法比前一种算法更快,因为您必须执行n个操作(实际上,后者需要执行2*n个操作)。但是,第一个确实可以防止溢出。例如,如果您有这样一组1000个数字: 4000000*250、1500000*500、2000000*500,那么所有整数的总和将是2'750.000.000,但是c++ int数据类型的上限是2,147,483,647。因此,在这种情况下,我们处理的是溢出问题。但是如果你执行第一个算法,那么你就能够处理这个问题。

因此,我建议您使用第一种算法,如果它很可能发生溢出,否则它只会增加额外的操作。如果您决定使用第一种类型,那么我建议您使用范围更大的类型。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6227543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档