8 바이트 값에서 위도와 경도를 계산하는 알고리즘을 찾을 수 있습니까?위도/경도 계산
는8 바이트 값 - A027AFDF5D984840과의 경도 49.1903648
8 바이트 값입니다 - 3AC7253383DD4B40과의 위도는 또한 가능하면 55.7305664
그럼 어떻게 계산 방법을 가르쳐주십시오입니다 부동 소수점 값 0000000000805A40
8 바이트 값에서 위도와 경도를 계산하는 알고리즘을 찾을 수 있습니까?위도/경도 계산
는8 바이트 값 - A027AFDF5D984840과의 경도 49.1903648
8 바이트 값입니다 - 3AC7253383DD4B40과의 위도는 또한 가능하면 55.7305664
그럼 어떻게 계산 방법을 가르쳐주십시오입니다 부동 소수점 값 0000000000805A40
위도 및 경도 계산과 관련이 없습니다. 예제에서 8 바이트를 사용한다고 가정하면 바이트 배열을 배정도 부동 소수점 값으로 변환해야합니다. 이 과정은 세 가지 예 모두에서 동일합니다.
부동 소수점 값을 찾으려면 비트 수준에서 바이트 배열을 처리해야합니다. 프로세스에 대한 설명은 here입니다. 또는 Wikipedia을 확인하십시오.
첫 번째 예에서는 40, 48, 98, 5D 순으로 바이트를 처리합니다. 첫 번째 두 바이트, 40 및 48 (0100 0000 0100 1000)을 분해하면 부호 비트 (0)와 지수 비트 범위 (100 0000 0100 -> 1028)를 얻을 수있는 충분한 정보가 있습니다. 여기에서 남은 52 비트를 계속 나열하여 숫자의 분수 부분을 결정하십시오. 위의 링크에서 계산을 수행하면 예제에서 기대하는 부동 소수점 값을 볼 수 있습니다.
참고로 일부 프로그래밍 언어는이 변환을 수행하는 방법을 제공합니다. 사용하는 언어에 따라 휠을 재발견 할 필요가 없습니다.
편집 : 예
, 우리는 바이트 배열의 세 가지 정보가 필요합니다 배정 밀도 부동 소수점 값으로 바이트 배열로 변환하려면 다음 부호 비트 (S)의 지수를 (E) 및 분획 (F). 가장 먼저 할 일은 8 바이트 배열의 64 비트 표현을 만드는 것입니다. 위에서 언급했듯이 "역방향"순서로 바이트를 사용합니다 (항목을 읽으려면 리틀 엔디안). 프로세스를 설명하기에 충분하므로 처음 4 바이트 만 사용합니다.
40 48 98 5D ==> 01,000,000 01,001,000 10,011,000 01,011,101
I가 0 인 최 좌측의 순서로 상기 비트를 참조한다.
부호 비트 : 위의 배열에서 0 번째 비트입니다. 이 경우 S은 0입니다. 부호 비트는 정확히 생각할 수있는 것으로 부동 소수점 결과가 음수인지 양수인지를 결정합니다.
지수 : 비트 1-11은 지수를 결정합니다. 예에서, 지수 E은 100 0000 0100 ==> 1028입니다.
분수 : 나머지 비트 12-63은 분수를 결정합니다. 나는 그 과정이 어떻게 작동 하는지를 보여주기 위해 12-31 비트만을 설명했다 : 1000 10011000 01011101 ....
소수 비트는 십진수 값으로 변환되지 않는다. 대신, 설정 한 비트 (0이 아닌 1)에주의를 기울여 반복 할 필요가 있습니다. 비트의 색인은 여기에서 중요한 것입니다. 다시, 전체 예 (비트 12-63)에서,이 인덱싱은 1 내지 52가 될 것이다.
분수는 각각의 i ' 이 비트는 다음 식을 사용하여 설정됩니다. 2^-i. 이 예에서는 인덱스 1,5,8,9,14,16,17,18,20를 처리한다는 의미입니다.
처음 네 인덱스 예시의 목적을 위해 우리가 충분한 정밀도를 제공한다 :
F = (2^-1) + (2^-5) + (2^-2) + (2^-13) = 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
함수 here을 사용 했습니까?
도움을 주신 Adam에게 감사드립니다. 나는 자바에서 이것을 시도하고있다. 귀하의 제안에 따라이 변환을 수행하는 방법을 찾으려고 노력했지만 도움이되는 것은 없습니다. 또한 저수준 비트 조작을 처음 접했을 때 위의 링크에서 제공된 변환 방법을 얻지 못하고 있습니다. 가치 중 하나에 대해 전환을 설명해 주시겠습니까? 감사합니다,
Sachin Deshmukh – user1151896
아담 너무 많이 일했습니다 ....... 좋은 포럼 – user1151896
좋습니다. 향후 게시물에서 질문에 더 많은 태그를 지정하여 사용자가주의를 끌 수 있도록 할 수 있습니다. –