c - 带有说明符 "%g"的 printf 的精度

标签 c printf

谁能解释一下 printf 中的 [.precision] 如何与说明符“%g”一起使用?我对以下输出感到很困惑:

double value = 3122.55;
printf("%.16g\n", value); //output: 3122.55
printf("%.17g\n", value); //output: 3122.5500000000002

我了解到 %g 使用最短的表示。

但下面的输出仍然让我感到困惑

printf("%.16e\n", value); //output: 3.1225500000000002e+03
printf("%.16f\n", value); //output: 3122.5500000000001819
printf("%.17e\n", value); //output: 3.12255000000000018e+03
printf("%.17f\n", value); //output: 3122.55000000000018190

我的问题是:为什么 %.16g 给出了准确的数字,而 %.17g 却不能?

好像16位有效数字就可以了。谁能告诉我原因?

最佳答案

%g 使用最短表示。

float usually aren't stored作为以 10 为基数的数字,但 2(性能、大小、实用性原因)。但是,无论您的表示基础如何,总会有一些有理数无法在用于存储它们的变量的任意大小限制中表达。

当您指定 %.16g 时,您是说您想要给定数字的最短表示形式,最多 16 位有效数字。

如果最短的表示有超过 16 位,printf 将通过截断最后的 2 位来缩短数字字符串,留下 3122.550000000000,实际上是 3122.55 的最短形式,解释了您获得的结果。

一般来说,%g 将始终为您提供尽可能短的结果,这意味着如果可以缩短代表您的号码的数字序列而不损失任何精度,那么它就会完成。

进一步举例,当您使用 %.17g 并且 17 小数位包含不同于 0 的值时(2),你最终得到了完整的数字 3122.5500000000002

My question is: why %.16g gives the exact number while %.17g can't?

它实际上是 %.17g 给你准确的结果,而 %.16g 只给你一个带有误差的近似值(与内存)。

如果您想要更固定的精度,请改用 %f%F

关于c - 带有说明符 "%g"的 printf 的精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30658919/

相关文章:

c - 错误 : Address already in use while binding socket with address but the port number is shown free by `netstat`

c - typedef 之间有什么区别

c - 将值捕获到字符串中时出现问题

c - 如何打印这个二维数组?

c - C中的 "%02s"和 "%2s"有什么区别?

多次调用函数 - (将函数作为参数传递) – C

C 服务器不接受任何客户端

c - fopen 一切 - 这可能吗?

c - 循环重复scanf和printf

c++ - 以单个字符为元素堆叠