-
Réels codés sur 4 octets
Bonjour,
Je dois générer un index spatial pour des données géographiques dans un format vecteur plus tout jeune.
La spécification qui précise les calculs à effectuer indique bien que ces calculs doivent être menés avec des rééls codés sur 4 octets (pour éviter des problèmes de précisions machine lors de l'utilisation de l'index sur des machines différentes).
Quand j'avais écrit le programme en C, pas de problème : float et cast sur les résultats fournissant des double.
Je souhaite recoder tout ça en Python mais vous devinez le problème : un seul type réel codé sur 8 octets.
Je n'ai pas trop envie de me lancer dans l'écriture d'une classe spécifique et de gérer mantisse, exposant, etc...
Connaîtriez-vous un package/module que je pourrais utiliser ?
ps : les opérations à effectuer sur ces réels 4 octets se résument aux 4 opérations de base pour ramener les coordonnées (longitude/latitude) en degrés à des entiers dans [0,255]
-
Bonjour,
Regarde du côté du module "ctypes" qui fait la liaison avec le C.
Autre solution: le module "struct".
Tyrtamos
-
Salut tu a le module ctypes
qui permet d'utiliser des type c dans un script en python.
Tu a des exemples ici:
http://wikipython.flibuste.net/Ctypes
-
Sinon, puisque tu parles de vecteurs, avec array ou numpy, tu peux gérer des tableaux de floats sur 4 octets, après, tout dépend de ce que tu veux faire.
-
Merci pour toutes ces pistes.
J'ai un peu regardé mais rien ne me parait satisfaisant.
Struct (avec pack et unpack) que je connais ne va pas trop m'aider car ce n'est pas une écriture dans un fichier d'un float Python (8 octets) avec un format en "f" (réel 4 octets) que je veux faire. Le seul apport éventuel c'est une combinaison de pack et unpack (+ décalages à gauche ou droite) pour accéder plus facilement aux 3 parties signe/exposant/mantisse du style :
liste_4_entiers = unpack('>4B',pack('>f',reel_8_octets))
# 1er bit
signe = liste_4_entiers[0] >> 7
# 8 bits suivants
exposant = (liste_4_entiers[0] << 1) + (liste_4_entiers[1] >> 7)
etc ...
Mais après j'en reviens à de l'arithmétique sur des nombres à virgule flottante (bof).
Pour array ou numpy, un stockage en float est effectivement possible mais dès que je récupère une valeur, c'est sousla forme d'un float Python et on retombe dans la même problèmatique. Analogue avec les types de ctypes.
Je pense que je vais me tourner vers une "mini" bibliothèque écrite en C avec une fonction qui prendra en entrée les coordonnées en float Python/double C, s'occupera de mener les calculs en réels 4 octets et retournera les coordonnées entières passées dans [0,255]