-2

我有以下代码给出奇怪的输出

#include<stdio.h>
void main()
{
 float a, x;
 a=6.7;
 if(a==6.7)
  printf("1\n");
 else
  printf("2\n");


 x=8.5;
 if(x==8.5)
  printf("1\n");
 else
  printf("2\n");

}

输出

$ ./a.out 
2
1

如果我在 if 条件下给数字加上 f 例如“6.7f”,那么我得到正确的输出,我不明白为什么会出现这种奇怪的行为?

4

4 回答 4

5

float精度低于double,这将是用于浮点文字的默认类型。由于6.7不能用有限数量的二进制数字表示,因此不太精确float的表示不等于double表示。

于 2013-10-24T21:00:01.407 回答
4

6.7是双精度数,因此当您说a=6.7要将双精度数截断为浮点数时。

因为浮点数以 2 为底,而不是以 10 为底,所以不可能完全精确地表示 6.7。因此,当被截断为浮点数时,在这种情况下会丢失一些信息。8.5 不会发生同样的情况,因为 8.5 可以完全精确地以基数 2 存储。

然后,当您比较 ( a==6.7) 时,您是在比较不同的表示形式,如上所述,它们是不相等的。

于 2013-10-24T21:01:15.670 回答
4

无后缀的浮点文字属于类型double,而不属于类型float

6.7    /* double */
6.7f   /* float  */
于 2013-10-24T21:01:38.880 回答
3

计算机中浮点数的表示具有有限的准确性。您永远不应该使用 simple==来比较两个浮点数。相反,您可以使用

if(fabs(a-6.7) < epsilon) 其中epsilon是一些足够小的数字,但不小于计算机 FP 数字表示的精度(例如 FP32float或 FP64 double)。

编辑:正如在下面的讨论中指出的那样,永远不要使用应该改写为不可取的。有关详细信息,请参阅讨论,可能对经常在程序中使用浮点的人有用。此外,请记住此链接上的准确性问题部分可能很重要。

于 2013-10-24T21:03:31.107 回答