2015-10-17 76 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)時,結果變得相同。