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
。
总而言之,所有这些都是由于二进制浮点数通常没有精确的十进制表示。
我在比较浮点值时遇到了意外行为,我知道浮点数可能存在舍入精度问题,但这里的数字非常具体以呈现这些问题。
#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
。
总而言之,所有这些都是由于二进制浮点数通常没有精确的十进制表示。