Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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中的%g和%f有什么区别?_C_Variables - Fatal编程技术网

C中的%g和%f有什么区别?

C中的%g和%f有什么区别?,c,variables,C,Variables,我正在学习K&R的C编程语言。这里是一个语句,用来打印一个双变量 printf("\t%g\n", sum += atof(line)); 其中sum被声明为double。如果是双精度或浮动,请告诉我何时使用%g,以及%g和%f之间的区别。请参阅任何参考手册,例如: f、 f 双参数四舍五入并转换为[-]ddd.ddd样式的十进制表示法,其中小数点字符后的位数等于精度规格。如果精度缺失,则取6;如果精度显式为零,则不显示小数点字符。如果出现小数点,则至少有一位数字出现在其前面。 (SUSv2不

我正在学习K&R的C编程语言。这里是一个语句,用来打印一个双变量

printf("\t%g\n", sum += atof(line));

其中sum被声明为double。如果是双精度或浮动,请告诉我何时使用%g,以及%g和%f之间的区别。

请参阅任何参考手册,例如:

f、 f

双参数四舍五入并转换为[-]ddd.ddd样式的十进制表示法,其中小数点字符后的位数等于精度规格。如果精度缺失,则取6;如果精度显式为零,则不显示小数点字符。如果出现小数点,则至少有一位数字出现在其前面。 (SUSv2不知道F,并表示可以使用无穷大和NaN的字符串表示法。C99标准为无穷大指定“[-]inf”或“[-]infinity”,在F转换的情况下,以“NaN”开头的字符串表示NaN,在F转换的情况下,以“[-]inf”或“[-]infinity”或“NaN*”开头的字符串表示NaN。)

g、 g

双参数转换为f或e样式(或f或e表示G转换)。精度指定有效位数。如果缺少精度,则给出6位数字;如果精度为零,则将其视为1。如果转换后的指数小于-4或大于或等于精度,则使用样式e。从结果的小数部分删除尾随零;小数点后至少有一位数字时才会出现


它们都是浮点输入/输出的示例

%g和%g是科学符号浮动%e和%e的简化程序

%g将获取一个可以表示为%f(简单浮点或双精度)或%e(科学记数法)的数字,并将其作为两个数字中的较短者返回


print语句的输出将取决于sum的值。

因为Unwind指出f和g提供不同的默认输出

粗略地说,如果你更关心小数点后的细节,我会用f,如果你想用g来表示大数。从一些尘土飞扬的记忆中可以看出,如果你打印的是数字表,那么f值很小,但如果你的数字变大了,布局也很重要,那么就需要像g这样的东西。当你的数字趋向于非常小或非常大但从不接近10时,e更有用

另一种方法是指定输出格式,以便每次都能获得相同数量的表示数字的字符


很抱歉,答案很模糊,但这是一种主观的输出,只有在生成的字符数很重要或表示值的精度很高的情况下,才会得到硬答案

%f和%g做同样的事情。唯一的区别是%g是%f的较短形式。即小数点后的精度在%f中大于%g

E=指数表达式,仅表示幂(10,n)或10^n

F=分数表达式,默认为6位精度

G=通用表达式,以简洁的方式显示数字(但 真的吗?)

参见下面的示例

代码

void main(int argc, char* argv[])  
{  
        double a = 4.5;
        printf("=>>>> below is the example for printf 4.5\n");
        printf("%%e %e\n",a);
        printf("%%f %f\n",a);
        printf("%%g %g\n",a);
        printf("%%E %E\n",a);
        printf("%%F %F\n",a);
        printf("%%G %G\n",a);
          
        double b = 1.79e308;
        printf("=>>>> below is the exbmple for printf 1.79*10^308\n");
        printf("%%e %e\n",b);
        printf("%%f %f\n",b);
        printf("%%g %g\n",b);
        printf("%%E %E\n",b);
        printf("%%F %F\n",b);
        printf("%%G %G\n",b);

        double d = 2.25074e-308;
        printf("=>>>> below is the example for printf 2.25074*10^-308\n");
        printf("%%e %e\n",d);
        printf("%%f %f\n",d);
        printf("%%g %g\n",d);
        printf("%%E %E\n",d);
        printf("%%F %F\n",d);
        printf("%%G %G\n",d);
}  
输出

=>>>> below is the example for printf 4.5
%e 4.500000e+00
%f 4.500000
%g 4.5
%E 4.500000E+00
%F 4.500000
%G 4.5
=>>>> below is the exbmple for printf 1.79*10^308
%e 1.790000e+308
%f 178999999999999996376899522972626047077637637819240219954027593177370961667659291027329061638406108931437333529420935752785895444161234074984843178962619172326295244262722141766382622299223626438470088150218987997954747866198184686628013966119769261150988554952970462018533787926725176560021258785656871583744.000000
%g 1.79e+308
%E 1.790000E+308
%F 178999999999999996376899522972626047077637637819240219954027593177370961667659291027329061638406108931437333529420935752785895444161234074984843178962619172326295244262722141766382622299223626438470088150218987997954747866198184686628013966119769261150988554952970462018533787926725176560021258785656871583744.000000
%G 1.79E+308
=>>>> below is the example for printf 2.25074*10^-308
%e 2.250740e-308
%f 0.000000
%g 2.25074e-308
%E 2.250740E-308
%F 0.000000
%G 2.25074E-308

至于你的第二点:
float
参数到
printf
被自动转换成
double
,因此不需要一个特定的
float
说明符(因为
float
值不可能达到那个程度)。我认为这个答案是可以接受的。这个答案是准确的,同时也提供了信息;尽管这是目前该页面上得分最高的答案,但实际上是错误的。
%g
的输出不需要与
%f
%e
匹配,并且选择
%g
是否使用科学记数法并不取决于哪个表示法更短。看我在哪里展示反例。这里的“放松”是正确的,但这一个不是。