具有浮点的c ++程序的输出是否可预测?

时间:2019-04-04 17:15:18

标签: c++ floating-point cross-platform precision

我的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;

?如果没有,我该怎么办才能在机器之间获得一致的输出?

1 个答案:

答案 0 :(得分:2)

  

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

否。

C ++标准几乎不能保证浮点表示。

  

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

cout << setprecision(4) << x;

否。

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

  

如果没有,我该怎么办才能在机器之间获得一致的输出?

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