http://blog.sina.com.cn/s/blog_53a8498d0101a6cd.html
浮点数的精度和有效位影响比较的正确性,如:
/*浮点数的比较*/
#include <iostream>
using namespace std;
int main()
{
float f1 = 7.123456789;
float f2 = 7.123456785;
if ( f1==f2 ) cout<<"f1 equal to f2\n";
double d1 = 7.123456789;
double d2 = 7.123456785;
if ( d1!=d2 ) cout<<"d1 not equal to d2\n";
float f = 1.0/3.0;
double d = 1.0/3.0;
if ( f!=d ) cout<<"f not equal to d\n";
return 0;
return 0;
}
结果为:
f1 equal to f2
d1 not equal to d2
f not equal to d
由于十进制单精度浮点数的有效位数为7,两个前7位相等而后面不同的数有可能在计算机中表示为同一个浮点数,因为float表示的精度有限而不能分辨出其差异,这就是错误的根源。如果要分辨,则应该用表示能力更强的数据类型double或long double来表示这两个数。
提倡使用double,因为对于浮点数的运算在计算机内部也是先转换为double进行处理。
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
double d1 = 123456789.9*9;
double d2 = 1111111109.1;
cout<<"d1="<<d1<<" d2="<<d2<<endl;
if ( d1!=d2 ) cout<<"精确比较:d1 and d2 , Not same \n";
else cout <<"Same\n";
if ( abs(d1-d2)<1e-5 ) cout <<"近似比较:d1 and d2 , Same\n" ;
else cout <<"d1 and d2 , Not same\n";
return 0;
}
运行结果: