gpt4 book ai didi

c - 浮点常量

转载 作者:太空宇宙 更新时间:2023-11-04 01:22:41 25 4
gpt4 key购买 nike

对于下面的代码:

#include<stdio.h>

int main()
{
float a = 0.7;
printf("%.10f %.10f\n", 0.7f, a);
return 0;
}

我得到的输出是:

0.7000000000 0.6999999881

请解释为什么 a 打印为 0.6999999881 而文字常量打印为 0.7000000000

在这种情况下,浮点常量的使用是否依赖于编译器?

最佳答案

如果编译器将 FLT_EVAL_METHOD 定义为 1 或 2,则获取“0.7000000000”作为为 printf("%.10f",0.7f) 打印的字符串是正常行为。

确实,在那种模式下,浮点常量可以以 beyond 的精度表示他们的类型 (C11 5.2.4.2.2:9):

Except for assignment and cast (which remove all extra range and precision), the values yielded by operators with floating operands and values subject to the usual arithmetic conversions and of floating constants are evaluated to a format whose range and precision may be greater than required by the type.

换句话说,打印 0.7000000000 0.6999999881 FLT_EVAL_METHOD=2 is one possible behavior对于下面修改后的程序。

#include<stdio.h>
#include <float.h>

int main()
{
float a=0.7;
printf("%.10f %.10f FLT_EVAL_METHOD=%d\n",0.7f, a, (int)FLT_EVAL_METHOD);
return 0;
}

因为编译器将FLT_EVAL_METHOD定义为2,所以printf("%.10f %.10f", 0.7f, 0.7)被处理就好像它是 printf("%.10f %.10f", (double)0.7L, (double)0.7L)。同样,printf("%.60Lf %.60Lf\n", (long double)0.7f, (long double)0.7) 等同于 printf("%.60Lf %.60Lf\n", 0.7L, 0.7L).

关于c - 浮点常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38178368/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com