程序的输出是无限的。为什么?

时间:2014-06-07 04:21:18

标签: c

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

为什么它的输出是无限的?任何人都可以告诉我应该做些什么来使这个有限?

4 个答案:

答案 0 :(得分:2)

在你想迭代浮点数的情况下,你应该考虑迭代整数并除以浮点数

在你的情况下:

#include<stdio.h>
main()
{
  int i=0;
  while(i!=10)
  {
      i+=1;
      printf("%f",i/10.0f);
  }
}

通过这种方式,您可以获得最佳近似值,并且不会因添加浮点数而累积舍入误差。

答案 1 :(得分:2)

循环是无限的,因为在计算机的浮点运算下,添加0.1十次不等于1.

这是因为计算机使用二进制数来进行算术运算,而数字0.1不能表示为终止二进制数。因此,计算机必须选择一个二进制数,该二进制数确实终止并且适合float作为0.1的近似值。遗憾的是,将这种近似值的十个副本一起添加并不会产生等于1的浮点数是不够精确的。

如果更改循环中的格式字符串以显示更高的精度,则可以看到循环中i的值不准确:

0.10000000149011611938
0.20000000298023223877
0.30000001192092895508
0.40000000596046447754
0.50000000000000000000
0.60000002384185791016
0.70000004768371582031
0.80000007152557373047
0.90000009536743164062
1.00000011920928955078

通常,您不应该将浮点数进行比较以获得相等性。您可以使用不等式比较,检查两个数字是否几乎相等,它们的差异是否小于epsilon的某个小固定值,或者使用整数进行迭代,并且只在需要时转换为浮点数。其他答案已经解释了这些替代方案,所以我不会在这里进入。

答案 2 :(得分:0)

浮点数不准确。

因此,像平等这样的东西很久以前已经飞出了窗外。

答案 3 :(得分:0)

你无法比较那样的浮点数,因为它们不精确。你可以在一个范围内检查。

#define epsilon 0.000005

main()
{
  float i=0.0;
  while(!(i > 1.0 - epsilon && i < 1.0 + epsilon))
  {
      i+=0.1;
      printf("%f",i);
  }
  getch();
}