Поддержание точности с плавающей точкой с помощью скользящего среднего

Мне нужно вычислить среднеквадратичную ошибку 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 до единицы и просто сохранении суммы с последним делением по завершении, чтобы вычислить среднее значение.

13
задан Jason George 27 January 2011 в 19:07
поделиться