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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在floatf格式说明符和pow函数中C浮点或双精度相关的知识,希望对你有一定的参考价值。

#include <stdio.h>
#include <math.h>

int main(void){

   printf("%lf
", pow(1.0, 2.0));
   printf("%f
", 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(没有警告或错误)。

答案

您的代码应在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与任何其他转换说明符一起出现,则行为未定义。

以上是关于在floatf格式说明符和pow函数中C浮点或双精度的主要内容,如果未能解决你的问题,请参考以下文章

使用pow时如何避免浮点异常? [关闭]

在 C 代码的 printf 语句中使用时,不会显示浮点或双精度值

浮点型数据的精度是啥意思

C语言 四种基本数据类型

没有浮点或双变量的浮点异常

C语言中输出时怎样控制小数点后的位数,请举例说明保留1、2、3、4位小数等等,谢谢