2013-08-03 42 views
0

任何人都可以解释%g和%f之间有什么区别。 我知道关于%0.2f,因为我知道它打印点2小数点后! 我试过这个代码...浮点值printf的意外输出10.1

int main() 
{ 
    float val = 10.0; 
    printf("<%g><%0.2g><%0.4g><%f><%0.2f>", val, val, val, val, val); 

    return 0; 
} 
//giving : <10><10><10><10.000000><10.00> 

//If i give 10.1 instead! 
int main() 
{ 
    float val = 10.1; 
    printf("<%g><%0.2g><%0.4g><%f><%0.2f>", val, val, val, val, val); 

    return 0; 
} 
//giving : <10.1><10><10.1><10.000000><10.00> 
// How come here i got for %g --> 10.1 
//       %0.2g --> 10 
//       %0.4g --> 10.1 

请有人澄清我!

+0

简单:你的程序有UB,因为'main()'的签名不正确。 – 2013-08-03 16:26:47

+0

H2CO3意味着你的程序有未定义的行为,因为main的声明不正确(应返回int而不是void)。 –

+0

@ H2CO3,Nop!我也用int返回类型检查过它!我变得一样! – Omkar

回答

0

Linux的程序员手册%g%G

双参数被转换在f或e样式(或F或E为G转换)。 精度指定有效数字 的数量。如果精度丢失,给出6位数;如果精度为零,则将其视为1.如果来自其 转换的指数小于-4或者大于或等于 以达到精度,则使用样式e。从结果的小数部分删除尾部零;只有在 后面至少有一位数字时才会出现小数点。

因此,之前。是字段宽度;之后。是结果中有效位数的最大数量,但尾随零被删除。有效数字为10.10000,有效数字为10.10,但是尾随零点数为10.1。有2位有效数字,结果为10.并且%g等于%.6g

通知然而第二部分:用于

样式e如果从其 转换的指数比小于-4或大于或等于 到精度。

这意味着,100格式化%0.2g结果1e+02

0

在Eclipse中/ Microsoft C编译器环境中运行代码的副本。

总体而言,%g有两种可能的行为,一种是当指数大于或等于-4时,如1 * 10^-4 = 0.0001,另一种是指数为< -4,如0.00001。

// Microsoft C compiler "handles" void main() 
    void main() 
    { 
     // Note. Exponent is 1 
     float val = 10.0; 
     printf("\n<%g><%0.2g><%0.4g><%f><%0.2f>", val, val, val, val, val); 

     // Exponent is still 1 
     val = 10.1; 
     printf("\n<%g><%0.2g><%0.4g><%f><%0.2f>", val, val, val, val, val); 

     // Exponent is -5, and the %g format specifier behaves as you expect 
     val = 0.000011; 
     printf("\n<%g><%0.2g><%0.4g><%f><%0.2f>", val, val, val, val, val); 

     // output == <1.1e-005><1.1e-005><1.1e-005><0.000011><0.00> 

    } 

由ANSI C标准的记录您的代码行为,其性能绝对无关,与你如何编码为无关printfmain()声明的东西。