我在比较一个浮点值时遇到了一个意想不到的行为,我知道浮点数可能会出现舍入问题,但这里的数字非常具体,可以解决这些问题。
#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)进行编译。
答案 0 :(得分:3)
(如果我可以使用IEEE754浮点,则限制答案。)
float
没有0.05
。 最近的号码可以代表
0.0500000007450580596923828125
所发生的事情是,稍微的值大于您认为添加到alpha
的值,这足以只是将其推到{ {1}}标记(出于兴趣,可以完全表示。)
1.0f
中的默认格式是将print
的数字稍微大于1.0f
。
总之,所有这一切都是由于二进制浮点通常没有精确的十进制表示。