我试图找到一种计算移动累积平均值的方法,而不存储到目前为止收到的计数和总数据.
我想出了两个算法,但都需要存储计数:
这些方法的问题在于计数越来越大,导致平均值的精度下降.
第一种方法使用旧计数和下一计数,显然是1.这让我想到也许有一种方法可以删除计数,但遗憾的是我还没有找到它.它确实让我更进一步,导致第二种方法,但仍然计数存在.
是可能的,还是我只是在寻找不可能的事情?
假设我们有很多双打,例如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)
当数字较小时,这可能会失去精度。
是否有任何故障安全方法来计算浮点数的简单平均值?赞赏仅使用标准库的解决方案。
在浮点运算中计算两个数字的平均值的最准确方法是什么?让我们考虑一下最常见的双精度 64 位数字。
(a + b) / 2
a / 2 + b / 2
a + (b - a) / 2
这些计算平均值的方法可能会给出不同的结果,如下面的 C++ 代码所示:
double a = 1.2;
double b = 3.6;
double mean1 = (a + b) / 2.0;
double mean2 = a / 2.0 + b / 2.0;
double mean3 = a + (b - a) / 2.0;
cout << fixed << setprecision(20);
cout << "mean1: " << mean1 << endl;
cout << "mean2: " << mean2 …Run Code Online (Sandbox Code Playgroud)