Java: тригонометрия и двойная неточность, вызывающая NaN - PullRequest
1 голос
/ 20 апреля 2011

У меня есть формула расстояния, использующая широту и долготу:

distance = EARTH_MILES_RADIUS
    * Math.acos(Math.sin(lat1 / RADIAN_CONV)
    * Math.sin(lat2 / RADIAN_CONV)
    + Math.cos(lat1 / RADIAN_CONV)
    * Math.cos(lat2 / RADIAN_CONV)
    * Math.cos((lng2 - lng1) / RADIAN_CONV));

lat1, lng1, lat2, lng2 - двойные примитивы. Они приходят ко мне как двойные примитивы, и я ничего не могу с этим поделать.

Проблема в том, что когда у меня пара одинаковых значений долготы или широты, формула иногда возвращает NaN. Я полагаю, что это потому, что я принимаю арккосинус числа, немного превышающего 1, тогда как на самом деле оно должно быть ровно 1. У меня, вероятно, были бы проблемы, если бы точки были также противоположными, где они могли бы быть немного меньше - 1.

Как мне лучше решить эту проблему?

Ответы [ 3 ]

1 голос
/ 20 апреля 2011

Если вы действительно рассчитываете расстояние большого круга, как я думаю, вам следует использовать формулу Винсенти вместо того, что вы имеете.

http://en.wikipedia.org/wiki/Great-circle_distance

1 голос
/ 20 апреля 2011

Проверьте два очень близких (идеально равных) значения в вашем коде.Например:

boolean doubleApproxEqual(double a, double b) {
    double PRECISION = 0.000001;
    if (Math.abs(a-b) < PRECISION) //not sure what the name of the function is
                                   //cannot be bothered to check
        return true;
    return false;
}

если вы получаете True, сделайте cos (1.0) или что-то еще

0 голосов
/ 11 августа 2011

Достаточно просто проверить равенство, чтобы решить мою проблему:

if (lat1 == lat2 && lng1 == lng2) ...
...