【发布时间】:2019-04-04 17:15:18
【问题描述】:
我的 C++ 程序计算一些浮点数 x 并打印出来:
cout << x;
对我来说重要的是所有计算机的输出都相同。由于“所有”的含义非常广泛,所以让我们重点关注以下内容:
- g++ 6/7/8、clang++ 5/6 中的不同编译器;
- 不同的 Linux 系统 - Ubuntu 16.04/18.04;
- 独立 Linux 与 Windows 子系统 Linux;
- 不同的硬件 - Intel 与 AMD 的不同规格。
上述所有组合的输出是否保证相同?
如果不是,我可以通过降低精度来保证相同的输出,例如:
cout << setprecision(4) << x;
?如果没有,我还能做些什么来在机器之间获得一致的输出?
【问题讨论】:
-
printfwith %.xf -
浮点数学就是要快速。获得精确指定的结果并不快。 Java 试图要求所有实现对
double使用 IEEE 64 位浮点;严重的用户反抗,因为它太慢了(英特尔硬件针对 80 位计算进行了调整,而 64 位双精度数扩大到 80 位进行计算),Java 现在有没有人使用的“严格”数学,以及严肃的普通数学FP 的人使用。 -
@Erel 我认为不能保证 跨平台 获得一致的结果,但这最终取决于浮点值的表示方式底层 FPU 架构。结论:永远不要依赖一致的 FP 表示。请改用 epsilon 近似。
-
这个问题是关于
cout是否保证在所有这些不同的系统上每次都以完全相同的方式打印完全相同的float,还是这个问题包括x是否会被计算出来的所有值都完全相同?如果是后者,我们必须知道x是如何计算的。但是,我已经可以告诉你,在这种情况下,答案几乎肯定是:不。
标签: c++ floating-point cross-platform precision