【发布时间】:2011-12-12 10:25:05
【问题描述】:
我们正在开发一个 C 中的数值例程库。我们还不确定我们是使用单精度 (float) 还是双精度 (double),因此我们定义了一个类型 SP在我们决定之前作为别名:
typedef float SP;
当我们运行我们的单元测试时,它们都在我的机器(64 位 Ubuntu)上通过,但在我同事的机器(32 位 Ubuntu,被错误地安装在 64 位机器上)上失败。
使用 Git 的 bisect 命令,我们找到了他的机器和我的机器之间开始产生不同结果的确切差异:
-typedef double SP;
+typedef float SP;
换句话说,从双精度到单精度在我们的机器上会产生数值上不同的结果(在最坏的情况下大约有 1e-3 的相对差异)。
我们相当肯定,我们永远不会在任何地方将无符号整数与负符号整数进行比较。
为什么数值例程库会在 32 位操作系统和 64 位系统上产生不同的结果?
澄清
恐怕我还不够清楚:我们有使用双精度的 Git 提交 2f3f671,并且单元测试在两台机器上都同样通过。然后我们有 Git 提交 46f2ba,我们更改为单精度,这里的测试 still 在 64 位机器上通过,但在 32 位机器上 不 .
【问题讨论】:
-
你确定这是操作系统的问题而不是硬件差异?
-
可能是因为这个:stackoverflow.com/questions/1076190/…,(32位代码使用387协处理器,64位代码可能使用sse)
-
nos 是唯一一个做对的人。给出的答案是错误的。
-
鉴于 nos 的评论,您可能应该研究优化选项对代码正确性的影响。 Gcc 有一些处理浮点操作的行为。尝试阅读生成的汇编程序,看看这两种架构之间是否存在显着差异。
标签: c floating-point