【发布时间】:2014-05-07 18:19:55
【问题描述】:
我偶然发现了 MS VS 2010 为 x86 和 x64 构建的浮点运算方式的差异(两者都在同一 64 位机器上执行)。
这是一个简化的代码示例:
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;
布尔值 bLarger1 始终为 false(在两个版本中 d 都设置为 65.0)。 变量 bLarger2 对于 x64 为 false,但对于 x86 为 true!
我非常了解浮点运算和发生的舍入效应。我也知道 32 位有时使用与 64 位构建不同的指令进行浮动操作。但在这种情况下,我遗漏了一些信息。
首先为什么 bLarger1 和 bLarger2 之间存在差异?为什么它只存在于 32 位版本上?
【问题讨论】:
-
我的猜测是 x86 版本为此使用 FPU 寄存器,而 x64 使用 SSE 寄存器。但是您可能需要查看 IL 代码以及机器代码。
-
当然 x86 使用 x87 单元,x64 使用 SSE 单元。但这并不能真正解释差异。他们都应该得到相同的答案。 @Oliver 你能展示你是如何编译代码的吗,因为我的复制尝试失败了。对于我来说,x86 和 x64 的两个布尔值都是
false。 -
这将是
bLarger2的表达式中处理 a*c 的方式。我想它会是一个浮点数和另一个双倍数,或者类似的东西 -
真正的问题是为什么这令人惊讶,完全清楚浮点并不精确。根据编译器、编译器选项等不同,结果可能会有所不同。
-
@PaulMcKenzie 虽然浮点运算不能完全表示所有实数值,但它是可重复且定义明确的。希望不同编译器之间的一致性并非没有道理。
标签: c++ c visual-studio-2010 floating-point 64-bit