2011-10-28 10 views
7

Estoy almacenando muchas longitudes y latitudes como doubles, me pregunto si puedo escabullirme con el almacenamiento como floats.¿Cuál es la resolución aproximada de un solo número de punto flotante de precisión cuando está alrededor de cero

Para responder a esta pregunta, necesito conocer la resolución aproximada de single precision floating point number cuando los valores almacenados son longitudes/latitudes (-180 a +180).

+2

Las longitudes varían de -180 a 180 y las latitudes de -90 a 90. – caf

+0

Buen punto, corregirlo. – Robert

Respuesta

12

Su pregunta puede tener varias interpretaciones.

Si solo es para ángulos y para almacenar en un disco o en un dispositivo, le sugiero que almacene sus valores usando una técnica totalmente diferente: almacenar como un entero de 32 bits.

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

Para recuperarlo, haga lo contrario.

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

De esta forma tiene una resolución de 31 bits completa para 180 grados y 1 bit para el letrero.

Puede usarlo también para mantener sus valores en RAM, el costo de esta cobertura es más alto en comparación con trabajar directamente con dobles, pero si desea mantener baja la memoria pero con una resolución alta, esto puede funcionar bastante bien. El costo no es tan alto, solo una conversión de/a entero de/a doble y una multiplicación, los procesadores modernos lo harán en muy poco tiempo, y dado que la memoria accedida es menor, si la lista contiene mucho de valores, su código será más amigable con la memoria caché del procesador.

Su resolución será 180/((2^31) - 1) = 8.38190318 × 10^-8 grados, no está mal :)

+0

No puede usar enteros sin signo porque tiene que representar valores de -360 a 360. Buena respuesta. –

+2

Para lat/long, + -360 es sin duda un requisito falso ... De todos modos esta respuesta es correcta, y usar coma flotante es definitivamente incorrecto, a menos que desee una gran precisión cerca de Londres y una cuantificación horrible en el Pacífico ... –

+0

Corregido a be -180 .. + 180 –

5

La resolución con la que puede contar con flotadores de precisión simple es de aproximadamente 360 ​​/ (2^23) o 4 * 10^-5.

Más precisamente, el flotador de precisión simple más grande estrictamente inferior a 360. (que es representable exactamente) es aproximadamente 359.999969. Para todo el rango -360. .. 360, podrá representar diferencias al menos tan pequeñas como la diferencia entre estos dos números.

+0

Fantástico, por mis cálculos eso es alrededor de un máximo de 5 metros por un largo/largo, lo cual no es aceptable para mí. ¡Gracias por tu ayuda! – Robert

+1

@Robert Cuando se necesita una resolución uniforme, los formatos de coma flotante son un poco derrochadores (aunque admitiría que son muy prácticos). Con flotadores de precisión simple, la resolución está limitada por la mantisa de 23 bits cuando puede tener 2^32 valores espaciados uniformemente.Para la precisión doble, la resolución está limitada por la mantisa de 52 bits donde puede usar los 64 bits para representar valores espaciados uniformemente. –

1

Normalmente los flotadores tienen 4 bytes (32 bits) mientras que los dobles son el doble. Sin embargo, la precisión exacta, si está haciendo cálculos, es la implementación (y el hardware) específicos. En algunos sistemas, todos los flotadores se almacenarán como dobles, solo para aumentar la confusión.

0

Depende, sino más bien no.

El flotador de 32 bits almacena 7 dígitos significativos. Eso normalmente es muy poco para almacenar la resolución adecuada de longitud/latitud. Por ejemplo, openstreetmap.org utiliza seis dígitos después de la coma, por lo que un mínimo de ocho, un total máximo de diez dígitos.

En resumen, use float64.

Cuestiones relacionadas