#include<stdio.h>
#include<conio.h>
main()
{
  float i=0.0;
  while(i!=1.0)
  {
      i+=0.1;
      printf("%f",i);
  }
  getch(
}

为什么它的输出是无限的?有人能告诉我应该做些什么来限制它吗?

最佳答案

循环是无限的,因为在计算机的浮点运算下,加0.1十次不等于1。
这是因为计算机使用二进制数进行算术运算,而数字0.1不能表示为终止二进制数。因此,计算机必须选择一个二进制数,该二进制数终止并符合一个近似于0.1的float。不幸的是,将这个近似值的十个副本加在一起不会产生一个等于1的浮点数,这是不够精确的。
如果更改循环中的格式字符串以显示更高的精度,则可以看到循环中i的值不精确:

0.10000000149011611938
0.20000000298023223877
0.30000001192092895508
0.40000000596046447754
0.50000000000000000000
0.60000002384185791016
0.70000004768371582031
0.80000007152557373047
0.90000009536743164062
1.00000011920928955078

一般情况下,不应比较浮点数是否相等。您可以使用不等式比较,检查两个数字的差是否小于epsilon的某个小固定值,或者使用整数进行迭代,并且只在需要时转换为浮点。其他的答案已经解释了这些选择,所以我不在这里讨论它们。

08-16 00:05