首頁 >後端開發 >C++ >為什麼啟用編譯器最佳化後浮點計算會有所不同?

為什麼啟用編譯器最佳化後浮點計算會有所不同?

DDD
DDD原創
2024-11-12 06:48:02312瀏覽

Why do Floating-Point Calculations Differ with Compiler Optimization Enabled?

啟用最佳化後的不同浮點結果:深入了解編譯器行為

在處理浮點運算時,必須了解因編譯器優化而可能出現的細微差別。如提供的程式碼片段所示,不同的最佳化等級可能會在浮點計算的精確度方面產生意想不到的結果。

調查與解釋

程式碼旨在捨入將雙精確度浮點值轉換為指定數字。但是,在 g 中啟用最佳化後,結果會偏離預期輸出。此行為源自於以下事實:Intel x86 處理器內部利用擴充精度(80 位元)進行浮點運算。相反,雙精確度變數通常佔用 64 位元。

停用最佳化 (O0) 時,編譯器將浮點值儲存在記憶體中,確保保留 80 位元精確度。然而,在啟用最佳化 (O1-O3) 的情況下,編譯器透過將值保留在暫存器中來利用處理器的擴展精度。當值最終儲存回記憶體中並從 80 位元精度轉換為 64 位元精度時,此最佳化可能會導致舍入誤差。

解析度選項

緩解對於此問題,建議採用以下解決方案:

  • 利用-ffloat-store GCC選項: 此選項強制編譯器在記憶體中儲存浮點值,防止最佳化導致精確度損失。
  • 使用long double 類型: 這個datatype在gcc平台上佔用80位,無需80位和64位之間的轉換

進一步注意事項:

  • 在x86_64系統上,編譯器會自動使用 SSE 暫存器進行浮點運算,避免擴充精度問題。
  • GCC 提供了-mfpmath 選項來控制編譯器對浮點的處理

關於Visual Studio 2008

關於Visual Studio 2008

關於Visual Studio 2008令人好奇的是,即使在Visual Studio 2008 中啟用了/fp:fast最佳化,程式碼也會產生正確的結果證明了編譯器在這種情況下的可靠性。雖然通常建議對 g 使用 -float-store 選項,但 Visual Studio 2008 似乎可以更有效地處理此問題。

以上是為什麼啟用編譯器最佳化後浮點計算會有所不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn