C 以sprintf科学记数法打印所有有效数字
当R将一个大数字转换为科学记数法中的字符串时,它包括所有有效数字,并且没有尾随的零。在C语言中使用C 以sprintf科学记数法打印所有有效数字,c,r,printf,C,R,Printf,当R将一个大数字转换为科学记数法中的字符串时,它包括所有有效数字,并且没有尾随的零。在C语言中使用sprintf可以实现这一点吗 > as.character(12345e11) [1] "1.2345e+15" > as.character(1234500000e6) [1] "1.2345e+15" > as.character(1234500001e6) [1] "1.234500001e+15" 我尝试了sprintf(buf,“%g”,val),但这似乎最多包含5个
sprintf
可以实现这一点吗
> as.character(12345e11)
[1] "1.2345e+15"
> as.character(1234500000e6)
[1] "1.2345e+15"
> as.character(1234500001e6)
[1] "1.234500001e+15"
我尝试了sprintf(buf,“%g”,val)
,但这似乎最多包含5个十进制数字。我还尝试使用sprintf(buf,“%.18g”,val)
设置更高的精度,但这将包括非有效数字和尾随零
有没有一种方法可以获得sprintf(buf,“%g”,val)的行为,但增加5位数的限制?代码可以使用“%.18e”
或“%.18g”
,但问题是“18”应该有多大?18是最佳值吗?答案在于DBL\u DECIMAL\u DIG
DBL\u DECIMAL\u DIG
是要打印的最小有效位数,以确保所有double
的double
字符串往返于相同的double
建议使用格式说明符“%.*e”
请注意,“%.18e”
中的“18”是小数点后的有效位数。因此,“%.18e”
打印19个有效数字
使用
printf(“%a”,x)代码>以十六进制输出打印。
对于十进制输出:
#include <float.h>
// sign + digit + dp + digits + e + sign + expo + \0
char buf[1 + 1 + 1 + (DBL_DECIMAL_DIG - 1) + 1 + 1 + 5 + 1];
sprintf(buf, "%.*e", DBL_DECIMAL_DIG - 1, x);
输出
1.2e+00
1.4285714285714285e-01
尾随的零实际上是非常重要的。我不认为这是可能的,至少根据帖子,你的可能是一个副本。让我不安的是,printf
的手册页上对%g
格式说:“从结果的小数部分删除了尾随的零”我无法观察到这种记录的行为。@5gon12eder——像n=58.375这样精心设计的数字怎么样?用printf(“%.18g\n”,n)
打印它会像预期的那样给我58.375
,而n=58.374
会导致58.3740000000000023
注意.375等于3/8,所以它有一个精确的浮点表示。大多数任意选择的小数没有精确的浮点表示。因此,%g
的行为与您对这些数字的预期不同。@Jeroen——您给出的示例都是大整数。要强制以科学记数法打印整数,请使用%.16e
。然后从字符串末尾向后解析以找到e
,并删除e
之前的任何0
s。这是你能做的最好的了。请注意,如果您的数字有一个小数部分,那么就没有解决方案,正如我在前面的评论中所讨论的。@user3386109我很清楚浮点表示的问题,但我不会说“58.3740000000000023”后面有零。无论如何,OP有整数,应该有一个精确的表示。但你是对的,我之前肯定做错了什么(代码不再存在)printf(“%.10g\n”,n)
(但不是用18代替10)确实产生了所需的输出。然而,如果你总是想要科学记数法,我仍然不知道我们如何才能得到它。但至少,printf
似乎做了它应该做的事情。对不起,误报了。
1.2e+00
1.4285714285714285e-01