1

我遇到了一个问题,我的 X 平方总是变得无限,导致结果距离也是无限的,但是我看不出我自己的数学有什么问题:

// Claculate distance

xSqr = (x1 - x2) * (x1 - x2);
ySqr = (y1 - y2) * (y1 - y2);
zSqr = (z1 - z2) * (z1 - z2);

double mySqr = xSqr + ySqr + zSqr;

double myDistance = sqrt(mySqr);

当我运行我的程序时,我会为每个坐标获取用户输入,然后在运行计算后显示距离。

4

3 回答 3

9

如果您的输入是 single-precision float,那么如果您强制执行双精度算术应该没问题:

xSqr = double(x1 - x2) * (x1 - x2);
//     ^^^^^^

如果输入已经是双精度的,并且您没有更大的浮点类型可用,那么您需要重新排列欧几里德距离计算以避免溢出:

r = sqrt(x^2 + y^2 + z^2)
  = abs(x) * sqrt(1 + (y/x)^2 + (z/x)^2)

其中x是三个坐标距离中最大的一个。

在代码中,这可能类似于:

double d[] = {abs(x1-x2), abs(y1-y2), abs(z1-z2)};
if (d[0] < d[1]) swap(d[0],d[1]);
if (d[0] < d[2]) swap(d[0],d[2]);
double distance = d[0] * sqrt(1.0 + d[1]/d[0] + d[2]/d[0]);

或者,使用hypot,它使用类似的技术来避免溢出:

double distance = hypot(hypot(x1-x2,y1-y2),z1-z2);

尽管这在 2011 之前的 C++ 库中可能不可用。

于 2013-01-28T18:35:49.243 回答
2

试试这个:

long double myDistance=sqrt(pow(x1-x2,2.0)+pow(y1-y2,2.0)+pow(z1-z2,2.0));
于 2013-01-28T18:20:46.167 回答
0

我弄清楚发生了什么,我复制并粘贴了设置 x1、y1 和 z1 的代码,却忘记将其更改为 x2 y2 和 z2,这对我来说总是最愚蠢的事情:P 无论如何,谢谢你们的帮助

于 2013-01-28T18:37:57.320 回答