为什么这件作品输出NAN(非数字)?

时间:2015-07-25 21:30:26

标签: c++ runtime-error

我正在尝试使用STL实现最接近的配对问题,我特别在基础条件本身面临问题!

如果我尝试打印(1,1)和(0,0)之间的距离,这段代码会返回nan。预期的输出是至少一些数字,我的意思是我认为我没有搞砸这个但它不起作用!!!!!

注意:我尝试过测试距离 距离(make_pair(make_pair(1,1),make_pair(0,0)))并给出正确的输出。我认为还有其他一些我想念的东西

基本条件(注意我过度使用了对,但没关系):

if(R-L+1<=3)
{
    int i,j;
    double Temp=1000000.00;
    pair < pair < int , int > , pair < int  , int > >ret;
    for(i=L;i<R;++i)
    {
        for(j=i+1;j<=R;++j)
        {
            pair < pair < int , int > , pair < int , int > >PEE=make_pair(X[i],X[j]);
            cout<<distance(PEE)<<" ";//This statement outputs nan!!
            if(distance(PEE)<Temp)
            {
                ret=PEE;
                Temp=distance(ret);
            }

        }
    }

    return ret;
}

那个cout声明不会给出正确的输出!!

这里,ret是要返回的点(最近对)。用于存储距离的温度。

整体功能:

pair < pair < int , int > , pair < int , int > > Divide(int L,int R)
{
    if(R-L+1<=3)
    {
        int i,j;
        double Temp=1000000.00;
        pair < pair < int , int > , pair < int  , int > >ret;
        for(i=L;i<R;++i)
        {
            for(j=i+1;j<=R;++j)
            {
                pair < pair < int , int > , pair < int , int > >PEE=make_pair(X[i],X[j]);
                cout<<distance(PEE)<<" ";
                if(distance(PEE)<Temp)
                {
                    ret=PEE;
                    Temp=distance(ret);
                }

            }
        }

        return ret;
    }

    int M=(R+L)/2;
    pair < pair < int , int > , pair < int , int > > P1=Divide(L,M),Chota;
    pair < pair < int , int > , pair < int , int > > P2=Divide(M+1,R);
    double Delta;
    if(distance(P1)<distance(P2))
        {
            Delta=distance(P1);
            Chota=P1;
        }
    else
        {
            Delta=distance(P2);
            Chota=P2;
        }
    pair < pair < int , int > , pair < int , int > > P3=Merge(L,R,Delta);
    if(distance(P3)<distance(Chota))
        return P3;
    else
        return Chota;

}

距离函数:

 double distance(pair < pair < int , int > , pair < int , int > > P)
{
    return (double)sqrt(SQUARE(P.first.first-P.second.first)+SQUARE(P.first.second-P.second.second));
}

SQUARE的宏:

#define SQUARE(x)  (x*x)
#define MOD(X)  (X>0?X:-1*X)

现在整个程序以防你需要它。!

#include<bits/stdc++.h>
#define SQUARE(x)  (x*x)
#define MOD(X)  (X>0?X:-1*X)
using namespace std;
pair < int , int > P[5000+1],X[5000+1],Y[5000+1];

 double distance(pair < pair < int , int > , pair < int , int > > P);

 pair < pair < int , int > , pair < int , int > > Merge(int L , int R, double Delta)
 {
     pair < int , int > Copy[R-L+1],Temp=X[(R+L)/2];
     int i,j,k=0;
     for(i=L;i<=R;++i)
         if(MOD(Temp.first-Y[i].first)<=Delta+1e-9)
            Copy[k++]=Y[i];
     const int Size=k;
     double Dis=10000000;
     pair < pair < int , int > , pair < int , int > > ret;
     for(i=0;i<Size;++i)
     {
         for(j=i+1;j<=i+7 && j<Size; ++j)
            {
                if(distance(make_pair(Copy[i],Copy[j]))<Dis)
                   {
                        ret=make_pair(Copy[i],Copy[j]);
                        Dis=distance(ret);
                   }
            }
     }
     return ret;
 }

pair < pair < int , int > , pair < int , int > > Divide(int L,int R)
{
    if(R-L+1<=3)
    {
        int i,j;
        double Temp=1000000.00;
        pair < pair < int , int > , pair < int  , int > >ret;
        for(i=L;i<R;++i)
        {
            for(j=i+1;j<=R;++j)
            {
                pair < pair < int , int > , pair < int , int > >PEE=make_pair(X[i],X[j]);
                cout<<distance(PEE)<<" ";
                if(distance(PEE)<Temp)
                {
                    ret=PEE;
                    Temp=distance(ret);
                }

            }
        }

        return ret;
    }

    int M=(R+L)/2;
    pair < pair < int , int > , pair < int , int > > P1=Divide(L,M),Chota;
    pair < pair < int , int > , pair < int , int > > P2=Divide(M+1,R);
    double Delta;
    if(distance(P1)<distance(P2))
        {
            Delta=distance(P1);
            Chota=P1;
        }
    else
        {
            Delta=distance(P2);
            Chota=P2;
        }
    pair < pair < int , int > , pair < int , int > > P3=Merge(L,R,Delta);
    if(distance(P3)<distance(Chota))
        return P3;
    else
        return Chota;

}

bool cmp(pair < int , int > A , pair < int , int > B){return A.second<B.second;}
int main()
{


    int N,i;
    scanf("%d",&N);
    for(i=0;i<N;++i)
        {
            scanf("%d%d",&P[i].first,&P[i].second);
            Y[i]=X[i]=P[i];
        }

    sort(X,X+N);
    sort(Y,Y+N,cmp);
    Divide(0,N-1);
    return 0;
}

 double distance(pair < pair < int , int > , pair < int , int > > P)
{
    return (double)sqrt(SQUARE(P.first.first-P.second.first)+SQUARE(P.first.second-P.second.second));
}

2 个答案:

答案 0 :(得分:3)

#define SQUARE(x)  (x*x)

可能会导致负值,例如

cout << SQUARE(-1-2) << endl;

-1 - 2*-1 - 2中得到解决并生成-1

避免使用宏要好得多,但是如果使用这个宏,请将其设为

#define SQUARE(x)  ((x)*(x))

答案 1 :(得分:2)

使用#logo-image{ position: absolute; top: 35%; left: 50%; transform: translate(-50%, -50%); max-width: 400px; } .portal-images { text-align: center; } .portal-images img { -webkit transition: 0.5s; -moz-transition: 0.5s; -o-transition: 0.5s; transition: 0.5s; } .portal-images img:hover { margin-top: -100px; text-shadow: 2px 2px yellow; } .caption { font-family: 'open sans'; display: block; font-size: 1.4em; color: white; font-weight: 300; }通过预处理步骤运行此操作可以清楚地显示宏用法导致的问题。在预处理之前:

g++ -E
预处理后

 double distance(pair < pair < int , int > , pair < int , int > > P)
{
    return (double)sqrt(SQUARE(P.first.first-P.second.first)+SQUARE(P.first.second-P.second.second));
}

这几乎肯定不是你想要的。正如您所看到的,这可以为double distance(pair < pair < int , int > , pair < int , int > > P) { return (double)sqrt((P.first.first-P.second.first*P.first.first-P.second.first)+(P.first.second-P.second.second*P.first.second-P.second.second)); } 产生一个负面的参数,然后它将为您提供您所看到的NaN。

要正确编写宏,你可以看到AlexD的答案,但老实说,我认为这里更好的方法是不使用宏,只使用方形函数和标准库中的sqrt函数。