2011-10-28 2 views
7

많은 경도와 위도를 doubles으로 저장하고 있습니다. floats으로 저장할 수 있는지 궁금합니다.주위가 0 일 때 단 정밀도 부동 소수점 숫자의 대략적인 해결책은 무엇입니까

이 질문에 답하려면 저장된 값이 경도/위도 (-180 ~ +180) 일 때 single precision floating point number의 대략적인 해상도를 알아야합니다.

+2

경도의 범위는 -180에서 180까지이며 위도는 -90에서 90까지입니다. – caf

+0

좋은 점은 잘못되었습니다. – Robert

답변

12

귀하의 질문에 여러 해석이있을 수 있습니다.

각도와 디스크 또는 장치에 저장하는 경우 완전히 다른 기술을 사용하여 값을 저장하는 것이 좋습니다. 32 비트 정수로 저장하십시오.

int encodedAngle = (int)(value * (0x7FFFFFFF/180.0)); 

복구하려면 반대로하십시오.

double angle = (encodedAngle/(0x7FFFFFFF/180.0)); 

이렇게하면 180 도의 전체 31 비트 해상도와 부호의 1 비트가 생깁니다.

이 방법을 사용하여 값을 램에 보관할 수도 있습니다.이 변환의 비용은 복식으로 직접 작업하는 것과 비교해 더 높지만 메모리를 낮게 유지하지만 해상도를 높이려면이 방법이 유용 할 수 있습니다. 비용은 그다지 높지 않고, 정수/배수 및 곱셈으로의 변환만으로 현대 프로세서는 매우 적은 시간 만 처리 할 수 ​​있으며 액세스 된 메모리가 적기 때문에 목록에 많은 양이 포함되어 있으면 값이 크면 코드가 프로세서 캐시에 더 친숙해질 것입니다.

귀하의 해상도는 180/((2^31) - 1) = 8.38190318 × 10^-8도, :)

+0

그는 -360에서 360까지의 값을 나타내야하기 때문에 부호없는 정수를 사용할 수 없습니다. 좋은 답변입니다. –

+2

위도/경도에 대해 + -360은 분명히 가짜입니다. 어쨌든이 답변은 정확하고 부동 소수점을 사용하는 것은 분명히 잘못입니다. 런던 근처에서 큰 정확도와 태평양의 끔찍한 양산을 원한다면 ... –

+0

다음으로 수정되었습니다. -180 .. + 180 –

5

단 정밀도 float로 계산할 수있는 해상도는 약 360/(2^23) 또는 4 * 10^-5입니다.

보다 정확하게 정확히 360. (정확히 나타낼 수 있음)보다 가장 작은 단 정밀도 부동 소수점은 약 359.999969입니다. 전체 범위가 -360. .. 360 인 경우이 두 숫자의 차이만큼 작은 차이를 표현할 수 있습니다.

+0

환상적인, 내 계산에 의하면 상한선/상한선은 최대 5 미터 정도이고, 저에게는 용인 할 수 없습니다. 도와 주셔서 감사합니다! – Robert

+1

@Robert 균일 한 해상도가 필요할 때, 부동 소수점 포맷은 다소 낭비 적이지만 (비록 내가 매우 편리하다고 인정 하겠지만). 단 정밀도 부동 소수점을 사용하면 2^32의 균일 한 간격 값을 가질 수있는 경우 23 비트 가수로 제한됩니다.배정 밀도의 경우, 균일하게 간격을 둔 값을 표시하기 위해 64 비트를 모두 사용할 수있는 52 비트 가수 (mantissa)에 의해 해상도가 제한됩니다. –

1

보통 float는 4 바이트 (32 비트)이고 double은 double입니다. 그러나 계산을 수행하는 경우 정밀도는 구현 (및 하드웨어)에 따라 다릅니다. 일부 시스템에서는 모든 부동 소수점이 혼동을 방지하기 위해 복식으로 저장됩니다.

0

가 달려 나쁜 아니라하지 아니 될 것입니다.

32 비트 플로트는 유효 숫자 7 자리를 저장합니다. 이는 일반적으로 경도/위도의 적절한 해상도를 저장하기에는 너무 적습니다. 예를 들어 openstreetmap.org은 쉼표 뒤에 6 자리 숫자를 사용하므로 최소 8 자리 숫자로 최대 10 자리 숫자를 사용합니다.

즉, float64를 사용하십시오.

관련 문제