Squareroot возвращает не число в С++

В приведенной ниже программе я пытаюсь вычислить расстояние между двумя точками. Для этого я сделал два объекта 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;
}

person uyetch    schedule 21.01.2012    source источник
comment
Как вы думаете, что произойдет, если ydiff больше, чем xdiff?   -  person Jim H.    schedule 21.01.2012
comment
Проголосовали против; вопросы, которые (в основном) представляют собой просто гигантскую стену неурезанного кода, вряд ли будут актуальны или полезны кому-либо, кроме человека, задающего вопрос. Вы могли бы значительно упростить это, удалив все накладные расходы объекта Point и просто записав его как p1_x = 0; p1_y = 0; p2_x = 0; p2_y = 0; dist = sqrt((p2_x - p1_x) * (p2_x - p1_x) - (p2_y - p1_y) * (p2_y - p1_y));, который показывает ту же ошибку в пяти строках кода. И вы могли бы еще уменьшить его, так как вы знали, что проблема была в вызове sqrt()....   -  person Brooks Moses    schedule 21.01.2012


Ответы (4)


Ваша формула неверна. Это не

sqrt(xdiff - ydiff)

но

sqrt(xdiff + ydiff)

Вы пытаетесь получить sqrt(-1), которое действительно не является числом (или ненастоящим числом).

person craigmj    schedule 21.01.2012

Вот как разобраться в этом для себя или, по крайней мере, приблизиться к хорошему вопросу 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).

С другой стороны, в более сложных случаях и для проверки своей работы вы можете либо использовать отладчик для вывода значений аргументов, либо вставить операторы печати:

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?» или вопрос "Почему мой расчет расстояния пытается вычислить квадратный корень из отрицательного числа?"

Надеюсь, вы уже знаете ответ на первый вопрос, а второй вопрос должен указывать на то, что вам нужно перепроверить формулу расстояния, которая должна была дать вам ответ довольно быстро, но даже если вы не можете понять, почему это делая это, это, по крайней мере, делает более полезным вопрос, чтобы задать здесь.

person Brooks Moses    schedule 21.01.2012

Вы должны добавить сюда, а не вычесть:

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

Вычитание заставляет вас брать квадратный корень из -1 из-за входных данных, которые не являются (настоящими) числами.

person Jon    schedule 21.01.2012

Как сказал craigmj, формула для расстояния равна sqrt ((x1-x2) + (y1-y2)). Это сложение, а не вычитание. Что вы делаете, так это генерируете мнимое число (sqrt (-1)), которое вызовет ошибку.

Просто совет, но не создавайте деструктор, если он ничего не делает; вам будет предоставлен деструктор. Добавление деструктора, который ничего не делает, просто добавляет ненужный код и делает его более беспорядочным.

Также в функции getDistance вам не нужно использовать this ->getX() и this->getY(). Поскольку это функция-член, она имеет доступ к закрытым данным, поэтому вы можете напрямую обращаться к переменным через x и y.

person fdh    schedule 21.01.2012