c++ - Visual Studio 2015 exp 结果不同
问题描述
我在 Visual Studio 2015 c++11 中有一个 c++ 代码。代码做EXP
val = 7.3526137268510955991
double myCalulatedEXP= EXP(val);
//Lets print
std::cout.precision(20);
std::cout<<myCalulatedEXP;
在一台机器上我得到 1560.269320753015 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 机器。我运行了dependency walker 来检查它们是否链接了不同的dll 版本。两者完全相同。
请建议
1)什么会导致这种差异?
2)我怎样才能避免这种差异?
3) 如果处理器、操作系统、dll 相同,我还能期待不同的结果吗
解决方案
如果您查看 IEEE 754 二进制格式,double
它是:53 个有效二进制位 / 15.95 个有效十进制数字加上 11 个指数位。(维基:https ://en.wikipedia.org/wiki/IEEE_754 )
这意味着如果您double
使用显示超过 16 个有效数字的格式打印,多余的数字可能是垃圾。
并非总是如此,例如,如果数字的指数为 -4,则 %.20f 可能完全准确。
53 位精度是最好的情况。对不同数量级数的一系列操作可能会失去准确性,例如 (1.23 e+20) + (0.45 e-30)。
std::cout.precision(20);
由于 adouble
的最大精度为 16 位,因此可能包括未定义的数字。
这个问题的最佳答案建议使用 17 位数字:How do I print a double value with full precision using cout?
评论中的其他注释指出了David Goldberg 撰写的What Every Computer Scientist Should Know About Floating-Point Arithmetic的摘要中的定理 15 - https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg .html
推荐阅读
- python - 如何将数组指针传递给 Numba 函数?
- node.js - NPM 依赖关系 - Git Repo 中的文件夹?
- azure - Azure k8s worknode/master node with redhat OS
- python - 从角度数据创建箭袋图(matplotlib)
- jquery - 我不明白 [0].selectedIndex 中的“0”
- python - 从另一个数据框中有选择地替换数据框中的值
- python - AttributeError:模块“yfinance”没有属性“下载”
- java - 循环图像移位(翻译)
- preg-match - 不推荐使用 ereg 函数,如何更新到 preg_match?:
- r - 在R中,可以从相应的代码中估算字符串,反之亦然?