双精度的 printf 舍入行为
printf rounding behavior for doubles
有人可以解释这种行为吗?我很清楚浮点数的机器级表示。这似乎与printf及其格式有关。这两个数字都用浮点表示法精确表示(检查:乘以 64 得到一个整数)。
#include <stdio.h>
#include <iostream>
using namespace std;
int main() {
double x1=108.765625;
printf("%34.30fn", x1);
printf("%9.5fn", x1);
printf("%34.30fn", x1*64);
double x2=108.046875;
printf("%34.30lfn", x2);
printf("%9.5fn", x2);
printf("%34.30fn", x2*64);
}
输出:
> 108.765625000000000000000000000000
> 108.76562
> 6961.000000000000000000000000000000
> 108.046875000000000000000000000000
> 108.04688
> 6915.000000000000000000000000000000
请注意,第一个数字向下舍入,第二个数字向上舍入。
它是"四舍五入到偶数"或"银行家的四舍五入"。选择舍入表示的最后一位数字,即使数字正好介于两者之间。
http://linuxgazette.net/144/misc/lg/a_question_of_rounding_in_issue_143.html:
"对于 GNU C 库,printf() 使用的舍入规则是"银行家舍入"或"舍入到偶数"。这比其他一些C库更正确,因为C99规范说转换为十进制应该使用当前选择的IEEE舍入模式(默认银行家舍入)。
%9.5f
输出给出的小数点后有 5 位数字的数字,小数点是最接近源数字的。
相关文章:
- C++将浮点指针值舍入为小数位数
- Boost::posix_time::ptime舍入到给定的分钟数
- 浮点定向舍入和优化
- 为什么输出精度没有正确舍入?
- 使用设置精度时如何阻止数字向上舍入?
- 如何在使用 MPFR 时在提升多精度中设置舍入模式
- OpenCV 细分一致的 Rect2f 到 Rect2i 舍入
- C++ 中的舍入函数
- 舍入 QDecDouble 值,精度最多为两个字符
- 将大 int 转换为浮点数,而不舍入 c++
- 舍入错误检测
- 根据浮点符号对浮点进行舍入的最简单方法是什么
- 将整数舍入到另一个整数的最接近的倍数
- Sizeof 舍入到对齐方式,但编译器仍将对象放在剩余的字节中
- 避免将 Int 转换为双重类型转换舍入
- 浮点数学运算后舍入不一致
- 浮动到绳子而无需舍入
- C++长双精度格式而不舍入
- 是否可以为 AVR 编写一个 constexpr 舍入函数?
- 双精度的 printf 舍入行为