Я сталкиваюсь с проблемой, когда мой квадрат 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);
Когда я запускаю свою программу, я получаю пользовательский ввод для каждой из координат и затем отображаю расстояние после того, как я запустил расчет.
Если ваши входы одинарной точности 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);
хотя это может быть недоступно в библиотеках C ++ до 2011 года.
Попробуй это:
long double myDistance=sqrt(pow(x1-x2,2.0)+pow(y1-y2,2.0)+pow(z1-z2,2.0));
Я понял, что происходит, я скопировал и вставил код для установки x1, y1 и z1 и забыл изменить его на x2 y2 и z2, это всегда самое глупое со мной: P в любом случае спасибо за помощь, ребята