Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 以sprintf科学记数法打印所有有效数字_C_R_Printf - Fatal编程技术网

C 以sprintf科学记数法打印所有有效数字

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个

当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(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