Quelle est la résolution approximative d’un nombre à virgule flottante simple précision quand il est proche de zéro

Je stocke beaucoup de longitudes et de latitudes en tant que doubles , je me demande si je peux me permettre de les stocker en tant que floats .

Pour répondre à cette question, j’ai besoin de connaître la résolution approximative d’un nombre à virgule flottante simple précision lorsque les valeurs stockées sont des longitudes / latitudes (-180 à +180).

Votre question peut avoir plusieurs interprétations.

Si ce n’est que pour les angles et pour le stockage sur un disque ou un périphérique, je vous suggère de stocker vos valeurs en utilisant une technique totalement différente: stocker en tant qu’entier sur 32 bits.

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

Pour le récupérer, faites le contraire.

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

De cette façon, vous avez une résolution complète de 31 bits pour 180 degrés et un bit pour le signe.

Vous pouvez également utiliser cette méthode pour conserver vos valeurs en mémoire vive. Le coût de cette coverion est plus élevé que celui de travailler directement avec des doublons, mais si vous souhaitez conserver une mémoire faible mais une résolution élevée, cela peut très bien fonctionner. Le coût n’est pas si élevé, il suffit d’une conversion en / de nombre entier de / en double et d’une multiplication, les processeurs modernes le feront en très peu de temps, et puisque la mémoire consultée est inférieure, si la liste contient beaucoup de valeurs, votre code sera plus convivial avec le cache du processeur.

Votre résolution sera de 180 / ((2^31) - 1) = 8.38190318 × 10^-8 degrés, pas mal 🙂

La résolution sur laquelle vous pouvez compter avec des flotteurs à simple précision est d’environ 360 / (2 ^ 23) ou 4 * 10 ^ -5.

Plus précisément, le plus grand flottant simple précision ssortingctement inférieur à 360. (qui est exactement représentable) vaut environ 359.999969 . Pour toute la gamme -360. .. 360 -360. .. 360 , vous pourrez représenter des différences au moins aussi petites que la différence entre ces deux nombres.

Les flottants ont généralement 4 octets (32 bits) et les doubles, le double. Cependant, la précision exacte si vous effectuez des calculs est spécifique à la mise en œuvre (et au matériel). Sur certains systèmes, tous les flottants seront stockés sous forme de doublons, ce qui ajoute à la confusion.

Cela dépend, mais plutôt pas.

Float 32 bits stocke 7 chiffres significatifs. C’est normalement trop peu pour enregistrer la résolution correcte de longitude / latitude. Par exemple, openstreetmap.org utilise six chiffres après la virgule, donc minimum huit, maximum dix chiffres.

En bref, utilisez float64.