【问题标题】:Why does Visual Studio build for Any CPU gives different floating point results on 32bit and 64bit OS?为什么 Visual Studio 为 Any CPU 构建会在 32 位和 64 位操作系统上给出不同的浮点结果?
【发布时间】:2018-12-18 12:41:50
【问题描述】:

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

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

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

【问题讨论】:

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

标签: c# build precision floating-accuracy


【解决方案1】:

我第一次在这里发帖。 我想我必须向所有对此事感兴趣的人展示一些与 zoran 发布的内容完全相关的内容。

简单地说,写下这段代码:

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” 看到了什么? 好吧,我愿意。这必须命名为“错误”。不是程序错误,我猜它是 CPU 深处的错误。 有真正了解的人可能会帮助我们更多地了解这个问题。 在此先感谢,并感谢 zoran 在这里发布了类似的问题。

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

x86: abc = cab = 88.46875

x64: abc = 88.46875,但是...... 出租车 = 88.46876

换句话说,x64 无法像 x86 builder 那样精确计算。 “精确”这个词非常“柔和”和“温柔”。 我老实说这个“真正的错误”,它只是非常不可接受的问题。 确实。)

【讨论】:

  • 这里根本没有答案。请看我的观点,为什么 build x64 给出的计算不正确,你能回答这个问题吗?
猜你喜欢
  • 2014-01-22
  • 2015-09-26
  • 2011-12-18
  • 2010-10-05
  • 2017-06-05
  • 2012-12-02
  • 1970-01-01
  • 2013-10-31
  • 1970-01-01
相关资源
最近更新 更多