我正在做一本关于C语言的编程书籍的练习。该练习建议,要找出一组数字的平均值,算法:
avg += (x - avg) / i;比:
sum += x;
avg = sum / i;'x‘是一个用来存储输入数字的变量。它还表明,除了防止溢出,第一种算法确实比第二种算法有一些其他的好处,有人能帮我吗?谢谢!
发布于 2011-06-03 21:39:08
我假设我们在这里讨论的是浮点算术(否则“更好”的平均值将是可怕的)。
在第二种方法中,中间结果(sum)将趋于无限增长,这意味着您最终将失去低端精度。在第一种方法中,中间结果应该与您的输入数据保持大致相似的大小(假设您的输入没有巨大的动态范围)。这意味着它将更好地保持精度。
然而,我可以想象,随着i变得越来越大,(x - avg) / i的值(相对)将变得越来越不准确。所以它也有它的缺点。
发布于 2011-06-03 21:20:59
从它计算运行平均值的意义上来说,它更好,也就是说,你不需要提前得到所有的数字。您可以根据实际情况进行计算,也可以根据可用的数据进行计算。
发布于 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。因此,在这种情况下,我们处理的是溢出问题。但是如果你执行第一个算法,那么你就能够处理这个问题。
因此,我建议您使用第一种算法,如果它很可能发生溢出,否则它只会增加额外的操作。如果您决定使用第一种类型,那么我建议您使用范围更大的类型。
https://stackoverflow.com/questions/6227543
复制相似问题