【问题标题】:C float or double in printf format specifier and pow functionprintf 格式说明符和 pow 函数中的 C 浮点或双精度
【发布时间】:2018-06-04 06:14:07
【问题描述】:
#include <stdio.h>
#include <math.h>

int main(void){

   printf("%lf\n", pow(1.0, 2.0));
   printf("%f\n", pow(1.0, 2.0));

   return 0;    
}

第一个printf() 给出输出0.000000,但第二个printf() 给出输出1.000000。为什么?

在 Windows 7 64 位上使用代码块。

使用 gcc 命令编译给我一个 .exe,它为两个语句输出 1.000000。

如果我在 Codeblocks 上按 F9 进行编译,第一个语句得到 0.000000,第二个语句得到 1.000000。

最后,如果我从 Codeblocks 的源代码中删除 #include &lt;stdio.h&gt;,全部给我 1.000000(没有警告或错误)。

【问题讨论】:

  • 不在ideone上:ideone.com/SRmfgd
  • 对于printf 而言,"%f" 和 "%lf" 是相等的,因为两者都期望 double 参数。您显示的代码是您测试过的实际代码吗?请创建一个Minimal, Complete, and Verifiable Example,然后将其复制粘贴到问题中。
  • 无法复制。
  • code::blocks 不是编译器
  • 使用 gcc 命令编译给我一个 .exe,它为两个语句输出 1.000000。如果我在 Codeblocks 上按 F9 进行编译,第一个语句得到 0.000000,第二个语句得到 1.000000。最后,如果我从 Codeblocks 的源代码中删除 #include ,都给我 1.000000。

标签: c printf double pow specifier


【解决方案1】:

您的代码应该在 C99 或 C11 编译器上为两行打印相同的值。 printf 的所有 float 参数始终转换为 double,%lf 和 %f 都执行相同的操作(打印 double)。

在 C89 标准中,%lf 说明符是未定义的行为,doubles 只能与 %f 一起打印。因此,您可能正在使用不支持 C99 标准的旧编译器。

标准中关于%lf的相关章节:

C99,7.19.6.1/7:

l (ell) [...] 对后面的 a、A、e、E、f、F、g 或 G 转换说明符没有影响。

C89,4.9.6.1:

[...] 一个可选的 l (ell),指定后面的 d 、 i 、 o 、 u 、 x 或 X 转换说明符适用于 long int 或 unsigned long int 参数;一个可选的 l 指定后面的 n 转换说明符应用于指向 long int 参数的指针; [...] 如果 h 、 l 或 L 与任何其他转换说明符一起出现,则行为未定义。

【讨论】:

    猜你喜欢
    • 2013-05-26
    • 2015-12-24
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 2012-03-14
    相关资源
    最近更新 更多