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