首页  >  文章  >  后端开发  >  为什么 Visual Studio 2010 中 x86 和 x64 的浮点运算不同?

为什么 Visual Studio 2010 中 x86 和 x64 的浮点运算不同?

Barbara Streisand
Barbara Streisand原创
2024-11-01 05:04:27181浏览

Why does floating-point arithmetic differ between x86 and x64 in Visual Studio 2010?

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn