在floatf格式说明符和pow函数中C浮点或双精度

问题描述 投票:2回答:1
#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位上使用Codeblocks。

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

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

最后,如果我从Codeblocks中的源代码中删除#include <stdio.h>,所有都给我1.000000(没有警告或错误)。

c printf double pow specifier
1个回答
4
投票

您的代码应在C99或C11编译器上为两行打印相同的值。 float的所有printf论据总是转换为double,而%lf%f都做同样的事情(打印double)。

在C89标准中,%lf说明符是未定义的行为,doubles应该只用%f打印。所以也许你正在使用一个不支持C99标准的旧编译器。

有关%lf的标准的相关部分:

公寓,H.19.T.1 / H:

l(ell)[...]对随后的a,A,e,E,f,F,g或G转换规格没有影响。

公寓,4.s.t 1:

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

© www.soinside.com 2019 - 2024. All rights reserved.