假设我们有一个基本的移动平均函数来跟踪总和。例如:
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/