Мне нужно вычислить среднеквадратичную ошибку 16-битной операции для произвольного количества точек данных (более 100 миллионов) . Я решил использовать скользящее среднее, чтобы не беспокоиться о переполнении из-за добавления большого количества квадратичных ошибок. На 100 миллионах выборок у меня были проблемы с точностью с плавающей запятой (неточные результаты), поэтому я перешел к удвоению.
Вот мой код
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 до единицы и просто сохранении суммы с последним делением по завершении, чтобы вычислить среднее значение.