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