Как рассчитать расстояние между двумя координатами (без поплавков)? - PullRequest
2 голосов
/ 08 марта 2012

Мне нужно вычислить расстояние между двумя координатами (lon, lat) во встроенной системе, которая не имеет типа с плавающей запятой (доступны только целые числа, поэтому нет тригонометрических функций и операций с плавающей запятой, таких как sqrt).

Точки очень близки друг к другу, поэтому точность не является проблемой.

Поэтому я не могу использовать Формула Хаверсайна .Я также не могу использовать этот простой алгоритм, основанный на теореме Пифагора и равносторонней проекции :

x = Δlon * cos(lat)
y = Δlat
d = R * √(x² + y²)

, потому что у меня нет функций cos и sqrt.Может быть, я мог бы как-то реализовать их, но этот алгоритм должен быть быстрым (встроенная система).

Моя лучшая ставка - теорема Пифагора, но как получить от градусов до метров без тригонометрических функций (и без sqrt)?

Ответы [ 4 ]

3 голосов
/ 08 марта 2012

Традиционно моряки использовали бы таблицы перемещений для такого рода вычислений - см. Главу 24 American Practical Navigator .Что говорит о том, что если trig и sqrt находятся вне уравнения, вы можете реализовать таблицу поиска - пространство для торговли для сложности.В зависимости от ваших точных потребностей вам может понадобиться только таблица частичного перемещения для интересующих вас широт.

2 голосов
/ 09 марта 2012

На самом деле, у вас до есть функция sqrt, доступная вам. Проверьте метод Ньютона . Он не идеален, учитывая, что у вас, очевидно, есть целые числа для работы, что я имею в виду, что ваши мантиссы будут отрубаться на каждом шаге, но это вариант. Существуют также и другие квадратно-корневые приближения. (Для реализации функции косинуса, возможно, вы могли бы использовать приближение Тейлора, но я не уверен, насколько хорошо это сработало бы здесь.)

0 голосов
/ 08 марта 2012

В зависимости от вашего варианта использования, расстояние такси / городской квартал может быть полезным: https://en.wikipedia.org/wiki/Taxicab_geometry

0 голосов
/ 08 марта 2012

Каждый градус на земле составляет 111133,333 метра.

Другое дело, как туда добраться без sqrt! Я немного растерялся, чтобы подумать, какую систему / программное обеспечение вы используете, у которого нет этой базовой математической функциональности?

Вы можете обойти проблему с плавающей запятой, подняв все до степени, скажем, 1000. Это то, что мы привыкли делать с Java ME (если я правильно помню !!!)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...