【发布时间】:2015-05-03 11:03:38
【问题描述】:
我想出了这个
n=1;
curAvg = 0;
loop{
curAvg = curAvg + (newNum - curAvg)/n;
n++;
}
我认为这种方式的亮点是:
- 它避免了大数字(如果你先求和然后除,可能会溢出)
- 你保存一个寄存器(不需要存储总和)
问题可能在于求和错误 - 但我认为通常向上和向下舍入的数字应该是平衡的,因此错误不会显着地求和。
您是否发现此解决方案存在任何缺陷? 你有更好的建议吗?
【问题讨论】:
-
我不明白你的公式。对于
1 2和3接下来,你会做curAvg = 1.5 + (3 - 1.5)/2 = 1.5 + 0.75 = 2.25,这会错吗? -
那里提到了您的解决方案:
new average = old average + (next data - old average) / next count -
@IVlad 您忘记增加 n 的值。它应该是 3 而不是 2。所以表达式应该是
curAvg = 1.5+(3-1.5)/3=1.5+0.5 = 2,这是正确的。 -
需要注意的是,OP的算法不是标准移动平均线,而是指数加权移动平均线。虽然 EMA 可能只是许多应用程序的票证,但在某些情况下(大阶跃响应)两者的行为完全不同,实施者应该意识到这种差异。见stackoverflow.com/questions/12636613/…
标签: algorithm math average moving-average