提问人:zoran 提问时间:7/10/2018 更新时间:9/9/2018 访问量:87
为什么针对任何 CPU 的 Visual Studio 生成在 32 位和 64 位操作系统上提供不同的浮点结果?
Why does Visual Studio build for Any CPU gives different floating point results on 32bit and 64bit OS?
问:
我编写了一个 C# 应用程序来执行复杂的计算(测量的最小二乘调整)。我使用 Visual Studio 中的任何 CPU 配置构建了此应用。一切都运行良好,直到我收到一封电子邮件,指出在一个特定情况下,在 2 台不同的 PC 上有不同的结果。经过一些调试,我发现与 32 位操作系统相比,使用 64 位操作系统的应用程序的结果略有错误(小数点后第 12 位)。在那个特定情况下,最终结果相差甚远,因为它表明错误的测量没有通过测试。
然后,我构建了该应用程序的 2 个版本,32 位和 64 位,两个版本都按预期工作并给出相同的结果。
所以现在我想了解“引擎盖”下发生了什么,任何 CPU 版本执行浮点计算的方式怎么可能与 32 位和 64 位构建不同?优化代码选项一直处于关闭状态。
答:
我在这里的第一篇帖子。 我想我必须向所有对此事感兴趣的人展示一些东西,与佐兰发布的内容完全相关。
简单地写下这段代码:
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 精确。 “精确”这个词非常“柔和”和“温柔”。 我巧妙地将这个命名为“真正的错误”,它只是非常不可接受的问题。 确实如此。
评论
float
double