algorithm - 使用简单移动平均线避免可能的精度损失

标签 algorithm floating-point-precision moving-average

假设我们有一个基本的移动平均函数来跟踪总和。例如:

Queue values;
double sum;

double CalcSMA(double next) {
    values.push(next);
    sum -= values.pop();
    sum += next;
    return sum / SMA_LENGTH;
}

如果我们的窗口是 5 宽,我们给它提供类似这样的内容,那么这可能会如何崩溃的一个例子: 2, 2, 2, 2, 2, 2, 2, 1E100, 2, 2, 2, 2, 2, 2, 2, 2。 输出将是 2, 2, 2, 2E99, 2E99, 2E99, 2E99, 2E99, 0, 0, 0

即使总和没有那么大的偏差,仍然可能存在相当合理的情况,即精度的微小损失可能会使总和人为地增加微小的量。在很长一段时间内,这可能会累积并成为一个问题。

有没有人知道如何解决精度损失问题?

编辑:请注意,此函数设计用于运行 O(1)。那是必要的。因此,每次都重新计算是行不通的:窗口太大。

最佳答案

您可以重新计算每个 SMA_LENGTH 值的新总和以停止错误累积:

Queue values;
double sum = 0.0;
double freshsum = 0.0;
int count = 0;

double CalcSMA(double next) {
    values.push(next);
    sum -= values.pop();
    sum += next;
    freshsum += next;
    if(++count == SMA_LENGTH)
    {
        sum = freshsum;
        freshsum = 0.0;
        count = 0;
    } 
    return sum / SMA_LENGTH;
}

关于algorithm - 使用简单移动平均线避免可能的精度损失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31305886/

相关文章:

algorithm - 当很难/不可能访问源代码时,如何找出方法调用的时间复杂度?

c++ - C 和 C++ 编译器如何实现 float 的相等性判定?

r - 不规则时间序列上的条件滚动平均值(移动平均值)

javascript - 如何解决编码minMaxDivision

c++ - 当其中一个线程较早结束时终止所有线程 C++

python - 我是否需要使用装箱算法或背包?

python - 提高 Python 中的浮点精度

javascript - JavaScript 中是否存在 parseDouble?

Python Pandas : Calculating exponentially weighted lagged squared returns (variance)

python - 使用 Pandas 的 2 天跨度移动平均值