繁体   English   中英

C ++ DLL浮点确定性

[英]C++ DLL floating-point determinism

相同的C ++ DLL编译能否在不同的计算机上显示不同的浮点结果?

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

可以想象,即使在两台不同的计算机上都运行Windows XP,它们上的同一个DLL也会产生不同的结果。 这些是发生在我身上的原因:

  • 他们可以使用C ++运行时的不同版本(因为它可能是动态链接的)或其他系统dll。
  • 我不知道这有多大可能,但我相信不同的CPU上的浮点运算可能会为ab 2个系列的计算产生足够不同的结果,从而在一台机器上a < b == truea < 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 ++->代码生成中进行更改。

请阅读: Microsoft Visual C ++浮点优化

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM