【问题标题】:C: How long can a double be when printed through printf()C:通过 printf() 打印双精度可以多长时间
【发布时间】:2010-11-04 00:10:18
【问题描述】:

我需要指定要从双精度值打印的字符串的确切长度,但我不想限制输出超出必要的范围。

当被 printf() 格式化时,6 位精度双精度的最大长度是多少?

具体来说,我应该给printf("%X.6lg",doubleValue); 中的X 赋予什么值以确保没有值被截断?

我需要具体说明长度的原因是我正在定义一个 MPI 派生数据类型,该数据类型由许多双精度值的字符串表示形式组成,并且必须知道它们的确切长度才能在 MPI 进程之间划分文件区域.

我希望这很清楚。提前感谢您的回答。

【问题讨论】:

  • 我不确定您在问什么——您是否希望所有值都为 6 位有效数字,例如 0.123456、1.23456、12345.6 等?还是您只关心小数部分是 6 位有效数字?至于小数值,我不知道如何避免截断,除非你的值是“二元的”(即以二进制结尾)并且小于或等于 63/64。

标签: c printf mpi


【解决方案1】:

使用printf("%.6g", doubleValue)printf("%.6Lg", doubleValue)

请注意,在精度说明符中省略前导数字(“宽度”)对值的整数部分的长度没有要求。

还请注意,小写“l”将指定您的值是长整数。大写的“L”指定一个长双精度值。

另请注意,如果您不希望将其更改为科学记数法(如果它是更短的表示形式),那么您可以使用“f”而不是“g”。

查看printf reference here

【讨论】:

    【解决方案2】:

    IEEE double 的最大指数是 1023,因此最大的 double 将是 1 + 1/2 + 1/4 + 1/8 + ... 等 * 2^1023。大约 318 个字符长,以十进制表示。

    为什么不使用“e”格式说明符?

    【讨论】:

    • 并非所有平台都使用 IEEE doubles,这就是标准委员会提出 ... 的原因
    【解决方案3】:

    包含许多有用的值,其中 DECIMAL_DIG,它是一个 long double

    同一个文件很可能会告诉您平台上的 double 具有超过 6 位的精度...

    PS:还要注意上面 Demi 的回答。他指出了你 printf() 中我没有发现的各种缺陷。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-22
      • 2021-07-08
      • 1970-01-01
      • 2019-02-09
      相关资源
      最近更新 更多