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