|
今天在国外一个新闻组上看到一个比较经典的错误,有一个人写了这样一段代码:
#i nclude <iostream> using namespace std;
int main() { double num, num2; for (num=-30; num<=30; num+=0.1) { num2=-2*(num*num)+3*(num); if (num2==1) cout << num << endl; } return(0); } 他在新闻组上问为什么得不到为1的输出结果,回贴的人非常多,差不多都能指出这是因为计算机浮点数计算造成的问题。我在写程序的时候也遇到过这个问题,于是就写个文章来说明一下。因为计算机不能表示精确的数值,这是大家都知道的,所以在这里double*double的值也不是精确的,再怎么算,1也不一定是1,而可能是0.999999或者1.000001之类的值,至于具体是什么值就要看机器了。而且用==运算符来判断double型或者是float型的数值本身就是不正确的,应该用abs(x-1)<=0.00....来判断一个double型或者是float型数值的大小。在分形图形的绘制里面,因为经常涉及到过大或者是过小的数据,而且经常要判断是否跳出循环,所以在里面也常用这种方式做判断。
|