当前位置: 首页 > 知识库问答 >
问题:

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

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

为什么它的输出是无限的?有人知道应该做些什么来使这个有限吗?

共有3个答案

单于淇
2023-03-14

浮点数不精确。

因此,像平等这样的东西早就飞出窗外了。

巫马嘉祯
2023-03-14

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

在您的情况下:

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

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

葛烨
2023-03-14

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

这是因为计算机使用二进制数进行算术运算,数字0.1不能表示为终止二进制数。因此,计算机必须选择一个二进制数,该二进制数确实终止,并且适合于浮点,作为0.1的近似值。不幸的是,将该近似值的十个副本相加并不能创建等于1的浮点值,这是不够精确的。

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

0.10000000149011611938
0.20000000298023223877
0.30000001192092895508
0.40000000596046447754
0.50000000000000000000
0.60000002384185791016
0.70000004768371582031
0.80000007152557373047
0.90000009536743164062
1.00000011920928955078

通常,不应比较浮点数是否相等。您可以使用不等式比较,检查两个数字是否几乎相等,检查它们的差值是否小于ε的某个小固定值,或者使用整数进行迭代,并仅在需要时转换为浮点。其他答案已经解释了这些备选方案,所以我不在这里讨论它们。

 类似资料: