【发布时间】:2011-01-27 19:07:20
【问题描述】:
我需要针对任意数量的数据点(超过 1 亿个)计算 16 位运算的均方误差。我决定采用运行平均值,这样我就不必担心添加大量平方误差会导致溢出。在 1 亿个样本中,我遇到了浮点精度问题(结果不准确),所以我改为加倍。
这是我的代码
int iDifference = getIdeal() - getValue();
m_iCycles++;
// calculate the running MSE as
// http://en.wikipedia.org/wiki/Moving_average
// MSE(i + 1) = MSE(i) + (E^2 - MSE(i))/(i + 1)
m_dMSE = m_dMSE + ((pow((double)iDifference,2) - m_dMSE) / (double)m_iCycles);
有没有更好的方法来实现这一点以保持准确性?我考虑将 MSE 归一化为 1,并在完成时简单地保留一个总和,最后除以计算平均值。
【问题讨论】:
-
顺便说一句,根据您是否接受
pow(double, int)过载,iDifference*iDifference可能比pow调用快几个数量级。 -
同意。我应该抓住它。谢谢马克!
标签: c++ floating-point