2014-06-11 46 views
0

C++ DLL的相同编译可以在不同的机器上显示不同的浮点结果吗?C++ DLL浮点确定性

我们在我们的DLL中有一些代码,它执行两个double<比较。对于一组特定的输入,预计这些输入是相等的。当然,在这种情况下,比较是可疑的,但我们没有想到的是在我们的测试与客户机器的比较中看到不同的结果。

+0

有什么可疑的?如果你有'double a = foo(),b = a;',那么它保证'a == b' ... –

+0

我的意思是,这是可疑的,虽然这两个'双'预计是相同的,它们是不同计算的结果,所以在浮点方面它们不可能在精确的'=='意义上相等。 – atkins

+0

我认为你需要更清楚一点。 **第一**你提到DLL意味着MS Windows,是真的,哪个版本? **第二**通过相同的编译你是否意味着你将DLL从一台机器复制到另一台机器上? ** 3rd **你在使用什么编译器? –

回答

2

2个不同的计算机相同的DLL即使两者都运行Windows XP可以想见,产生你所看到的不同的结果。这些是我想到的原因:

  • 他们可以使用不同版本的C++运行时(因为它可能是动态链接的)或其他系统dll。
  • 我不知道该怎么可能,这是但我认为,在不同的CPU的浮点运算可以产生不同的结果足以为2系列a计算和b这样a < b == true一台机器上,并a < b == false另一个。

我在过去用来找出应用程序使用的DLL是Dependency Walker

+0

谢谢,迈克 - 事实上,你的第一个理由似乎是最可能的。你有什么想法,我可以如何确定(即如何检查在特定的执行环境中链接到哪些C++运行时)? – atkins

+1

我编辑了答案,以包含我以前使用的依赖(依赖关系漫步者)工具的链接。 –

1

是的,浮点实现可能存在差异,足以导致相等比较失败。

您可以将其归因于未能正确实施IEEE标准,但我可以看到情况,例如,不同实施中可能使用不同数量的保护数字,因此舍入错误可能会不同。但应该指出的是,IEEE标准相当严格。

浮点数之间的比较不应该使用精确的相等。赞成一种方法,您可以在小范围的错误范围内测试数字,而不是严格的相等。

进一步阅读
What Every Computer Scientist Should Know About Floating Point Arithmetic

+0

我认为在某些情况下比较浮点数的平等是完全合理的。 'a = b/c + d; a1 = b/c + d;在'a == a1'中有更好的结果,换句话说,对完全相同的值完全相同的操作序列最好产生完全相同的结果。 (不是仅在单台机器上执行相同流程的编译器或机器)。 –

+0

我想我的问题是:在我描述的情况下(即部署在不同机器上的完全相同的DLL),我可能在这两种环境中使用不同的浮点实现。这更多的是关于Microsoft DLL的问题,而不是浮点运算本身。 – atkins

1

在VS 2003中,MS C++编译器引入了新的浮点优化模型。它提供了3个编译器选项:fp:fast; FP:精确; FP:结构。

在fp:strict模式下,编译器从不执行任何扰乱浮点计算精度的优化,所以如果您希望精度超过速度,则应该使用这一优化。默认的是fp:precise。您可以在项目属性 - > C++ - >代码生成中进行更改。

请看下面的内容:Microsoft Visual C++ Floating-Point Optimization

+0

这可能是最可能的原因。 –

+0

我目前无法检查我们设置了哪种模式,但我不确定这是否可以解释如何在不同的机器上执行时从同一个编译的二进制文件中获得不同的结果? – atkins