我想了解double的格式说明符%g
何时开始以指数格式打印值。
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;
}
使用gcc编译:
gcc version 4.5.2 (GCC)
Target: i386-pc-solaris2.11
输出:
val = 384615
val2 = 1e+07
问题:
为什么val
打印为整数以及为什么val2
已转换为指数格式,即使我未在%lf
中使用printf
。
是否有使用指数格式开始打印值的范围?如果是的话,我们有什么方法可以猜出价值区间是什么?
先谢谢。
答案 0 :(得分:6)
根据man 3 printf
:
g,G
双参数以样式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等于 如果非零则为precision;如果省略精度则为6;如果精度为零,则为1。 然后,如果具有样式E的转换将具有指数X:
- 如果P&gt; X≥-4,转换方式为f(或F)和精度 P - (X + 1)。
- 否则,转换采用样式e(或E)和精度P-1。
最后,除非使用#flag,否则将从中删除任何尾随零 如果,则删除结果的小数部分和小数点字符 没有剩余的小数部分。 表示无穷大或NaN的双参数将在样式中转换 f或F转换说明符。
答案 1 :(得分:2)
man说
g,G
双参数以样式f或e(或G或E转换为G转换)转换。精度指定有效位数。如果精度丢失,则给出6位数字;如果精度为零,则将其视为1. 如果转换的指数小于-4或大于或等于精度,则使用样式e。 尾随零从结果的小数部分中删除;只有在后跟至少一位数字时才会出现小数点。