我想了解%gdouble的格式说明符何时开始以指数格式打印值.
myTest.c
#include <stdio.h>
int main() {
double val = 384615.38462;
double val2 = 9999999;
printf ("val = %g\n",val);
printf ("val2 = %g\n",val2);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用gcc编译:
gcc version 4.5.2 (GCC)
Target: i386-pc-solaris2.11
Run Code Online (Sandbox Code Playgroud)
输出:
val = 384615
val2 = 1e+07
Run Code Online (Sandbox Code Playgroud)
问题:为什么val打印为整数,为什么val2即使我没有使用%lf过也会转换为指数格式printf.
是否有从使用指数格式开始打印值的范围?如果是的话,我们有什么办法可以猜出价值区间是什么?
提前致谢.
根据man 3 printf:
g,G
double参数以样式f或e(或G或E转换为G转换)转换.精度指定有效位数.如果精度丢失,则给出6位数字; 如果精度为零,则将其视为1. 如果转换的指数小于-4或大于或等于精度,则使用样式e.尾随零从结果的小数部分中删除; 只有在后跟至少一位数字时才会出现小数点.
和C11 - ISO/IEC 9899:2011标准草案N1570(http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf):
克,G
表示浮点数的双参数在样式f或e中转换(或在G转换说明符的情况下以F或E形式转换),具体取决于转换的值和精度.设P等于非零的精度,如果省略精度则设为6,如果精度为零则设为1.然后,如果具有样式E的转换将具有指数X:
- 如果P>X≥-4,则转换为样式f(或F)和精度P - (X + 1).
- 否则,转换采用样式e(或E)和精度P - 1.
最后,除非使用#标志,否则从结果的小数部分删除任何尾随零,如果没有剩余小数部分,则删除小数点字符.表示无穷大或NaN的双参数以f或F转换说明符的样式转换.