Я работаю над классом PHP для некоторых функций геолокации. Чтобы помочь с созданием SQL-запросов для поиска предприятий в базе данных, я написал функции get_bounding_box_rads и get_bounding_box_grades. Идея состоит в том, что вы указываете широту и долготу точки и указываете безразмерные значения (вы можете указать мили, километры или фарлонги и т. д.) для радиуса земного шара и диапазона для поиска. Эта функция вернет ограничивающую рамку с минимальной и максимальной широтой и долготой, которую вы можете использовать в эффективном запросе для получения записей из вашей базы данных. Эффективен в том смысле, что запрос имеет простые сравнения «больше/меньше», поэтому можно использовать индексы, а не какие-то безумные вычисления расстояний по большому кругу, которые приводят к неприятному сканированию таблицы.
Моя проблема заключается в том, что ограничивающая рамка возвращает разные долготы (любопытно, что широты до сих пор кажутся одинаковыми) для вычислений, выполненных в градусах, и вычислений, выполненных в радианах. Я думаю, что эта разница возникает при расчете расстояния по кругу, который я позаимствовал из этой статьи в Википедии, в которой говорится:
Формула, точная для всех расстояний, представляет собой следующий частный случай формулы Винсенти для эллипсоида с равными большой и малой осями:
Формула:

Мой расчет (см. скрипт PHP ниже) возвращает разные значения долготы, в зависимости от того, выполняю ли я расчет в радианах или градусах:
радианы мин_широта 34.006625915236 max_lat 34.151356084764 мин_лон -118.35241157423 max_lon -118.17519642577
градусы мин_широта 34.006625915236 max_lat 34.151356084764 мин_лон -118.35117374123 max_lon -118.17643425877
Может ли кто-нибудь сказать мне причину разницы и как ее избежать? Если нет, то что точнее: градусы или радианы? Интересно, связано ли это с 32-битной или 64-битной ошибкой округления, или, возможно, я где-то допустил ошибку.
Вы сможете просто запустить следующий скрипт и понять, что я имею в виду