作者在 2011-08-08 11:44:17 发布以下内容
暂时用C++的例子(引用《C++程序设计学习指导与习题答案 (第2版)》)。
示例2.14
#include<iostream>
using namespace std;
int main()
{
//illustrates round-off error::
double x=1000/3.0; //x=1000/3
cout<<"x="<<x<<endl;
double y=x-333.0; //y=1/3
cout<<"y="<<y<<endl;
double z=3*y-1.0; //z=3*(1/3)-1
cout<<"z="<<z<<endl;
if(z==0)
cout<<"z==0.\n";
else
cout<<"z does not equal 0.\n";
return 0;
}
运行结果(本人用VC++6.0):using namespace std;
int main()
{
//illustrates round-off error::
double x=1000/3.0; //x=1000/3
cout<<"x="<<x<<endl;
double y=x-333.0; //y=1/3
cout<<"y="<<y<<endl;
double z=3*y-1.0; //z=3*(1/3)-1
cout<<"z="<<z<<endl;
if(z==0)
cout<<"z==0.\n";
else
cout<<"z does not equal 0.\n";
return 0;
}
x=333.333
y=0.333333
z=-5.6843e-014
注意:z不等于0.
在准确的算术中,变量具有的值为x=333又1/3,y=1/3,z=0。但1/3无法准确地表示为一个浮点值。这种不精确性反映在z的余数值上。
因此最好避免测试浮点型的相等性。