繁体   English   中英

Visual Studio 2015 EXP结果有所不同

[英]visual studio 2015 exp results differ

我在Visual Studio 2015 c ++ 11中有一个c ++代码。 该代码执行EXP

val = 7.3526137268510955991

double myCalulatedEXP= EXP(val);
//Lets print
std::cout.precision(20);
std::cout<<myCalulatedEXP;

在一台机器上,我得到1560.26932075301515 3359,而在另一台机器上,我得到1560.269320753015 1085看到最后4位数字不匹配,这给我造成了麻烦。 尽管差异很小,但以后会相乘并相加较大。

两台机器具有相同的处理器标识符。

PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 63 Stepping 2, GenuineIntel

两台机器通过以下方式具有相同的操作系统

 `systeminfo | findstr /B /C:"OS Name" /C:"OS Version"`


OS Name:                   Microsoft Windows Server 2012 R2 Standard
OS Version:                6.3.9600 N/A Build 9600

两者都是Windows Server 2012计算机。 我运行了依赖检查器以检查它们是否链接了不同的dll版本。 两者完全相同。

请建议

1)什么会引起这种差异?

2)如何避免这种差异?

3)如果处理器,操作系统,dll相同,我仍然可以期待不同的结果

如果您查看IEEE 754二进制格式的double精度格式,则为:53个有效二进制位/ 15.95个有效十进制数字加11个指数位。 (维基: https//en.wikipedia.org/wiki/IEEE_754

这意味着,如果使用显示多于16位有效数字的格式打印double精度数字,则多余的数字可能是垃圾。

并非总是如此,例如,如果数字的指数为-4,%。20f可能会非常准确。

53位精度是最好的情况。 在不同数量级上的操作链可能会失去准确性,例如(1.23 e + 20)+(0.45 e-30)。

std::cout.precision(20);

由于double精度数的最大精度为16位,因此可能包括未定义的数字。

这个问题的最高答案建议使用17位数字: 如何使用cout打印全精度的双精度值?

注释中的其他注释指向David Goldberg- https: //docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg撰写的《每位计算机科学家应该了解的浮点算术摘要》摘要中的定理15。 html的

暂无
暂无

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

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