gcc 和 Ubuntu 上的舍入不正确
Incorrect rounding on gcc and Ubuntu
我目前正在将一些代码从 Windows 移植到 Linux (Ubuntu) 从 MS VS2008 编译器到 GCC。
问题是以下代码有不同的结果:
double d = 19.53125;
std::cout.precision(4);
std::cout.setf(std::ios::fixed);
std::cout << d << std::endl;
Windows output: 19.5313
Linux output: 19.5312
如果我将精度设置为 5,输出是相同的。
我预计 19.53125 将四舍五入为 19.5313。
有什么关于如何获得所需舍入行为的建议吗?
注意:Windows 代码在 Windows 10 笔记本电脑上本地运行,Linux 代码在 64 位 Ubuntu 18.04 LTS VM 中运行。
Bankers Rounding 是一种将数量四舍五入为整数的算法,其中与最接近的两个整数等距的数字四舍五入为最接近的偶数。因此,0.5 向下舍入为 0; 1.5 取整为 2.
GCC C++ 标准库应用 Bankers Rounding。 19.53125 -> 19.5312,因为 2 是最接近的偶数。
有关 C 的其他信息,但 C++ 尊重 C 舍入:C++ Rounding behavior consistency for ties with sprintf
这让我大开眼界。感谢所有链接。
由于我无法找到一种方法来影响 printf 函数中的舍入行为,因此我没有看到使用数学舍入函数的另一种解决方案。
以下解决方案对我仍然有效:
double d = 19.53125;
int precision p = 4;
double factor = pow(10.0, p);
std::cout.precision(p);
std::cout.setf(std::ios::fixed);
std::cout << round(d * factor) / factor << std::endl;
Windows output: 19.5313
Linux output: 19.5313
链接:
- https://www.exploringbinary.com/inconsistent-rounding-of-printed-floating-point-numbers/
- Why printf round floating point numbers?
我目前正在将一些代码从 Windows 移植到 Linux (Ubuntu) 从 MS VS2008 编译器到 GCC。
问题是以下代码有不同的结果:
double d = 19.53125;
std::cout.precision(4);
std::cout.setf(std::ios::fixed);
std::cout << d << std::endl;
Windows output: 19.5313
Linux output: 19.5312
如果我将精度设置为 5,输出是相同的。
我预计 19.53125 将四舍五入为 19.5313。
有什么关于如何获得所需舍入行为的建议吗?
注意:Windows 代码在 Windows 10 笔记本电脑上本地运行,Linux 代码在 64 位 Ubuntu 18.04 LTS VM 中运行。
Bankers Rounding 是一种将数量四舍五入为整数的算法,其中与最接近的两个整数等距的数字四舍五入为最接近的偶数。因此,0.5 向下舍入为 0; 1.5 取整为 2.
GCC C++ 标准库应用 Bankers Rounding。 19.53125 -> 19.5312,因为 2 是最接近的偶数。
有关 C 的其他信息,但 C++ 尊重 C 舍入:C++ Rounding behavior consistency for ties with sprintf
这让我大开眼界。感谢所有链接。 由于我无法找到一种方法来影响 printf 函数中的舍入行为,因此我没有看到使用数学舍入函数的另一种解决方案。
以下解决方案对我仍然有效:
double d = 19.53125;
int precision p = 4;
double factor = pow(10.0, p);
std::cout.precision(p);
std::cout.setf(std::ios::fixed);
std::cout << round(d * factor) / factor << std::endl;
Windows output: 19.5313
Linux output: 19.5313
链接:
- https://www.exploringbinary.com/inconsistent-rounding-of-printed-floating-point-numbers/
- Why printf round floating point numbers?