我正在爲Fortran 90中的多維優化編程BFGS算法的一個版本。我已經編寫了代碼,在我的筆記本電腦(運行Windows Vista)上將它編譯爲gfortran,並且工作正常。但是,當我嘗試在運行Linux 6的服務器上使用相同的代碼時,它會產生不正確的結果。它是完全相同的代碼,它編譯得很好,它產生的結果是錯誤的。也就是說,它似乎在算法的某個早期階段開發了一個浮點運算錯誤,並且在開始生成NaN之前僅產生一行數字結果。我只能假定它是關於服務器環境的,但我怎麼才能知道它是什麼以及我該如何糾正我的代碼?爲什麼我的數值算法在兩臺不同的機器上表現不同?
0
A
回答
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兩個例子,一個示出了問題,並且沒有該問題的糾正例如不正確,例如:
「本代碼可以由與用於內部添加整數代替浮點數字是固定的浮標打印結果和操作的方式時,當僅使用該計算平均值「。
相關問題
- 1. 爲什麼listFiles()在不同的平臺中表現不同?
- 2. 的clientid在兩臺不同的機器
- 3. 爲什麼C#表現不同的兩個int數組語法
- 4. C#:爲什麼我的SqlDateTime.MinValue在不同的機器上有所不同?
- 5. 爲什麼ServicePointManager.SecurityProtocol默認值在不同的機器上有所不同?
- 6. 爲什麼同一路由器上的兩臺機器上的IP地址有不同的子網?
- 7. 爲什麼Java Swing在不同系統上表現不同?
- 8. 爲什麼這個約束在不同的模擬器上表現不同?
- 9. Python 2.7.10在兩臺不同的計算機上運行代碼不同
- 10. IE 8在不同的機器上表現不同
- 11. java normalizer在不同的機器上表現不同
- 12. Docker鏡像在不同的機器上表現不同
- 13. fscanf()在不同的機器上表現不同
- 14. Phpunit在不同的機器上表現不同
- 15. mongorestore在不同的機器上表現不同?
- 16. 爲什麼我不能連接2臺計算機使用不同的網絡
- 17. 爲什麼psycopg2佔位符在不同的Linux機器上的行爲不同?
- 18. 爲什麼time()函數在不同的服務器上返回不同的值?
- 19. nhibernate在兩臺不同的機器上爲同一個源生成兩個不同的查詢
- 20. 爲什麼WMI爲同一臺計算機返回不同的結果?
- 21. 爲什麼WPF在不同版本的Windows上呈現不同?
- 22. Tomcat的不同機器上的表現不同
- 23. 在兩臺不同的機器上產生不同結果的Webcrawling腳本
- 24. SQLDescribeCol在兩臺不同的機器上給出不同的列大小?
- 25. Varnish在不同的瀏覽器上行爲不同,爲什麼?
- 26. 爲什麼我的JButton看起來不同於不同的計算機?
- 27. 爲什麼我有不同的機器上
- 28. Oracle的NCHR()函數在不同平臺上表現不同。怎麼修?
- 29. 爲什麼MethodBody.GetILAsByteArray在不同的平臺上返回不同的數組?
- 30. 爲什麼ifstream read()在兩個不同的程序中表現不同?
你看過[程序員應該知道什麼關於浮點算術](http://floating-point-gui.de)嗎? –
我熟悉浮點運算的基礎知識,並且我認爲我的代碼至少在運行時設計得很好,併爲我的筆記本電腦上的測試最小化問題提供了正確的結果。我的問題是關於代碼在不同平臺上執行不同的表現我不明白爲什麼我的代碼在windows上而不是在linux上。它在兩個平臺上都是用gfortran編譯的。 –
一個常見問題是在一個環境中編譯帶有調試信息的代碼,然後在另一個環境中編譯沒有調試信息的代碼。如果您的對象或數組在調試版本中寫入超出其極限,那麼它只會寫入調試信息並且不會影響代碼的運行。你可以用調試信息編譯這兩個文件,並看看它是如何發生的 – kermit