相关疑难解决方法(0)

如何计算移动平均线而不保留计数和数据总数?

我试图找到一种计算移动累积平均值的方法,而不存储到目前为止收到的计数和总数据.

我想出了两个算法,但都需要存储计数:

  • 新的平均值=((旧计数*旧数据)+下一个数据)/下一个计数
  • 新平均值=旧平均值+(下一个数据 - 旧平均值)​​/下一个计数

这些方法的问题在于计数越来越大,导致平均值的精度下降.

第一种方法使用旧计数和下一计数,显然是1.这让我想到也许有一种方法可以删除计数,但遗憾的是我还没有找到它.它确实让我更进一步,导致第二种方法,但仍然计数存在.

是可能的,还是我只是在寻找不可能的事情?

moving-average

105
推荐指数
7
解决办法
11万
查看次数

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

假设我们有很多双打,例如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)

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

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

c++ floating-point

5
推荐指数
1
解决办法
346
查看次数

如何计算两个浮点数的平均值?

在浮点运算中计算两个数字的平均值的最准确方法是什么?让我们考虑一下最常见的双精度 64 位数字。

  1. (a + b) / 2

  2. a / 2 + b / 2

  3. 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)

language-agnostic floating-point ieee-754

2
推荐指数
1
解决办法
143
查看次数