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中文網其他相關文章!