Я пытаюсь воспроизвести некоторые алгоритмы из библиотеки обработки внешнего изображения, и я нашел странную ошибку точности вычисления числа чисел с плавающей запятой.Точность разности чисел с плавающей запятой
В оригинальной библиотеке (которая работает на 32 битной конфигурации отладки) есть кусок кода:
double d1 = *im1 - m_Centroids[j][0];
Мой код в данный момент тот же (также работает на 32 битной конфигурации отладки):
double d1 = *im1 - m_Centroids[j][0];
в какой-то момент выполнения программы (при остановленном для отладки) в исходной библиотеке эти переменные имеют значения (в VisualStudio окно просмотра):
Original code:
*im1 0.113626622 float
double(*im1) 0.11362662166357040 double
m_Centroids[j][0] 25.6416969 float
double(m_Centroids[j][0]) 25.641696929931641 double
*im1 - m_Centroids[j][0] -25.5280704 float
double(*im1 - m_Centroids[j][0]) -25.528070449829102 double
d1 -25.528070308268070 double
(Чувствуете разницу между двумя последними)
My code:
*im1 0.113626622 float
double(*im1) 0.11362662166357040 double
m_Centroids[j][0] 25.6416969 float
double(m_Centroids[j][0]) 25.641696929931641 double
*im1 - m_Centroids[j][0] -25.5280704 float
double(*im1 - m_Centroids[j][0]) -25.528070449829102 double
d1 -25.528070449829102 double
Также я запустить исходный код и мой код одновременно на отдельно случаях VisualStudio, на том же 64 разрядном компьютере.
Эта разница приводит к тому, что моя программа имеет несколько разные результаты в конце, чем оригинал.
В чем причина такой разницы в вычитании? (Учитывая, что это та же машина они работают на и та же конфигурация)
Вы используете x87 fpu? Если так, мои соболезнования. – EOF
Вот запасный ответ на часто задаваемые вопросы. http://stackoverflow.com/questions/588004/is-floating-point-math-broken –
@WeatherVane Я не думаю, что этот ответ объясняет, почему один и тот же код может давать два разных результата. Возможно, вы должны прочитать его снова. –