Мне нужно вычислить среднеквадратичную ошибку 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 одним и просто держал сумму с окончательным делением на завершение, чтобы вычислить среднее значение.
Как полностью примечание стороны, в зависимости от того, вы поднимаете 'Pow (двойной, Int)' перегрузки, 'iDifference * iDifference' может быть на несколько порядков быстрее, чем' pow' вызова. –
Согласовано. Я должен был это понять. Спасибо, Марк! –