2015-10-17 4 views
0

Я пытаюсь воспроизвести некоторые алгоритмы из библиотеки обработки внешнего изображения, и я нашел странную ошибку точности вычисления числа чисел с плавающей запятой.Точность разности чисел с плавающей запятой

В оригинальной библиотеке (которая работает на 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 разрядном компьютере.

Эта разница приводит к тому, что моя программа имеет несколько разные результаты в конце, чем оригинал.

В чем причина такой разницы в вычитании? (Учитывая, что это та же машина они работают на и та же конфигурация)

+0

Вы используете x87 fpu? Если так, мои соболезнования. – EOF

+0

Вот запасный ответ на часто задаваемые вопросы. http://stackoverflow.com/questions/588004/is-floating-point-math-broken –

+1

@WeatherVane Я не думаю, что этот ответ объясняет, почему один и тот же код может давать два разных результата. Возможно, вы должны прочитать его снова. –

ответ

0

Я нашел решение, чтобы достичь тех же результатов в моем коде из: Difference in floating point arithmetics between x86 and x64

Решение было заставить мой код, чтобы излучать SSE инструкции даже для 32-битной конфигурации, как это было сделано в оригинальной библиотеке.

Как только я установил Потоковые SIMD-расширения (/ arch: SSE), результат стал идентичным.

Смежные вопросы