请解释不同案例的输出
#include<stdio.h>
int main()
{
float a=5.9; //a=0.9
if (a==5.9)
printf("Equal");
else if (a<5.9)
printf("Less than");
else
printf("Greater than");
return 0;
}
当a为5.9时,输出为“大于”,当a为0.9时,输出为“小于”。为什么呢?
答案 0 :(得分:3)
在C中,文字“5.9”具有类型double
并由共同编译器转换为5.9000000000000003552713678800500929355621337890625,因为它们使用二进制IEEE-754浮点,并且该数字是可表示为{{1}的值}最接近5.9。您的代码使用该值初始化double
。这需要将float
转换为double
,结果为5.900000095367431640625,因为这是最接近float
值的float
值。显然,后者比前者更大,这就是你输出“大于”的原因。
使用.9,文字“.9”将转换为double
0.90000000000000002220446049250313080847263336181640625。然后double
转换为double
0.89999997615814208984375,显然小于float
。
答案 1 :(得分:1)
您的变量是浮点数,但常量是双精度数。由于该值不能精确存储,因此ti将以浮点数和双精度存储。如果您使用相同的数据类型,您将获得所需的结果
答案 2 :(得分:0)
浮点数本质上是不精确的。有关快速介绍,您可以在这里阅读一下。 http://floating-point-gui.de/errors/comparison/
有关有效比较策略的一些建议,请参阅此文章。 What is the most effective way for float and double comparison?
答案 3 :(得分:0)
这是因为在内部,浮点数以二进制形式存储,而5.9不能完全表示为5.9。请查看以下类似的问题和答案:Why does a C floating-point type modify the actual input of 125.1 to 125.099998 on output?
答案 4 :(得分:0)
比较浮点数时,最好避免使用'=='。
这是因为在没有精度损失的情况下无法正确存储某些值。
所以最好说:
if( fabs(a-5.9) < .0001 ) {
// 'EQUAL' or at least near enough!
}
我知道这需要更多的计算,但它会按照你期望的方式运行。
答案 5 :(得分:0)
由于十进制二进制转换,0.9表示为2 ^ -1的幂的总和:
0.9 - (0.5 + 0.25 + 0.125)= 0.025
但是0.025并不是2 ^ -1的精确幂。因此,您需要在相同精度的比较中表示两个数字。由于float和double具有不同的精度,因此它们不相等。