gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:38:51 25 4
gpt4 key购买 nike

谁能解释一下 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 %.17gcan't?

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

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com