C ++ DLL的相同编译是否可以在不同的机器上显示不同的浮点结果?
我们的DLL中有一些代码执行<
两个double
的比较。对于一组特定的输入,预期double
s是相等的。当然,<
比较在这种情况下是可疑的,但我们没有想到的是在我们的测试与客户机器的比较中看到不同的结果。
答案 0 :(得分:2)
在两台不同的计算机上使用相同的DLL,即使两台计算机都运行Windows XP,也可能会产生您所看到的不同结果。这些是我发生的原因:
a
和b
的2系列计算产生足够不同的结果a < b == true
在一台计算机上,a < b == false
在另一台计算机上。我过去用来查找应用程序正在使用的DLL的是Dependency Walker。
答案 1 :(得分:1)
是的,浮点实现可能存在差异,导致相等比较失败。
您可以将其归因于未能正确实施IEEE标准,但我可以看到例如在不同的实现中可能使用不同数量的保护数字的情况,因此舍入错误可能不同。应该指出的是,IEEE标准相当严格。
浮点数之间的比较绝不应该使用完全相等。支持一种方法,您可以测试数字在一小部分误差范围内,而不是完全相等。
进一步阅读
What Every Computer Scientist Should Know About Floating Point Arithmetic
答案 2 :(得分:1)
在VS 2003中,MS C ++编译器引入了一种新的浮点优化模型。它为您提供了3个编译器选项:fp:fast; FP:精确; FP:结构。
在fp:strict模式下,编译器从不执行任何扰乱浮点计算精度的优化,所以如果你想要准确度超过速度,你应该使用这个。默认值为fp:precise。您可以更改项目属性 - > C ++ - &gt;代码生成。