Squareroot возвращает не число в C ++ - PullRequest
1 голос
/ 21 января 2012

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

6 голосов
/ 21 января 2012

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

sqrt(xdiff - ydiff)

но

sqrt(xdiff + ydiff)

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

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

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

1 голос
/ 21 января 2012

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

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

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

1 голос
/ 21 января 2012

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

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

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

...