我已經在C++中使用了一些圖像處理代碼,它可以計算梯度並使用hough變換算法在其中找到直線。該程序用浮點數進行大部分計算。在兩臺計算機上使用浮點數的相同代碼給出了兩個不同的結果
當我在兩臺不同計算機上的相同映像上運行此代碼時,一臺運行最新Fedora的Pentium IV,另一臺Core i5最新Ubuntu,都是32位,結果稍有不同。例如。在一臺機器上的一些變量和另一臺機器上的1.3457f上,我經過了一些冗長的計算1.3456f。這是預期的行爲還是應該在我的程序中搜索錯誤?
我的第一個猜測是,我正在訪問一些未初始化的或超出界限的內存,但我通過valgrind運行了該程序,並且找不到任何錯誤,並且在同一臺計算機上也多次運行相同的結果。
移動到加倍(如果要節省空間,使用浮點只是常見的)。你可能仍然會有一些微小的變化,但相對的幅度會更小。 – 2010-09-30 13:41:28
這是值得仔細檢查你的代碼,以確保你使用盡可能穩定的算法。例如,如果添加兩個總和接近於零的數字(例如,1.000012 +(-1.000006)),則結果將丟失其大部分有效數字。通常通過重新構造數學表達式或僅以更高的精度進行某些中間計算來獲得更好的答案。在獲得應有精度的答案時,您將保留使用浮點數而不是雙精度值的大部分性能優勢。 – 2010-09-30 16:16:46