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位計算機上。
這種差異導致我的程序在結尾處的結果略微不同於原始結果。
減法中這種差異的原因是什麼? (考慮到,這是他們所運行的同一臺機器相同的配置)
您使用x87 fpu嗎?如果是這樣,我的哀悼。 – EOF
以下是常見問題解答的庫存答案。 http://stackoverflow.com/questions/588004/is-floating-point-math-broken –
@WeatherVane我不認爲這個答案解釋了爲什麼同一段代碼可以產生兩個不同的結果。也許你應該再讀一遍。 –