为什么输出此代码,“BYE”..而不是“HI”......
#include<stdio.h>
int main()
{
float i=1.1;
if(i==1.1)
printf("HI");
else
printf("BYE");
return 0;
}
因为1.1是一个浮点值所以不应该是“HI”
答案 0 :(得分:2)
浮点数无法准确表示。所以你不能直接将两个浮点等同。它通常与epsilon不同。
if(fabs(floatVarialbe-expectedValue) < **FLT_EPSILON**)
{
//statements to execute if they are equal
}
你应该使用fabs函数来获得绝对值[删除负号],它在math.h库中定义。 FLT_EPSILON 是一个相对错误,它在float.h库中定义
由于舍入错误,大多数浮点数最终都会出现 稍微不精确。只要这种不精确度保持很小,它就可以 通常被忽略。但是,它也意味着预期的数字 相等(例如,当通过不同的正确计算相同的结果时) 方法)经常略有不同,简单的相等测试失败。
如果您想了解更多信息, What Every Computer Scientist Should Know About Floating-Point Arithmetic
答案 1 :(得分:1)
您不应该使用==来检查浮点数是否相等。看一下这个。 http://how-to.wikia.com/wiki/Howto_compare_floating_point_numbers_in_the_C_programming_language
答案 2 :(得分:1)
1.1不是浮点数,1.1f是
答案 3 :(得分:0)
因为您无法比较浮点数是否相等。你需要问一下,我是否在1.1的可接受容差范围内?&#34;。人们经常将容忍度命名为ε&#34;。
答案 4 :(得分:0)
这是因为精确。 1.1无法使用二进制浮点数精确表示。
而是尝试if(i == 1.1f)
或if(i == (float)1.1)
答案 5 :(得分:0)
因为在您的代码中
if(f == 1.1)
1.1正在考虑作为双倍。尝试使用1.1f将此值视为浮点数:
if(f == 1.1f)
希望有所帮助
答案 6 :(得分:0)
你没有得到正确答案的原因是因为在float
中1.1不能完全表示为1.1(由于它具有有限的精度)。如果您想了解为什么+, - ,*,/的比较和简单操作没有给出正确答案的次数,那么您可以访问以下链接获取更多信息 -
What Every Programmer Must Know About Floating Point
现在,您可以将程序修改为以下内容以获得正确的结果 -
#include<stdio.h>
int main()
{
float i=1.1;
if(i==(float)1.1)
printf("HI");
else
printf("BYE");
return 0;
}
这个程序做的是它输入比较值并给它精确的Float
数据类型而不是Double
数据类型,编译器在分配给任何数据之前用它来表示值变量(Int,Float,Double等)。
答案 7 :(得分:0)
因为看起来令人难以置信,1.1和1.1在转换为C编译器使用的浮点表示时并不总是相同的数字。试试这个程序:
#include<stdio.h>
int main()
{
float i=1.1;
printf("i=%0.20f 1.1=%0.20f\n", i, 1.1);
return 0;
}
简短的解释是,对于在基数2中不能完全表示的值,浮点表示不准确。例如,尝试使用1.5而不是1.1的示例代码 - 这应该有效。正如在GreenAsJade的回答中已经提到的那样,你不测试浮点数是否相等,你要测试它们是否“足够接近以至于在本申请中被认为是相等的”。正如DeanSinaean所说,你没有将你的常量限定为带有尾随“f”的浮点数,所以它第一次被转换为double。我猜它第二次不同,因为编译器将“1.1”转换为float以便与“i”类型为float进行比较。
有关幕后发生的更多详情,请访问: How are floating point numbers are stored in memory?
答案 8 :(得分:-1)
您正在尝试比较float
和double
尝试如下所示进行类型转换,然后查看。
int main()
{
float i=1.1;
if(i==(float)1.1) //<------- to float
printf("HI");
else
printf("BYE");
return 0;
}
有关详细信息,请参阅this