This question already has answers here:
strange output in comparison of float with float literal
(8个答案)
2年前关闭。
我遇到了两个用C编写的程序,它们都比较浮点数,但输出不同。
1)
输出:ELSE IF
2)
输出:中频
为什么0.5不能提升为两倍而0.1可以提升为两倍?
(8个答案)
2年前关闭。
我遇到了两个用C编写的程序,它们都比较浮点数,但输出不同。
1)
#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
2)
int main()
{
float x = 0.5;
if (x == 0.5)
printf("IF");
else if (x == 0.5f)
printf("ELSE IF");
else
printf("ELSE");
}
输出:中频
为什么0.5不能提升为两倍而0.1可以提升为两倍?
最佳答案
由于double
宽于float
,因此x == 0.1
被解释为(double) x == 0.1
。
这适用于0.5,因为0.5可以精确地用二进制表示,因此(double) 0.5f
精确地产生0.5。另一方面,0.1具有an infinite-digit representation in binary,并且0.1f和0.1最终四舍五入为它们所持有的序列的初始位数不同的数字。
在使用十进制数字的类比中,您可以认为上述情况是尝试通过将分数1/3舍入为固定的十进制数字来写下分数1/3。使用5位有效数字表示,您将获得0.33333;选择一个10位数的数字将得出0.3333333333。现在,将5位数字“转换”为10位数字将得到0.3333300000,这与0.3333333333的数字不同。同样,0.5 in就像十进制的1/10,分别表示为0.10000和0.1000000000,因此一个人可以将其转换为另一种表示形式,而又不改变其含义。
如果x
的内容是代码中设置的标记值,则只需将其与0.1f
而不是0.1
进行比较。如果是计算结果,请参见Paul's answer,以比较浮点数量。