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

kiz8lqtg  于 2023-05-06  发布在  其他
关注(0)|答案(7)|浏览(1159)

我正在学习K&R的C编程语言。这里在一个打印double变量的语句中写着

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

其中sum被声明为double。有没有人可以帮助我在double或float的情况下何时使用%g,以及%g和%f之间的区别。

eulz3vhy

eulz3vhy1#

它们都是浮点输入/输出的示例。
%g和%G是科学记数法浮点数%e和%E的简化符。
%g将接受一个可以表示为%f(一个简单的浮点数或双精度浮点数)或%e(科学记数法)的数字,并返回两者中较短的一个。
print语句的输出将取决于sum的值。

ig9co6j1

ig9co6j12#

请参阅任何参考手册,例如man page
f,F
double参数被舍入并转换为[-]ddd.ddd样式的十进制表示法,其中小数点字符后的位数等于精度规范。如果精度缺失,则取6;如果精度显式为零,则不显示小数点字符。如果出现小数点,则小数点前至少会出现一位数字。(SUSv 2不知道F,并表示可以使用无穷大和NaN的字符串表示。C99标准指定'[-]inf'或'[-]infinity'表示无穷大,在f转换的情况下,指定以'nan'开头的字符串表示NaN,在F转换的情况下,指定'[-]INF'或'[-]INFINITY'或'NAN*'。
g,G
double参数转换为f或e样式(或G转换为F或E)。精度指定有效位数。如果精度缺失,则给出6位数字;如果精度为零,则将其视为1。如果转换后的指数小于-4或大于或等于精度,则使用样式e。从结果的小数部分去除尾随零;小数点只有在后面至少有一位数字时才会出现。

cngwdvgl

cngwdvgl3#

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
4zcjmb1e

4zcjmb1e4#

正如Unwind指出的,f和g提供不同的默认输出。
粗略地说,如果你更关心小数点后的细节,我会用f来做,如果你想对大的数字进行缩放,就用g。从一些尘封的记忆中,f是非常好的小值,如果你的打印表的数字,因为一切都保持排队,但像g的东西是需要的,如果你站在一个变化,你的数字越来越大,你的布局问题。当你的数字很小或很大,但永远不会接近10时,e更有用。
另一种方法是指定输出格式,以便每次都获得相同数量的字符表示您的数字。
对不起,模糊的答案,但它是一个主观的东西,只有得到硬答案,如果生成的字符数是重要的或所表示的值的精度。

ma8fv8wu

ma8fv8wu5#

%g删除浮点数中的尾随零,
打印(integer)到106,之后在e+中直到精度6
123456给出123456
1234567给出1.23457e+06
打印(float〉10
-4)到精度6,之后舍入到pre。6
1.23456给出1.23456
1.234567给出1.23457
print(float〈10**-4)直到精度为4,否则为ne-0 p
0.0001得0.0001
0.000001给出1 e-06
0.12345678给出0.123457
%G做同样的事情,但是exp(e)变成exp(E)

wmomyfyw

wmomyfyw6#

所有三个格式说明符%e、%f和%g都用于处理C中的float和double数据类型。

%e表示指数幂的数据(科学格式)。
%f以正常的十进制形式表示数据,最多可以保留6位小数,但您可以控制输出的小数位数。
%g表示十进制格式,并删除后续的零。

如何在c代码中使用%e、%f和%g的示例:

#include <stdio.h>

int main() 
{ 
    double ans = 123.45; 
    
    printf("Printing using %%f %f\n",ans); 
    printf("Printing using %%e %e\n",ans); 
    printf("Printing using %%g %g\n\n\n",ans);
    // 
    
    
    ans = 123.45e8; // scientific way of writing 123.45 * 10^8
    
    printf("Printing using %%f %f\n",ans); 
    printf("Printing using %%e %e\n",ans); 
    printf("Printing using %%g %g\n\n\n",ans); 
    
    
    ans = 123.45e-8; // scientific way of writing 123.45 * 10^(-8) i,e. 0.0000012345
    
    // %f has upto 6 digits precision
    // 0.0000012345 converted to 0.000001 (max 6 precision allowed)
    printf("Printing using %%f %f\n",ans); 
    printf("Printing using %%e %e\n",ans); 
    printf("Printing using %%g %g\n",ans); 
    
    return 0;
}

输出为:

Printing using %f 123.450000
Printing using %e 1.234500e+02
Printing using %g 123.45

Printing using %f 12345000000.000000
Printing using %e 1.234500e+10
Printing using %g 1.2345e+10

Printing using %f 0.000001
Printing using %e 1.234500e-06
Printing using %g 1.2345e-06
kcrjzv8t

kcrjzv8t7#

%f和%g做同样的事情。唯一的区别是%g是%f的缩写形式。也就是说,%f中小数点后的精度大于%g

相关问题