如何计算两倍的平均值,以使总误差最小?

mar*_*trz 5 c++ floating-point

假设我们有很多双打,例如N == 1000000

array<double, N> arr;
Run Code Online (Sandbox Code Playgroud)

有两种幼稚的方法来计算平均值。第一

double result = 0;
for (double x : arr) {
    result += x;
}
result /= arr.size();
Run Code Online (Sandbox Code Playgroud)

当值的总和很大时,这可能是不准确的。浮点数然后失去精度。

另一种方法是:

double result = 0;
for (double x : arr) {
    result += x / arr.size();
}
Run Code Online (Sandbox Code Playgroud)

当数字较小时,这可能会失去精度。

是否有任何故障安全方法来计算浮点数的简单平均值?赞赏仅使用标准库的解决方案。

Pet*_* G. 4

如果您想从双打中获得更高的准确性,可以使用 卡汉求和,最后除以元素数量。然而,据我所知,没有 Kahan 求和的标准库实现。

一种简单、标准的方法(几乎就像作弊)当然是使用长双精度进行计算,基本上使用您的第一个实现,并且仅将结果转换回双精度。