为什么输出此代码,“BYE”..而不是“HI”

时间:2014-01-05 06:09:36

标签: c

为什么输出此代码,“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”

9 个答案:

答案 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)

您正在尝试比较floatdouble 尝试如下所示进行类型转换,然后查看。

int main()
{
    float i=1.1;
    if(i==(float)1.1) //<------- to float
        printf("HI");
    else
        printf("BYE");
    return 0;
}

有关详细信息,请参阅this