【问题标题】:From when format specifier '%g' for double starts printing in exponential format从 double 的格式说明符“%g”开始以指数格式打印
【发布时间】:2016-06-28 12:19:36
【问题描述】:

我想了解 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 已转换为指数格式,即使我没有在printf 中使用%lf

是否有从何时开始使用指数格式打印值的范围?如果是,有什么方法可以猜出值范围是多少?

提前致谢。

【问题讨论】:

标签: c printf


【解决方案1】:

根据man 3 printf

g,g

double 参数以样式 f 或 e 转换(或 F 或 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,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 转换说明符。

【讨论】:

    【解决方案2】:

    man

    克,克

    double 参数以样式 f 或 e 转换(或 F 或 E 用于 G 转换)。精度指定有效位数。如果缺少精度,则给出 6 位数字;如果精度为零,则将其视为 1。如果其转换后的指数小于 -4 或大于或等于精度,则使用样式 e。从结果的小数部分中删除尾随零;只有在小数点后跟至少一位数字时才会出现小数点。

    【讨论】:

    • 那么,DV:你能给我点赞吗...?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2018-07-01
    • 2013-08-14
    • 2011-05-14
    • 1970-01-01
    相关资源
    最近更新 更多