我有一个程序:
int main()
{
float f = 0.0f;
int i;
for (i = 0 ; i < 10 ; i++)
f = f + 0.1f;
if (f == 1.0f)
printf("f is 1.0 \n");
else
printf("f is NOT 1.0\n");
return 0;
}
始终打印f is NOT 1.0
。我知道这与C中的浮点精度有关。但我不确定它到底是什么搞砸了。有人可以解释一下为什么不打印另一条线?
答案 0 :(得分:4)
二进制浮点不能精确地表示值0.1,因为它的二进制扩展没有有限的位数(与1/7的十进制扩展没有完全相同)。
0.1的二进制扩展是
0.000110011001100110011001100...
当被截断为IEEE-754单精度时,这大约是十进制的0.100000001490116119
。这意味着每次向变量添加“接近0.1”值时,都会累积一个小错误 - 因此最终值略高于1.0
。
答案 1 :(得分:2)
你无法比较像这样的花车。您需要定义阈值并根据该阈值进行比较。 This博客文章解释
答案 2 :(得分:2)
对于浮点数,在比较它们时应始终使用epsilon值:
#define EPSILON 0.00001f
inline int floatsEqual(float f1, float f2)
{
return fabs(f1 - f2) < EPSILON; // or fabsf
}
答案 3 :(得分:2)
这相当于将0.33加在一起3次(0.99),并想知道为什么它不等于1.0。
您可能希望阅读What Every Programmer Should Know About Floating Point Arithmetic