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

C coding, unexpected behaviour when comparing float value

我在比较浮点值时遇到了意外行为,我知道浮点数可能存在舍入精度问题,但这里的数字非常具体以呈现这些问题。

#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) 进行编译。

(将答案限制为 IEEE754 浮点数)。

没有0.05这样的float最接近的数字是

0.0500000007450580596923828125

所以发生的事情是,稍微 比您认为添加到 alpha 的值大,这足以 just 将其推过 1.0f 标记(出于兴趣, 可以 准确表示。)

print 中的默认格式是将略大于 1.0f 的数字舍入为 1.0f

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