吾爱程序员:这里有好玩的游戏和软件
当前位置:首页C语言教程 → 浮点数与 C 中的值的比较

浮点数与 C 中的值的比较

来源:网络 | 更新时间:2022-01-08 12:38:21
预测以下 C 程序的输出。 
#include<stdio.h>
int main()
{
float x = 0.1;
if (x == 0.1)
printf("IF");
else if (x == 0.1f)
printf("ELSE IF");
else
printf("ELSE");
}
上面程序的输出是“ ELSE IF ”,这意味着表达式“x == 0.1”返回 false,表达式“x == 0.1f”返回 true。  让我们考虑以下程序以了解上述输出背后的原因。  
#include<stdio.h>
int main()
{
float x = 0.1;
printf("%d %d %d", sizeof(x), sizeof(0.1), sizeof(0.1f));
return 0;
}
在典型的 C 编译器上,上述程序的输出是“ 4 8 4 ”。
它实际上打印了浮点数的大小、双精度数和浮点数的大小。
除非最后指定了“f”,否则表达式中使用的值被视为双精度双精度浮点格式)。所以表达式“x==0.1”在右侧有一个 double 和一个 float,它们以单精度浮点格式存储在左侧。在这种情况下,float 被提升为 double (参见this)。双精度格式比单精度格式使用更多的精度位。  0.1二进制相当于10可以写成(0.00011001100110011 ...)2,其上升到无穷大(见文章了解更多有关转换)。由于浮点数的精度小于双精度,因此在某个点之后(浮点数为 23,双精度数为 52),它会截断结果。因此,在将浮点数提升为双精度后(在比较时)编译器将用零填充剩余位。因此,我们得到不同的结果,其中两者的十进制等值将不同。例如,
在float
=> (0.1) 10 = (0.00011001100110011001100) 2
在 float 提升后的 double ...(1)
=> (0.1) 10 = (0.00011001100110011001100000000000000000...) 2
                                      ^ 此处补零
在没有提升的double ...(2)
=> (0.1) 10 = (0.0001100110011001100110011001100110011001100110011001) 2

因此我们可以看到两个方程的结果是不同的。
因此,'if' 语句永远无法执行。
请注意,只有当一个值(如 0.1)使用的精度位多于单精度位时,将 float 提升为 double 才会导致不匹配。例如,下面的 C 程序打印“IF”。
#include<stdio.h>
int main()
{
float x = 0.5;
if (x == 0.5)
printf("IF");
else if (x == 0.5f)
printf("ELSE IF");
else
printf("ELSE");
}
输出: 
IF
这里 0.5 10 的二进制等价物是 (0.100000…) 2 (浮点型和双精度型都不会丢失精度)。因此,如果编译器在提升时填充额外的零,那么我们将在比较的左侧和右侧的十进制等效项中得到相同的结果(x == 0.5)。 

最新文章

热点资讯

手游排行榜

CopyRight 2020-2030吾爱程序员

鄂ICP备2021004581号-8

本站资源收集于网络,如有侵权请联系我们:35492删除0109@qq.com