2010-02-09 7 views
19

Quelle est la meilleure façon d'émuler le virgule flottante à simple précision en python? (Ou d'autres formats à virgule flottante d'ailleurs?) Utilisez simplement ctypes?Manière correcte d'émuler le virgule flottante simple précision en python?

+2

Que voulez-vous dire par "émuler"? Lire les flottants à partir de blobs binaires? Exécuter des maths en simple précision et obtenir les mêmes résultats qu'une autre langue? (Si c'est le cas, notez que "float" math dans C sur x86 est réellement évalué dans 80 bits et réduit à 32 bits quand il est stocké.) –

Répondre

3

Si votre application convient tableaux/matrices, vous pouvez utiliser numpy avec float32

11

Si numpy (l'excellente suggestion d'autres réponses) est inapplicable pour vous (par exemple parce que vous êtes dans un environnement qui ne permet pas extensions arbitraires de tiers), le module array dans la bibliothèque standard Python est bien aussi - le code de type 'f' vous donne des flottants de 32 bits. Outre ceux-ci et les flotteurs à double précision (habituels), il n'y a pas grand-chose pour les "autres formats à virgule flottante" - qu'aviez-vous en tête? (par exemple, gmpy offre le support modeste de GMP pour les flotteurs avec des tailles de bits arbitraires beaucoup plus longues - mais il est en effet modeste, par exemple, pas de fonctions trigonométriques).

6

que diriez-vous de ctypes.c_float de la bibliothèque standard?

1

Il est possible d'utiliser le module struct de Python pour tronquer un flottant de 64 bits à la précision d'un flottant de 32 bits.

Par exemple:

>>> x = 1.1122334455667788 
>>> x 
1.1122334455667788 
>>> struct.unpack('f', struct.pack('f', x))[0] 
1.1122334003448486 

Pour faire de l'arithmétique uniquement avec flotteurs 32 bits, vous devez appliquer cette opération de troncature au résultat de chaque opération arithmétique.

Questions connexes