This question already has answers here:
Closed 5 years ago.
Floating point inaccuracy examples
(7个答案)
C++ floating point precision [duplicate]
(5个答案)
我在174页找到了这个代码片段,这是一本关于C-Al Kelley,Ira Pohl的书。
int main()
{
 int cnt=0; double sum=0.0,x;
 for( x=0.0 ;x!= 9.9 ;x+=0.1)
 {
   sum=sum +x;
   printf("cnt = %5d\n",cnt++);
 }
 return 0;

}
就像书上说的那样,它变成了一个无限循环。它没有提到确切的原因,只是说这与机器的精度有关。
我修改了代码以检查
x=9.9分
如果加上以下几行,就永远不会变成事实,也就是说x达到了9.9
 diff=x-9.9;
 printf("cnt =10%d  \a x =%10.10lf  dif=%10.10lf \n",++cnt,x,diff);

我得到了输出中的以下几行
 cnt =1098   x =9.7000000000  dif=-0.2000000000
 cnt =1099   x =9.8000000000  dif=-0.1000000000
 cnt =10100   x =9.9000000000  dif=-0.0000000000
 cnt =10101   x =10.0000000000  dif=0.1000000000
 cnt =10102   x =10.1000000000  dif=0.2000000000

如果x正好达到值9.9,为什么它仍然是一个无限循环?

最佳答案

你只是把数字打印得太差,以至于没有注意到它不准确。试试这样的:

#include <stdio.h>

int main()
{
  double d = 9.9;

  if(d == 9.9)
  {
    printf("Equal!");
  }
  else
  {
    printf("Not equal! %.20f", d);
  }
}

我的机器上的输出:
Not equal! 9.90000000000000035527

这本书很可能试图教你不要使用==或!=比较浮点变量的运算符。同样的原因,不要使用float作为循环迭代器。

关于c - 机器的相等性测试和准确性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23647412/

10-16 11:10