CcReRooT在C++中返回的不是一个数字
在下面的程序中,我试图计算两点之间的距离。为此,我制作了两个点对象。在返回距离的方法中,我使用了距离公式来计算空间中两点之间的距离。然而,每次我运行程序时,我都会得到一个不应该存在的数值。请帮忙CcReRooT在C++中返回的不是一个数字,c++,nan,math.h,C++,Nan,Math.h,在下面的程序中,我试图计算两点之间的距离。为此,我制作了两个点对象。在返回距离的方法中,我使用了距离公式来计算空间中两点之间的距离。然而,每次我运行程序时,我都会得到一个不应该存在的数值。请帮忙 #include <iostream> #include <cstdlib> #include <cstdio> #include <cmath> using namespace std; class Point { public:
#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;
}
你应该在这里加,而不是减:
double retval = sqrt((xdiff) - (ydiff)); // correct is +
由于输入数据不是实数,所以减法会使您取-1的平方根。您应该在此处进行加法,而不是减法:
double retval = sqrt((xdiff) - (ydiff)); // correct is +
由于输入的数据不是实数,减法会使您取-1的平方根。您的公式是错误的。不是
sqrt(xdiff - ydiff)
但是
您试图得到的sqrt-1实际上不是一个数字或不是一个实数。您的公式是错误的。不是
sqrt(xdiff - ydiff)
但是
你试图得到sqrt-1,它实际上不是一个数字或不是一个实数。正如克雷格姆杰所说,距离的公式是sqrt-x1-x2+y1-y2。这是加减法。您所做的是生成一个虚数sqrt-1,这将导致错误 这只是一个建议,但如果析构函数什么都不做,就不要创建它;将为您提供析构函数。添加一个不做任何事情的析构函数只会添加不需要的代码并使其看起来更混乱
同样在getDistance函数中,您不需要使用this->getX和this->getY。由于这是一个成员函数,它可以访问私有数据,因此您可以通过x和y直接访问变量。正如craigmj所说,距离的公式是sqrt x1-x2+y1-y2。这是加减法。您所做的是生成一个虚数sqrt-1,这将导致错误 这只是一个建议,但如果析构函数什么都不做,就不要创建它;将为您提供析构函数。添加一个不做任何事情的析构函数只会添加不需要的代码并使其看起来更混乱
同样在getDistance函数中,您不需要使用this->getX和this->getY。由于这是一个成员函数,它可以访问私有数据,因此您可以通过x和y直接访问变量。以下是如何为您自己解决这类问题,或者至少更接近一个好的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?还有一个问题,为什么我的距离计算要计算负数的平方根
希望你已经知道第一个问题的答案,第二个问题应该表明你需要再次检查你的距离公式,它应该很快告诉你答案-但是即使你不知道为什么它会这样做,这至少是一个更有用的问题。以下是如何自己解决这类问题,或者至少更接近一个好问题: 你知道问题出在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?还有一个问题,为什么我的距离计算要计算负数的平方根
希望你已经知道第一个问题的答案,第二个问题应该表明你需要再次检查你的距离公式,它应该很快告诉你答案-但是即使你不知道为什么它会这样做,至少在这里提出一个更有用的问题。如果ydiff大于xdiff,您认为会发生什么?被否决;大多数问题只是一堵巨大的未简化代码墙,除了提出问题的人之外,这些问题不太可能与任何人相关或对任何人都有帮助。您可以通过删除所有的点对象开销,并将其写成p1_x=0,从而大大简化这一过程;p1_y=0;p2_x=0;p2_y=0;dist=sqrtp2_x-p1_x*p2_x-p1_x-p2_y-p1_y*p2_y-p1_y;,这在五行代码中显示了相同的错误。你可以
e甚至进一步降低了它,因为您知道问题出在sqrt调用中……如果ydiff大于xdiff,您认为会发生什么;大多数问题只是一堵巨大的未简化代码墙,除了提出问题的人之外,这些问题不太可能与任何人相关或对任何人都有帮助。您可以通过删除所有的点对象开销,并将其写成p1_x=0,从而大大简化这一过程;p1_y=0;p2_x=0;p2_y=0;dist=sqrtp2_x-p1_x*p2_x-p1_x-p2_y-p1_y*p2_y-p1_y;,这在五行代码中显示了相同的错误。您甚至可以进一步减少它,因为您知道问题出在sqrt调用中。。。。