首頁  >  文章  >  後端開發  >  為什麼 MS VS 2010 中 x86 和 x64 版本的浮點運算結果不同?

為什麼 MS VS 2010 中 x86 和 x64 版本的浮點運算結果不同?

Patricia Arquette
Patricia Arquette原創
2024-10-31 19:36:02643瀏覽

Why Do Floating-Point Arithmetic Results Differ Between x86 and x64 Builds in MS VS 2010?

MS VS 2010 中x86 與x64 之間的浮點算術差異

在Microsoft Visual Studio 2010 中,浮點運算出差異在x86 和x64 版本之間,即使在同一64 位元電腦上執行也是如此。這在以下程式碼片段中很明顯:

<code class="c++">float a = 50.0f;
float b = 65.0f;
float c =  1.3f;
float d = a*c;
bool bLarger1 = d < b;
bool bLarger2 = (a*c) < b;</code>

布林變數 bLarger1 始終為 false,在兩個版本中 d 均設定為 65.0。但是,bLarger2 對於 x64 為 false,但對於 x86 為 true。

罪魁禍首:x87 與SSE

差異源自x86 建構使用x87 的事實浮點單元(FPU),而x64 版本則使用流SIMD 擴充(SSE ) 單元。差異在於計算的精度。

x87 FPU 預設以雙精確度執行計算,即使在處理單精確度值時也是如此。另一方面,SSE 單元以純單精度執行計算。因此,x87 計算比 SSE 計算稍微準確一些。

在這種情況下,x87 FPU 提高的精確度會導致舍入誤差,導致 d 略小於 65.0。這使得 bLarger2 對於 x86 為 false。相較之下,x64 中的 SSE 計算會產生更精確的 d 值,從而得出 bLarger2 的真實值。

x86 的解決方法

強制x86 建構要以單精確度執行計算,可以加入以下行:

<code class="c++">_controlfp(_PC_24, _MCW_PC);</code>

這設定浮點控製字以單精度執行所有計算。透過此更改,對於 x86 和 x64 版本,bLarger1 和 bLarger2 都將設定為 false。

結論

x86 與 x64 之間浮點運算的差異MS VS 2010 中的建構源自於 x87 FPU 與 SSE 單元之間的差異。與 SSE 單元真正的單精度計算相比,x87 FPU 的精度更高,導致值略有不同。透過在 x86 上強制執行單精度計算,開發人員可以緩解此問題並確保在不同平台上獲得一致的結果。

以上是為什麼 MS VS 2010 中 x86 和 x64 版本的浮點運算結果不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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