为什么在特定的Visual Studio 2008项目中错误地添加了双精度?

use*_*446 5 c++ visual-studio-2008 visual-studio visual-c++

试图将Java代码移植到C++我偶然发现了一些奇怪的行为.我无法获得双重工作(即使编译器选项/ fp:strict,这意味着在Visual Studio 2008中设置了"正确的"浮点数学).

double a = 0.4;
/* a: 0.40000000000000002, correct */

double b = 0.0 + 0.4;
/* b: 0.40000000596046448, incorrect
(0 + 0.4 is the same). It's not even close to correct. */

double c = 0;  
float f = 0.4f;  
c += f;
/* c: 0.40000000596046448 too */
Run Code Online (Sandbox Code Playgroud)

在一个不同的测试项目中,我设置它工作正常(/ fp:strict表现符合IEEE754).

使用Visual Studio 2008(标准),无优化,FP:严格.

有任何想法吗?它是真的截断浮动?这个项目在java和C++方面确实需要相同的行为.我通过VC++中的调试窗口读取了所有值.

解决方案: _fpreset(); //巴里凯利的想法解决了它.库正在将FP精度设置为低.

Bar*_*lly 8

我唯一能想到的是你可能正在链接一个通过控制字修改了CPU精度的库或DLL.

你有没有打过电话_fpreset(),从float.h有问题的计算过吗?