Visual Studio 2015 EXP结果有所不同
visual studio 2015 exp results differ
我在Visual Studio 2015 c++11中有一个c ++代码。 该代码执行
val = 7.3526137268510955991
double myCalulatedEXP= EXP(val);
//Lets print
std::cout.precision(20);
std::cout<<myCalulatedEXP;
在一台机器上,我得到1560.2693207530153359,在另一台机器上,我得到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的《每个计算机科学家都应该知道的关于浮点算术的摘要中的定理15 - https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- valgrind-hellgrind与泄漏检查的结果不同
- 用C++20 fmt限制结果的总大小
- 如何返回一个类的两个对象相加的结果
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 序列化,没有库的整数,得到奇怪的结果
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 在更改for循环的第三部分后,未使用for循环结果
- 使用++运算符会导致意外的结果
- 为什么在逗号分隔符上下文中将预增量的结果强制转换为void
- C++Brute Force攻击函数不会返回结果
- GCC和Clang在与__builtin_constant_p相关的static_assert方面有所不同
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- Visual Studio 2015 EXP结果有所不同
- 当我有iostream和没有iostream时,结果会有所不同,但没有错误
- 来自 Boost.Asio 解析器的结果有所不同
- 如果在 SQUARE 宏中传递前缀变量,为什么结果会有所不同
- 相同的正则表达式搜索结果在C++和Java中有所不同