我在Visual Studio 2015 c ++ 11中有一个c ++代码。该代码执行
的EXPval = 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计算机。我运行了依赖检查器以检查它们是否链接了不同的dll版本。两者完全相同。
请建议
1)什么会引起这种差异?
2)如何避免这种差异?
3)如果处理器,操作系统,dll是相同的,我仍然可以期望得到不同的结果
答案 0 :(得分:0)
如果您查看Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(30, SECONDS)
.pollingEvery(5, SECONDS)
.ignoring(NoSuchElementException.class);
的IEEE 754二进制格式,则为:53个有效二进制位/ 15.95个有效十进制数字加11个指数位。 (Wiki:https://en.wikipedia.org/wiki/IEEE_754)
这意味着如果您使用显示超过16个有效数字的格式打印double
,则多余的数字可能是垃圾。
并非总是如此,例如,如果数字的指数为-4,%。20f可能会非常准确。
53位精度是最好的情况。在不同数量级上进行操作会丢失精度,例如(1.23 e + 20)+(0.45 e-30)。
double
由于std::cout.precision(20);
的最大精度为16位数字,因此其中可能包含未定义的数字。
此问题的最高答案建议使用17位数字:How do I print a double value with full precision using cout?
注释中的其他注释指向David Goldberg-https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
撰写的每个计算机科学家应了解的浮点算术摘要中的定理15。