啟用最佳化後的不同浮點結果:深入了解編譯器行為
在處理浮點運算時,必須了解因編譯器優化而可能出現的細微差別。如提供的程式碼片段所示,不同的最佳化等級可能會在浮點計算的精確度方面產生意想不到的結果。
調查與解釋
程式碼旨在捨入將雙精確度浮點值轉換為指定數字。但是,在 g 中啟用最佳化後,結果會偏離預期輸出。此行為源自於以下事實:Intel x86 處理器內部利用擴充精度(80 位元)進行浮點運算。相反,雙精確度變數通常佔用 64 位元。
停用最佳化 (O0) 時,編譯器將浮點值儲存在記憶體中,確保保留 80 位元精確度。然而,在啟用最佳化 (O1-O3) 的情況下,編譯器透過將值保留在暫存器中來利用處理器的擴展精度。當值最終儲存回記憶體中並從 80 位元精度轉換為 64 位元精度時,此最佳化可能會導致舍入誤差。
解析度選項
緩解對於此問題,建議採用以下解決方案:
進一步注意事項:
關於Visual Studio 2008
關於Visual Studio 2008
關於Visual Studio 2008令人好奇的是,即使在Visual Studio 2008 中啟用了/fp:fast最佳化,程式碼也會產生正確的結果證明了編譯器在這種情況下的可靠性。雖然通常建議對 g 使用 -float-store 選項,但 Visual Studio 2008 似乎可以更有效地處理此問題。以上是為什麼啟用編譯器最佳化後浮點計算會有所不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!