Проблему вказує слово "добре кондиціонований". Це питання комп’ютерної арифметики, а не математики.
Ось основні факти, які слід врахувати:
Один радіан на землі охоплює майже 10 ^ 7 метрів.
Косинусна функція для аргументів x поблизу 0 приблизно дорівнює 1 - x ^ 2/2.
Плаваюча точка з подвійною точністю містить близько 15 десяткових цифр точності.
З точок (2) і (3) випливає, що коли х становить близько одного метра, або 10 ^ -7 радіанів (точка 1), втрачається майже вся точність: 1 - (10 ^ -7) ^ 2 = 1 - 10 ^ - 14 - це обчислення, в якому перші 14 з 15 значущих цифр усі скасовують, залишаючи лише одну цифру для відображення результату. Перевернути це навколо (що і робить зворотний косинус, "acos") означає, що обчислення acos для кутів, що відповідають відстаням довжини метра, не може бути виконано з якоюсь значущою точністю. (У певних поганих випадках втрата точності дає значення, коли acos навіть не визначено, тому код вийде з ладу і не дасть відповіді, дурницької відповіді або зламає машину.) Подібні міркування пропонують вам уникати використання зворотного косинуса якщо задіяно відстань менше кількох сотень метрів, залежно від того, яку точність ви готові втратити.
Роль, яку відіграють аксоси у формулі наївного закону косинусів, - це перетворення кута на відстань. Цю роль відіграє atan2 у формулі гаверсину. Тангенс малого кута x приблизно дорівнює самому x . Отже, обернена дотична кількість числа, будучи приблизно таким числом, обчислюється по суті, не втрачаючи точності. Ось чому формула Гаверсина, хоча математично еквівалентна закону формули косинусів, набагато перевершує невеликі відстані (порядку 1 метр або менше).
Ось порівняння двох формул із використанням 100 випадкових пар точок на земній кулі (з використанням обчислень подвійної точності Mathematica).
Видно, що на відстані менше 0,5 метра дві формули розходяться. Вище 0,5 метра вони, як правило, погоджуються. Щоб показати, наскільки тісно вони згодні, наступний сюжет показує співвідношення закону косинусів: геверин дає результати для ще 100 випадкових пар точок, причому їх широти та довготи довільно відрізняються до 5 метрів.
Це свідчить про те, що закон закону косинусів хороший до 3-4 знаків після коми, коли відстань перевищує 5-10 метрів. Кількість десяткових знаків точності збільшується квадратично; таким чином, на 50-100 метрів (один порядок) ви отримуєте точність 5-6 dp (два порядки); на 500-1000 метрів ви отримуєте 7-8 dp і т.д.