2014-10-07 134 views
1

在MSVC发布模式和调试模式下,双精度处理的精度值在小数点后出现差异。在发布模式/调试模式下双精度的差异

Ex - 注意: - Double dataFilled; 1)日志(dataFilled)==>的#include

Debug Mode dataFilled =96.1588665998339850 
Release Mode dataFilled =96.1588665998339420 

Intended value is 96.1588665998339850 

能有人可以请指导我,为什么我得到的发布和调试不同的值。

+2

如果你[提供的代码](http://stackoverflow.com/help/mcve) – 2014-10-07 13:17:50

+0

会有帮助,因为发布和调试模式使用不同的分配器? – mpacheco 2014-10-07 13:22:56

回答

1

双精度浮点数的IEEE二进制表示仅适用于15位十进制数字。您正在打印18.它看起来像两个结果不同的最低显着尾数位(53)的值。这种差异很容易由操作顺序的差异或两种构建配置之间的中间结果的处理产生。

如果你真的需要尽可能多的精度,那么你需要查看一个任意精度的数学库。否则,请接受您的机器的本机浮点算法不精确(因为所有机器必须是)。在计算机上执行极端精确算术可能需要很多工作。

作为一个解决方法,VS可能会有一些构建选项,您可以在Release版本中对其进行浮点处理,更像调试版本(可能会导致性能降低)。但是使用这种选择只是一个绷带。你真的应该使用一种计算方法,你可以依靠它来获得你所需要的精度而不需要任何技巧。

+0

如果这是关于自动化测试,那么在大多数情况下,测试浮点计算的确切值是错误的。您应该测试计算结果是否在预期值的可接受增量范围内。 – 2014-10-07 13:42:57