x86 與x64 之間的浮點算術差異
在Visual Studio 2010 中,x86 與x64 版本之間的浮點算術存在明顯差異當比較某些表達式的值時出現。這種差異體現在以下程式碼:
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;
x86 和 x64 架構以不同的方式處理第二個表達式 bLarger2。在 x86 版本中,bLarger2 計算結果為 true,而在 x64 版本中,它的計算結果為 false。這種差異的根源在於浮點運算中表達式 (a * c) 的計算。
差異起源
差異的根源在於不同的兩種架構使用的浮點單元:x87 用於 x86,SSE 用於 x64。這兩個單位之間的根本區別在於它們的精度。 x87 單元預設採用高於單精度(通常是雙精度)的精度,而 SSE 單元僅以單精度運作。
修正差異
解決差異,可以手動配置 x87 單元的精確度以符合 SSE 單元的精確度。這可以透過執行以下命令在32 位元程式碼中實現:
_controlfp(_PC_24, _MCW_PC);
透過將精度設為單精度,bLarger2 表達式中(a * c) 的計算將與x64 的計算一致構建,導致bLarger1 和bLarger2 都設定為false。
結論
x86 和 x64 構建之間的浮點運算差異源於不同的精度等級x87 和 SSE 浮點單元。透過手動控制 x87 單元的精確度以符合 SSE 單元的精確度,可以消除差異,確保兩種架構的表達式評估一致。
以上是為什麼 Visual Studio 2010 中 x86 和 x64 的浮點運算不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!