【发布时间】:2017-01-24 13:23:50
【问题描述】:
比较浮点值时出现意外行为,我知道浮点数可能存在舍入精度问题,但这里的数字非常具体地反映了这些问题。
#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) 进行编译。
【问题讨论】:
-
如果您要打印
alpha带有更多有效数字(例如printf("%.7f\n", alpha);),那么您会立即看到问题:ideone.com/zwQW7e。 -
您必须知道 0.05f 的常数是否比准确表示 0.05 的无限位流略小或略大。据推测,它稍微大一点。
-
看看这个(这是我用来构建答案的):exploringbinary.com/floating-point-converter
-
@Bathsheba:考虑到“做我的功课”和“运算符/语句 xyx 是什么意思”问题的数量,你是对的。确实只有少数 C 题没有重复。问题更多的是找到重复,因为新手使用错误/误导性的短语非常有创意。哦,我们也应该从海报中得到一些理由。否则,他们将无法在编程中取得任何进展。
标签: c gcc floating-point floating-accuracy