双倍不比较c ++

时间:2016-04-20 13:27:01

标签: c++ stl

我正在编写一个c ++函数来从矩阵中定位给定的double(即返回索引,如(i,j))。 这是我写的功能:

std::pair<int,int> locate(std::vector<std::vector<double> >&t, double d) {
 std::pair<int,int> p = make_pair(0,0); // initialising
 cout<<"double given : "<<d<<"\n";
 for (int i = 0; i < t.size(); ++i)
 {
    for (int j = 0; j < t[i].size(); ++j)
    {
        if (d==t[i][j])
        {
            p = make_pair(i,j);
            cout<<"YES";
            return p;
        }
        else {
            cout<<"NO ";
            continue;
        }
    }
    cout<<"\n";
 }
}

给定的矩阵是

50400.5 43220.8 46053.4 46700.8 44800.8  
50460.5 43160.8 46293.4 46640.8 44540.8  
50620.5 43220.8 45833.4 46720.8 44480.8

,我得到的输出是

double given : 43220.8
NO NO NO NO NO 
NO NO NO NO NO 
NO NO NO NO NO 
43220.8 : 0,0

我正在调用它

std::pair<int,int> p;
double d = 43220.8;
p = locate(raw_1_set_man,d); // raw_1_set_man is the matrix
cout<<"43220.8 : "<<p.first<<","<<p.second<<"\n";

控制未进入if块
我哪里做错了?

1 个答案:

答案 0 :(得分:1)

使用epsilon进行比较:

bool doubleEqual(double d1, double d2, double epsilon = std::numeric_limits<T>::epsilon())
{
    return d1 <= d2 + epsilon && d1 + epsilon >= d2;
}

或某些更符合您目的的epsilon。不过,请谨慎使用此方法,并考虑对此答案的评论以及对该问题的评论。