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 = dx86 和 x64 架構以不同方式處理第二個表達式 bLarger2。在 x86 版本中,bLarger2 計算結果為 true,而在 x64 版本中,它的計算結果為 false。這種差異的根源在於浮點運算中表達式 (a * c) 的計算。
差異起源
差異的根源在於不同的兩種架構使用的浮點單元:x87 用於 x86,SSE 用於 x64。這兩個單位之間的根本區別在於它們的精度。預設情況下,x87 單元採用高於單精度(通常是雙精度)的精度,而 SSE 單元僅以單精度運作。
修正差異
解決差異,可以手動配置 x87 單元的精度以匹配 SSE 單元的精度。這可以透過執行以下命令在32 位元程式碼中實現:
_controlfp(_PC_24, _MCW_PC);透過將精度設為單精度,對(a * c) 的求值bLarger2表達式將與x64 建構的表達式一致,從而導致bLarger1 和bLarger2 都設定為false.
結論
x86 和x64 版本之間的浮點運算差異源自於x87 和SSE 浮點單元的不同精度等級。透過手動控制 x87 單元的精確度以符合 SSE 單元的精確度,可以消除差異,確保兩種架構的表達式評估一致。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3