具有浮点数的 C++ 程序的输出是可预测的吗?

Is the output of a c++ program with floating point predictable?

本文关键字:输出 浮点数 C++ 程序      更新时间:2023-10-16

我的C++程序计算一些浮点数x并打印出来:

cout << x;

对我来说,所有计算机的输出都相同很重要。由于"全部"非常宽泛,让我们关注以下内容:

G++ 6/
  • 7/8、CLang++ 5/6 中的不同编译器;
  • 不同的 Linux 系统 - Ubuntu 16.04/18.04;
  • 独立 Linux 与 Windows 子系统 Linux;
  • 不同的硬件 - 英特尔与AMD具有不同的规格。

在上述所有组合中,输出是否保证相同?

如果没有,我可以通过降低精度来保证相同的输出,例如:

cout << setprecision(4) << x;

?如果没有,我还能做些什么来在机器之间实现一致的输出?

是否保证上述所有组合的输出都相同?

不。

C++标准很少保证浮点表示。

我可以通过降低精度来保证相同的输出,例如:

cout << setprecision(4) << x;

如果计算的准确结果刚好在舍入方向的边界处,则计算之间的任意小差异可能会改变结果。四舍五入会放大计算之间的差异。

如果没有,我还能做些什么来在机器之间实现一致的输出?

  • 使用硬件浮点数以外的其他内容。软件浮点或定点运算。
  • 要么使用
  • 固定宽度的整数来实现该算术,以便一个系统的精度不会高于另一个系统,要么使用任意精度。
  • 如果不使用任意精度,则仅使用其计算顺序由语言定义的表达式,以便编译器之间的差异不会导致不同的错误量。