Square Root不是C ++中的数字

时间:2012-01-21 04:18:11

标签: c++ nan math.h

在下面的程序中,我试图计算两点之间的距离。为此,我制作了两个Point对象。在返回距离的方法中,我使用距离公式来计算空间中两点之间的距离。但是,每次运行程序时,我都会得到一个不是数字值,不应该存在。请帮忙。

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cmath>

using namespace std;

class Point
{
    public:
        Point(int a, int b);
        ~Point();
        double getDistance(Point& P2);
        void setPoints(int a, int b);
        int getX();
        int getY();
    private:
        int x;
        int y;
};

Point::Point(int a, int b)
{
    setPoints(a,b); 
}

Point::~Point()
{
    //Nothing much to do
}

void Point::setPoints(int a, int b)
{
    x = a;
    y = b;
}

double Point::getDistance(Point& P2)
{
    int xdiff = P2.getX()-this->getX();
    int ydiff = P2.getY()-this->getY();
    xdiff = xdiff*xdiff;
    ydiff = ydiff*ydiff;
    double retval =  sqrt((xdiff) - (ydiff));
    return retval;
}

int Point::getX()
{
    return x;
}

int Point::getY()
{
    return y;
}
int main(int argc, char* argv[])
{
    Point P1(0,0);
    Point P2(0,1);
    Point& pr = P2;
    cout<<P1.getDistance(pr)<<endl;
    return 0;
}

4 个答案:

答案 0 :(得分:6)

你的公式错了。这不是

sqrt(xdiff - ydiff)

sqrt(xdiff + ydiff)

你试图得到的sqrt(-1)确实不是数字(或不是实数)。

答案 1 :(得分:3)

以下是如何自己解决这类问题,或者至少更接近一个好的StackOverflow问题:

您知道问题出在sqrt()电话中。那么,它被称为什么?在这种情况下,您可以手动追踪计算:

int xdiff = P2.getX()-this->getX();    // this is 0 - 0, which is 0.
int ydiff = P2.getY()-this->getY();    // this is 1 - 0, which is 1.
xdiff = xdiff*xdiff;                   // this is still 0.
ydiff = ydiff*ydiff;                   // this is still 1.
double retval =  sqrt((xdiff) - (ydiff));  // this is sqrt(0 - 1), or sqrt(-1).

或者,在更复杂的情况下 - 并检查您的工作,您可以使用调试器打印出参数的值,也可以插入print语句:

xdiff = xdiff*xdiff;
ydiff = ydiff*ydiff;
cout << 'xdiff: ' << xdiff << ' ydiff: ' << ydiff << endl
cout << 'computing sqrt(' << xdiff - ydiff << ')' << endl
double retval =  sqrt((xdiff) - (ydiff));

无论哪种方式,您现在都知道您正在计算sqrt(-1),并且您可以尝试直接运行它以确认它确实产生了相同的结果。所以要么你有一个问题“为什么sqrt(-1)返回NaN?”或者问题“为什么我的距离计算试图计算负数的平方根?”

希望你已经知道第一个问题的答案,第二个问题应该表明你需要仔细检查你的距离公式,这应该很快就能给你答案 - 但即使你无法想象为什么它这样做,至少在这里提出一个更有用的问题。

答案 2 :(得分:1)

你应该在这里添加,而不是减去:

double retval =  sqrt((xdiff) - (ydiff));  // correct is +

减法会导致您输入-1的平方根,因为输入数据不是(实数)。

答案 3 :(得分:1)

正如craigmj所说,距离的公式是sqrt((x1-x2)+(y1-y2))。这不是减法。你做的是生成一个会导致错误的虚数(sqrt(-1))。

只是一个建议的提示,但如果它没有做任何事情,不要创建析构函数;将为您提供析构函数。添加不执行任何操作的析构函数只会添加不需要的代码并使其看起来更加混乱。

同样在getDistance函数中,您不需要使用它 - &gt; getX()和this-&gt;的getY()。由于这是一个成员函数,因此它可以访问私有数据,因此您可以通过x和y直接访问变量。