在 C 中以十进制格式打印浮点数时,多余的数字是什么?[复制]

What are the extra digits when printing floating point numbers in decimal format in C? [duplicate]

提问人:Valeria Suarez 提问时间:11/14/2023 更新时间:11/14/2023 访问量:64

问:

如果我使用高精度的 printf 并打印浮点数,我会得到超出类型表示的额外数字。

例如:

const double x = 1.0 / 3.0;
printf("%.50f\n", x);

结果是:

0.33333333333333331482961625624739099293947219848633

内存中的 x 是0x3FD5555555555555。如果我手动转换浮点表示(使用计算器),我会得到以下内容。

0.3333333333333333

多余的数字从何而来?

C 运行时 libc

评论

2赞 nanofarad 11/14/2023
你的计算器四舍五入。浮点值尾数乘以 2^ 指数的实际值接近 0.333333333333333333333331482961625624739099293947219848633。使用我的机器并且没有四舍五入,我有 0.3333333333333333314829616256247390992939472198486328125 作为尾数 * 2^exp 的精确十进制表示。您实际上在基数 10 中有一个类似的问题 - 0.33333333333333333(00000000) 也不是一个确切的值。确切的值无休止地重复 3s。
3赞 Some programmer dude 11/14/2023
请参阅浮点数学坏了吗?
1赞 Barmar 11/14/2023
如果您的计算器可以显示 50 位数字,它将显示类似的内容。
1赞 Weather Vane 11/14/2023
分数 1/3 不能用十进制或二进制精确表示。您正在获得最接近的可表示值。计算机在输出时并不知道您的意图是正好是 1/3。
0赞 Valeria Suarez 11/14/2023
四舍五入的公差/水平是否在某处定义?由于它可能因平台而异

答: 暂无答案