2012-12-14 37 views
0

我正在爲Fortran 90中的多維優化編程BFGS算法的一個版本。我已經編寫了代碼,在我的筆記本電腦(運行Windows Vista)上將它編譯爲gfortran,並且工作正常。但是,當我嘗試在運行Linux 6的服務器上使用相同的代碼時,它會產生不正確的結果。它是完全相同的代碼,它編譯得很好,它產生的結果是錯誤的。也就是說,它似乎在算法的某個早期階段開發了一個浮點運算錯誤,並且在開始生成NaN之前僅產生一行數字結果。我只能假定它是關於服務器環境的,但我怎麼才能知道它是什麼以及我該如何糾正我的代碼?爲什麼我的數值算法在兩臺不同的機器上表現不同?

+0

你看過[程序員應該知道什麼關於浮點算術](http://floating-point-gui.de)嗎? –

+0

我熟悉浮點運算的基礎知識,並且我認爲我的代碼至少在運行時設計得很好,併爲我的筆記本電腦上的測試最小化問題提供了正確的結果。我的問題是關於代碼在不同平臺上執行不同的表現我不明白爲什麼我的代碼在windows上而不是在linux上。它在兩個平臺上都是用gfortran編譯的。 –

+0

一個常見問題是在一個環境中編譯帶有調試信息的代碼,然後在另一個環境中編譯沒有調試信息的代碼。如果您的對象或數組在調試版本中寫入超出其極限,那麼它只會寫入調試信息並且不會影響代碼的運行。你可以用調試信息編譯這兩個文件,並看看它是如何發生的 – kermit

回答

1

問題這裏描述(CERT.org):FLP00-C. Understand the limitations of floating point numbers

這樣做的原因行爲是Linux使用的x87浮點單元的內部擴展精度模式(FPU )在IA-32機器上,以提高計算精度。當結果通過賦值給c存儲到內存中時,FPU自動將結果舍入爲double。現在從內存中讀回的值現在可以與內部表示不相等地進行比較,這具有更高的精度。 Windows不使用擴展精度模式,因此所有計算都以雙精度完成,並且存儲在內存中的值與FPU內部的值之間的精度沒有差異。對於GCC,在優化級別1或更高編譯消除了不必要的存儲到存儲器中,因此,所有計算的FPU內情況與擴展精度

這裏描述的解決方案:FLP02-C. Avoid using floating point numbers when precise computation is needed兩個例子,一個示出了問題,並且沒有該問題的糾正例如不正確,例如:

「本代碼可以由與用於內部添加整數代替浮點數字是固定的浮標打印結果和操作的方式時,當僅使用該計算平均值「。

相關問題