c语言 - 从双精度的格式说明符'%g'开始以指数格式打印



我想了解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或大于或等于精度。从结果的小数部分删除末尾的零;小数点后面至少跟一个数字才会出现。

最新更新