Рассчитать широту / долготу - PullRequest
0 голосов
/ 16 января 2012

Может ли кто-нибудь помочь мне выяснить алгоритм вычисления широты и долготы по 8-байтовому значению?

8-байтовое значение - A027AFDF5D984840 и его долгота 49.1903648 8-байтовое значение - 3AC7253383DD4B40 и его широта 55,7305664

Также, если возможно, подскажите, пожалуйста, как рассчитать значение с плавающей запятой 00000000005A40 как 106,0

1 Ответ

0 голосов
/ 16 января 2012

Это не только для расчета долготы и широты.Учитывая, что у вас есть 8 байтов для работы с вашими примерами, вам нужно преобразовать байтовый массив в значения с плавающей запятой двойной точности.Процесс одинаков для всех трех примеров.

Чтобы найти значение с плавающей запятой, вам нужно иметь дело с байтовым массивом на уровне битов.Объяснение процесса здесь .Или посмотрите Википедия .

Чтобы начать, в первом примере вы будете иметь дело с байтами порядка 40, 48, 98, 5D и так далее.Разбивая первые два байта 40 и 48 (0100 0000 0100 1000), у вас достаточно информации, чтобы получить знаковый бит (0) и диапазон битов экспоненты (100 0000 0100 -> 1028).Далее продолжите перечисление 52 оставшихся бит, чтобы определить дробную часть числа.Если вы будете следовать вычислениям по ссылкам выше, вы увидите значения с плавающей запятой, которые вы ожидаете от своих примеров.

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

РЕДАКТИРОВАТЬ: Пример

Чтобы преобразовать массив байтов в число с плавающей запятой двойной точностизначение, нам потребуется три части информации из байтового массива: знаковый бит (S) , показатель (E) и дробь (F) ,Первое, что нужно сделать, это создать 64-битное представление массива из 8 байтов.Как я уже упоминал выше, вы будете использовать байты в «обратном» порядке (little-endian, если вы хотите читать по теме).Я буду использовать только первые четыре байта, так как их будет достаточно для иллюстрации процесса.

40 48 98 5D ==> 01000000 01001000 10011000 01011101

Я буду ссылаться на приведенные выше биты всамый левый порядок 0.

Знаковый бит: Это 0-й бит в приведенном выше массиве.В этом случае S равно 0. Знаковый бит - это именно то, что вы думаете, он определяет, будет ли результат с плавающей запятой отрицательным или положительным.

Показатель степени: Биты 1-11 определяют показатель степени.В этом примере показатель степени E равен 100 0000 0100 ==> 1028.

Fraction: Остальные биты 12-63 определяют дробь.Я только проиллюстрировал биты 12-31, чтобы показать, как работает процесс: 1000 10011000 01011101 ....

Дробные биты не преобразуются в десятичное значение.Вместо этого вам нужно перебирать их, обращая внимание на установленные биты (1, а не 0).Здесь важен индекс битов.Рассмотрим дробные биты, индексированные начиная с 1, увеличивая слева направо до 20. Опять же, в полном примере (биты 12-63) это индексирование будет от 1 до 52.

Дробь определяется путем суммирования каждогоя установил бит, используя это выражение: 2 ^ -i.Для данного примера это означает, что мы имеем дело с индексами 1,5,8,9,14,16,17,18,20.

Первые четыре индекса дадут нам достаточно точности для целей примера:

F = (2 ^ -1) + (2 ^ -5) +(2 ^ -8) + (2 ^ -9) + ... = 0,5 + 0,03125 + 0,00390625 + 0,001953125 = 0,537109375

Окончательное значение V находится с помощью формулы:

V = -1 ^ S * 2 ^ (E-1023) * (1 + F) = -1 ^ 0 + 2 ^ (1028-1023) * 1,537109375 = 49,1875

Это хорошее приближение к вашей цели 49,1903648.Если вы продолжите использовать полный битовый диапазон, как я вам показал, ваше окончательное значение будет совпадать.

Наконец, поскольку вы упомянули, что используете Java, вы взглянули на использование ByteBuffer класс и getDouble функция здесь ?

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