为什么针对任何 CPU 的 Visual Studio 生成在 32 位和 64 位操作系统上提供不同的浮点结果?

Why does Visual Studio build for Any CPU gives different floating point results on 32bit and 64bit OS?

提问人:zoran 提问时间:7/10/2018 更新时间:9/9/2018 访问量:87

问:

我编写了一个 C# 应用程序来执行复杂的计算(测量的最小二乘调整)。我使用 Visual Studio 中的任何 CPU 配置构建了此应用。一切都运行良好,直到我收到一封电子邮件,指出在一个特定情况下,在 2 台不同的 PC 上有不同的结果。经过一些调试,我发现与 32 位操作系统相比,使用 64 位操作系统的应用程序的结果略有错误(小数点后第 12 位)。在那个特定情况下,最终结果相差甚远,因为它表明错误的测量没有通过测试。

然后,我构建了该应用程序的 2 个版本,32 位和 64 位,两个版本都按预期工作并给出相同的结果。

所以现在我想了解“引擎盖”下发生了什么,任何 CPU 版本执行浮点计算的方式怎么可能与 32 位和 64 位构建不同?优化代码选项一直处于关闭状态。

C# 生成 浮动精度

评论

0赞 TomTom 7/10/2018
什么CPU?我记得很久以前有特定的 CPU 在浮点方面存在问题,不知何故,含糊不清。
1赞 Sergei Zinovyev 7/10/2018
如果你正在谈论,那么你需要做好准备,同样的操作可能会产生略有不同的结果。floatdouble
0赞 zoran 7/10/2018
我认为在这种特定情况下,这并不重要。我在 i7-4770 上安装了 32 位和 64 位 Windows 7,但错误仍然存在。
0赞 Polyfun 7/10/2018
请参阅 floating-point-gui.de“每个程序员都应该了解的浮点运算知识”。
1赞 TomTom 7/11/2018
我知道,但这非常具体,看起来像一个错误,所以核心开发人员真的应该去哪里。这与其说是“我有一个编程”,不如说是一个“我认为我有一个错误”的场景。

答:

0赞 bgguy 9/9/2018 #1

我在这里的第一篇帖子。 我想我必须向所有对此事感兴趣的人展示一些东西,与佐兰发布的内容完全相关。

简单地写下这段代码:

float a = -0.003124237f;
float b =  0.009375687f;
float c = 88.4625f;
float abc = a + b + c;
float cab = c + a + b;

然后进行 2 次测试,使用 x86 和 x64 构建 在这两个测试中,都要注意“abc”和“cab” 看到什么了吗? 嗯,我愿意。这必须命名为“bug”。不是程序错误,我猜这是 CPU 深处的错误。 真正了解的人可能会帮助我们更多地了解这个问题。 提前致谢,并感谢 zoran 在这里打开了类似的问题发布。

(对于那些太忙而无法测试我的“代码”的人,这里是我的结果:

x86的: ABC = CAB = 88.46875

x64的: abc = 88.46875,但是..... 驾驶室 = 88.46876

换句话说,x64 的计算速度不如 x86 builder 精确。 “精确”这个词非常“柔和”和“温柔”。 我巧妙地将这个命名为“真正的错误”,它只是非常不可接受的问题。 确实如此。

评论

0赞 bgguy 9/9/2018
这里根本没有答案。请看我的观点,为什么构建 x64 给出不正确的计算,所以你能回答这个问题吗?