C编码,比较浮点值时的意外行为

时间:2017-01-24 13:23:51

标签: c gcc floating-point floating-accuracy

我在比较一个浮点值时遇到了一个意想不到的行为,我知道浮点数可能会出现舍入问题,但这里的数字非常具体,可以解决这些问题。

#include <stdio.h>
int main()
{
    float alpha = 0.0f;
    int finish = 0;

    while (finish == 0)
    {
        alpha += 0.05f;

        if (alpha > 1.0f)
        {
            printf("%f", alpha);    // Expected result: 1.05f, actual result: 1.0f
            finish = 1;
        }
    }

    return 0;
}

实际上,当alpha = 1.0f时,条件进入。无法理解这种行为......

我在Windows 10(32位和64位测试),Intel i5处理器上使用MinGW(GCC 5.3.0)进行编译。

1 个答案:

答案 0 :(得分:3)

(如果我可以使用IEEE754浮点,则限制答案。)

float没有0.05最近的号码可以代表

0.0500000007450580596923828125

所发生的事情是,稍微的值大于您认为添加到alpha的值,这足以只是将其推到{ {1}}标记(出于兴趣,可以完全表示。)

1.0f中的默认格式是将print的数字稍微大于1.0f

总之,所有这一切都是由于二进制浮点通常没有精确的十进制表示。