Фактически, когда Синнотт опубликовал формулу haversine, точность вычислений была ограничена. В настоящее время JavaScript (и большинство современных компьютеров и языков) используют 64-разрядные числа IEEE 754 с плавающей запятой, что обеспечивает 15 значительных показателей точности. С этой точностью простой сферический закон формулы косинусов (
cos c = cos a cos b + sin a sin b cos C
) дает хорошо обусловленные результаты на расстояниях до 1 метра. Ввиду этого, вероятно, в большинстве ситуаций стоит использовать либо более простой закон косинусов, либо более точную эллипсоидальную формулу Винсенти в предпочтении хаверсину! (принимая во внимание примечания ниже об ограничениях в точности сферической модели).
Источник: http://www.movable-type.co.uk/scripts/latlong.html
В чем причина того, что закон косинусов более предпочтителен?
Примечание: цитируемый текст был обновлен его автором, как указано ниже .
источник
Ответы:
Проблема обозначена словом «хорошо обусловлено». Это вопрос компьютерной арифметики, а не математики.
Вот основные факты для рассмотрения:
Один радиан на земле охватывает почти 10 ^ 7 метров.
Функция косинуса для аргументов x около 0 приблизительно равна 1 - x ^ 2/2.
Плавающая точка двойной точности имеет около 15 десятичных знаков точности.
Точки (2) и (3) подразумевают, что когда x составляет около одного метра или 10 ^ -7 радиан (точка 1), почти вся точность теряется: 1 - (10 ^ -7) ^ 2 = 1 - 10 ^ - 14 - это расчет, в котором все первые 14 из 15 значащих цифр отменяются, оставляя только одну цифру для представления результата. Отражение вокруг этого (что делает обратный косинус, «acos») означает, что вычисление acos для углов, которые соответствуют расстояниям в метр, не может быть выполнено с какой-либо значимой точностью. (В некоторых плохих случаях потеря точности дает значение, при котором acos даже не определен, поэтому код сломается и не даст ответа, бессмысленного ответа или вылетит из строя.) Аналогичные соображения показывают, что вам следует избегать использования обратного косинуса если задействованы расстояния менее нескольких сотен метров, в зависимости от того, какую точность вы готовы потерять.
Роль acos в наивной формуле закона косинусов заключается в преобразовании угла в расстояние. Эту роль играет atan2 в формуле haversine. Тангенс малого угла x приблизительно равен самому x . Следовательно, обратный тангенс числа, приблизительно равный этому числу, вычисляется по существу без потери точности. Вот почему формула haversine, хотя математически эквивалентна формуле закона косинусов, намного лучше для небольших расстояний (порядка 1 метра или меньше).
Вот сравнение двух формул с использованием 100 случайных пар точек на земном шаре (с использованием вычислений Mathematica с двойной точностью).
Вы можете видеть, что для расстояний менее примерно 0,5 метра две формулы расходятся. Выше 0,5 метра они склонны соглашаться. Чтобы показать, насколько они согласны, на следующем графике показаны соотношения закона косинусов: результаты haversine для еще 100 пар случайных точек, их широта и долгота случайным образом различаются на величину до 5 метров.
Это показывает, что закон формулы косинусов хорош до 3-4 десятичных знаков после того, как расстояние превышает 5-10 метров. Количество десятичных разрядов точности увеличивается квадратично; таким образом, на 50-100 м (один порядок) вы получаете точность 5-6 dp (два порядка); на 500-1000 м вы получаете 7-8 дп и т. д.
источник
delta latitude > .1 || delta longitude > .1
чтобы динамически выбрать либо косинус (для больших), либо haversine (для небольших расстояний)? Для того, чтобы получить лучшую производительность и хорошую точность.atan2
Предлагает ли числовые преимущества сверхasin
? Я видел тесты, где ониatan2
были в 2-3 раза медленнееasin
, и намsqrt
тоже нужна секунда .asin
это по сути то же самое, чтоacos
и, следовательно, страдает от той же потери точности для определенных значений - в данном случае для аргументов около 1 и -1. В принципеatan2
такой проблемы нет.Историческая сноска:
Гаверсин был способом избежать больших ошибок округления в вычислениях, таких как
когда х мало. С точки зрения haversine мы имеем
и 2 * sin (x / 2) ^ 2 можно точно вычислить, даже если x мало.
В старые времена формула haversine имела дополнительное преимущество в том, что избегала добавления (что влекло за собой поиск по журналу, добавление и поиск по журналу). Считалось, что тригонометрическая формула, которая влечет только умножения, находится в «логарифмической форме».
В настоящее время использование формул haversine является слегка анахроничным. Может быть, что угол x выражен в терминах
sin(x)
иcos(x)
(и x может быть не известен явно). В этом случае вычисление1 - cos(x)
по формуле haversine влечет за собой арктангенс (чтобы получить угол x), деление пополам (чтобы получитьx/2
), синус (чтобы получитьsin(x/2)
), квадрат (чтобы получитьsin(x/2)^2
) и окончательное удвоение. Вы гораздо лучше, используя оценкучто не влечет за собой оценки тригонометрических функций. (Очевидно, используйте правую сторону, только если
cos(x) > 0
; в противном случае, можно использовать1 - cos(x)
напрямую.)источник
Формула косинуса может быть реализована в одну строку:
Формула haversine занимает несколько строк:
Математически они идентичны, поэтому единственное отличие состоит в практичности.
источник
atan2
формулу, связанную с компьютером , ничто не мешает переписать 4 строки выше в одну формулу.atan2(sqrt(a), sqrt(1-a))
так же, какasin(sqrt(a))