C/C++ 浮点数大小比较问题

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 来比较相等

猜你喜欢

转载自blog.csdn.net/zqw_yaomin/article/details/81434259