从格式说明符'%g'用于以指数格式双重开始打印

时间:2016-06-28 12:19:36

标签: c printf

我想了解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

是否有使用指数格式开始打印值的范围?如果是的话,我们有什么方法可以猜出价值区间是什么?

先谢谢。

2 个答案:

答案 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。 尾随零从结果的小数部分中删除;只有在后跟至少一位数字时才会出现小数点。