可能重复:
strange output in comparision of float with float literal
我无法理解这段代码。如何比较两个相同的数字?
#include<stdio.h>
int main()
{
float a=0.8;
if(0.8>a) //how can we compare same numbers?
printf("c");
else
printf("c++");
return 0;
}
如何解决这个问题?
答案 0 :(得分:2)
我不明白为什么你问是否可以比较相同的两个数字。为什么你不期望像3 > 3
这样的比较工作,即使3与3相同?如果左侧大于右侧,则>
运算符返回true,否则返回false。在这种情况下,.8
不大于a
,因此结果为false。
其他人似乎认为你在问一些浮点舍入问题。但是,即使使用精确的数学,.8 > .8
也是错误的,这就是您使用所显示的代码得到的结果;其他分支被采取。所以这里没有意外的行为来解释。
你真正的问题是什么?
如果您询问浮点效果,下面会提供一些信息。
在C源代码中,文本“.8”代表一个以双精度表示的最接近的数字.8。 (一个好的实现使用最接近的数字,但C标准允许一些松弛。)在最常见的浮点格式中,最接近.8的双精度值是(作为十六进制浮点数)0x1.999999999999ap- 1,(十进制)0.8000000000000000444089209850062616169452667236328125。
这样做的原因是二进制浮点表示数字仅,其中的位代表2的幂。 (两个幂的大小取决于浮点值的指数,但是,无论指数如何,小数部分中的每个位代表一些2的幂,例如.5,.25,.125,.0625,和因为.8不是2的任何幂的精确倍数,所以,当小数部分中的可用位都被使用时,结果值仅接近.8;这不确切。
初始化float a = .8;
将双精度值转换为单精度,以便可以将其分配给a。在单精度中,最接近.8的可表示数字是0x1.99999ap-1(十进制,0.800000011920928955078125)。
因此,当您将“.8”与a进行比较时,您会发现.8 > a
为假。
对于某些其他值,例如.7,最接近的可表示数字的计算方式不同,关系运算符返回true。例如,.7 > .7f
为真。 (源代码中的文本“.7f”代表.7附近的单精度浮点值。)
答案 1 :(得分:1)
0.8是双倍的。当a设置为它时,它会转换为浮点数,此时会失去精度。比较采用浮动并将其提升回两倍,因此值肯定不同。
编辑:我可以证明我的观点。我只是编译并运行程序float a = 0.8;
int b = a == 0.8 ? 1 : 0;
int c = a < 0.8 ? 1 : 0;
int d = a > 0.8 ? 1 : 0;
printf("b=%d, c=%d, d=%d, a=%.12f 0.8=%.12f \n", b, c, d, a, 0.8);
b=0, c=0, d=1, a=0.800000011921 0.8=0.800000000000
注意由于促销加倍
,现在如何拥有一些非常小的派系部分