为什么不同的浮点数比较有不同类型的输出

时间:2014-12-05 04:33:39

标签: c

我有以下代码
案例1

float a=1.7;
    if(a==1.7)
    {
        printf("Equal\n");
    }
    else if(a<1.7)
    {
        printf("less\n");
    }
    else{
        printf("Greater\n");
    }

输出

Greater

案例2

float a=1.3;
if(a==1.3)
{
    printf("Equal\n");
}
else if(a<1.3)
{
    printf("less\n");
}
else{
    printf("Greater\n");
}

输出

Less

为什么输出不符合预期?
为什么两种情况下的输出都不同?
谁能解释这些值是如何存储和比较的 提前致谢

3 个答案:

答案 0 :(得分:2)

组合事物 -

  • 内部C使用double; float是一种存储格式。

  • 1.3是以二进制

  • 表示的无限重复小数
  • IEEE浮点数在存储时对尾数进行舍入。 1.3存储为float获取 向下舍入,1.7向上舍入(一点点)

  • 当读取时,浮点数a将通过添加额外的数字转换为双精度数 最低有效位设置为0。向下舍入的值小于它们 是。向上舍入的值(即使它们以全零结尾)更大。

  • 当比较1.xyzxyz000000和1.xyzxyzxyzxyz时,其中并非所有xyz都为0, 以零结尾的那个会少一些。

编辑:早先错过了ieee舍入方面

对于好奇,这里是存储为1.3和1.7的实际值作为32位浮点数:
1.299999952316284179687500000000
1.700000047683715820312500000000

和64位浮点数:
1.30000000000000004440892098500626161694526672363281250000000000000000
1.69999999999999995559107901499373838305473327636718750000000000000000

答案 1 :(得分:2)

当您为文本分配float然后将结果与同一文字进行比较时,您应该看到值相等。问题是,在您的代码中,您没有将floatfloat进行比较:这是floatdouble的比较。

常量1.71.3属于double类型。当您将它们与float进行比较时,float的值会在比较之前扩展为double。这是值变得不相等的阶段:除非精确表示常量(1.71.3都不能用浮点数表示),否则会出现转换错误。< / p>

您可以通过与float常量进行比较来解决此问题:如果在比较之前将常量强制转换为float,则等式检查将成功:

float a=1.7;
if(a==(float)1.7) {
    printf("Equal\n");
} else if(a<(float)1.7) {
    printf("less\n");
} else {
    printf("Greater\n");
}

Demo(打印Equals)。

答案 2 :(得分:1)

在检查案例时,它会考虑一个整数。所以它会将浮动值四舍五入到   整数。

1.7  roundup as 2. 
1.3  roundup as 1.

所以这就是答案的原因。