Проблема обозначена словом «хорошо обусловлено». Это вопрос компьютерной арифметики, а не математики.
Вот основные факты для рассмотрения:
Один радиан на земле охватывает почти 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 дп и т. д.