具有浮点数的 C++ 程序的输出是可预测的吗?
Is the output of a c++ program with floating point predictable?
我的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;
否
如果计算的准确结果刚好在舍入方向的边界处,则计算之间的任意小差异可能会改变结果。四舍五入会放大计算之间的差异。
如果没有,我还能做些什么来在机器之间实现一致的输出?
- 使用硬件浮点数以外的其他内容。软件浮点或定点运算。 要么使用
- 固定宽度的整数来实现该算术,以便一个系统的精度不会高于另一个系统,要么使用任意精度。
- 如果不使用任意精度,则仅使用其计算顺序由语言定义的表达式,以便编译器之间的差异不会导致不同的错误量。
相关文章:
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- C++浮点数据类型和字符串数据类型无法子到模板函数中
- 使用提升将数据从 PyObject 复制到浮点数 *
- 使用浮点数和双精度数的非常小数字的数学
- 使用英特尔内联函数将打包的 8 位整数乘以浮点数向量
- 如何在 c++ 中将小数点后两位数的浮点数分配给另一个浮点数
- 返回浮点数的小数位数
- 具有浮点数的 C++ 程序的输出是可预测的吗?
- 输出浮点数为三位或更多,以避免指数
- 将 LibSVM 输出转换为浮点数向量
- 如何在没有科学记数法或尾随零的情况下将浮点数输出到 cout
- 浮点数 - 错误的输出
- 在浮点数组上使用mpf_set_ui会停止输出(GMP c++)
- 在c++中使用printf输出浮点数
- 四舍五入浮点数:精确地输出小数点后的两位数字
- 使用stringstream输出一个四舍五入的浮点数
- 输出要调试的浮点数
- 将浮点数打印为小数并修复错误输出
- 两个浮点数相加时的意外输出