2015-10-31 1 views
2

je ne ai pu convertir un nombre décimal en une seule précision binaire IEEE754, en utilisant le module struct.pack, ou faire le contraire (float16 ou float32) en utilisant numpy.frombufferdécimal à demi-précision IEEE 754 binaire en Python

Est -il possible de convertir une décimale en un virgule flottante demi-précision, en utilisant Numpy?

J'ai besoin d'imprimer le résultat de la conversion, donc si je tape "117.0", il faut imprimer "0101011101010000"

+4

'np.float16 ('2.3')' fonctionne très bien pour moi. Pouvez-vous clarifier ce que vous demandez? Peut-être montrer un exemple de ce que vous essayez. –

+0

related: [Floating point à 16 bit Twos Complément binaire, Python] (http://stackoverflow.com/q/31464022/4279) – jfs

+0

La méthode 'float16' ne convertit pas de la base 10 à la base 2. Par exemple, je voulez 100.25 (base 10) à la demi-précision IEEE754 dans la base 2, pas la base 10 – Kaio

Répondre

4

si je tape "117,0", il faut imprimer "0101011101010000"

>>> import numpy as np 
>>> bin(np.float16(117.0).view('H'))[2:].zfill(16) 
'0101011101010000' 
+0

Cette solution fonctionne, merci! Je vais maintenant essayer de comprendre votre code – Kaio

+0

@Kaio: Je recommande d'utiliser Python REPL, pour exécuter le code étape par étape et voir les résultats intermédiaires. Utilisez également 'help()' pour voir les docstrings correspondantes, par exemple 'help ('' .zfill)' – jfs

3

La méthode float16 proposée par Mark Dickinson doit suivre la méthode tostring() pour obtenir la représentation binaire nécessaire:

data = numpy.float16(2.3).tostring() 
+0

Si je cours: 'importe numpy comme np b = np.float16 (2.3) .tostring() impression b', il imprime seulement un "? @", pas de nombre de base 2 – Kaio

+0

La solution proposée fournit le même type de résultat que le fait 'struct.pack': Une séquence d'octets. Si vous avez besoin d'un résultat différent, vous devez le préciser dans votre question, préférablement avec des exemples. – dlask

+0

J'ai besoin d'imprimer le résultat de la conversion, donc si je tape "117.0", il devrait imprimer "0101011101010000" – Kaio