[英]C++ DLL floating-point determinism
相同的C ++ DLL编译能否在不同的计算机上显示不同的浮点结果?
我们的DLL中有一些代码执行两个double
的<
比较。 对于一组特定的输入,这些double
应相等。 当然,在这种情况下, <
比较是可疑的,但是我们没想到的是,在我们的测试与客户端计算机的比较中看到了不同的结果。
可以想象,即使在两台不同的计算机上都运行Windows XP,它们上的同一个DLL也会产生不同的结果。 这些是发生在我身上的原因:
a
和b
2个系列的计算产生足够不同的结果,从而在一台机器上a < b == true
和a < b == false
另一个a < b == false
。 我过去用来确定应用程序正在使用哪些DLL的是Dependency Walker 。
是的,浮点实现中的差异可能足以引起相等比较失败。
您可以将其归因于未能正确实现IEEE标准,但是我看到了这样的情况,例如,在不同的实现中可能使用了不同数量的保护数字,因此舍入误差可能有所不同。 但是应该注意,IEEE标准相当严格。
浮点数之间的比较绝不能使用完全相等。 支持一种方法,您可以测试数字是否在很小的误差范围内,而不是完全相等。
进一步阅读
每个计算机科学家都应该了解的浮点运算法则
在VS 2003中,MS C ++编译器引入了用于浮点优化的新模型。 它为您提供3个编译器选项:fp:fast; fp:precise; fp:struct。
在fp:strict模式下,编译器从不执行任何会干扰浮点计算精度的优化,因此,如果您希望精度高于速度,则应使用此优化。 默认值是fp:precise。 您可以在项目属性-> C ++->代码生成中进行更改。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.