1.c++中浮点数注意
The important rule to remember is that powers of two and integer multiples thereof can be perfectly represented. everything else is an approximation.
这句话翻译过来意思就是:需要记住的重要规则是,2的幂和它的整数倍的幂可以被完美地表示出来。其他的都是近似值
所以浮点数比较的时候,要记住精确度。
2.浮点数比较代码
#include <iostream>
using std::cout;
using std::endl;
int main()
{
double e=0.0002;
double d1=2.2224;
double d2=2.2226;
double sub = d2 - d1;
cout << "e is: " << e << endl;
cout << "sub is: " << sub << endl;
if (sub == e){
cout << "Equal!" << endl;
}
else{
cout << "Not equal!" << endl;
}
return 0;
}
运行结果图:
是不是感觉很奇怪,明明打印出来结果一样,怎么会不相等?
如果断点调试,会发现,其实sub与e的是不一样,就如上面说了,sub与e都是近似表示,这个与浮点数的精准度有关系。
3.添加下面代码,输出看精准度就不同了
cout << "epsilon is: " << setprecision(20) <<e<< endl;
cout << "sub is: " << setprecision(20)<< sub << endl;
#include <iostream>
#include<iomanip>
using std::cout;
using std::endl;
int main()
{
double e=0.0002;
double d1=2.2224;
double d2=2.2226;
double sub = d2 - d1;
cout << "e is: " << e << endl;
cout << "sub is: " << sub << endl;
cout << "epsilon is: " << setprecision(20) <<e<< endl;
cout << "sub is: " << setprecision(20)<< sub << endl;
if (sub == e){
cout << "Equal!" << endl;
}
else{
cout << "Not equal!" << endl;
}
return 0;
}
4.解决方法
//使用 fabs(div)<e
#include <iostream>
#include<iomanip>
#include<cmath>
using std::cout;
using std::endl;
int main()
{
double e=0.0002;
double d1=2.2224;
double d2=2.2226;
double sub = d2 - d1;
cout << "e is: " << e << endl;
cout << "sub is: " << sub << endl;
cout << "epsilon is: " << setprecision(20) <<e<< endl;
cout << "sub is: " << setprecision(20)<< sub << endl;
if (fabs(sub) < e){
cout << "Equal!" << endl;
}
else{
cout << "Not equal!" << endl;
}
return 0;
}
在c/c++中使用浮点数的时候,记住,使用==会有意想不到的结果发生。浮点数是近似表示的,不能简单的使用==。可以使用fabs(value) < e 来比较相等