python convertir float en binaire

a marqué ce sujet comme résolu.

j’ai éditer mon message précédent, c’est moi mon code qui faisiat de la merde

edit: dsl j’ai enfin trouvé l’erreur dans monde code, nohar a effectivement raison. Mon probleme venait de mon interpréteur pour reconvertir le binaire en nombre normal

voila d’ou viens mon erreur

1
2
3
4
5
6
data=[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0] #la chaine de nohar ne marche pas avec mon code
#data=[0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0] #cette chaine fonctionne
out=0
for index,x in enumerate(reversed(data)):
    out += x*pow(2,index)
print(str(out))

mais je vais trouver comment la résoudre

Uther

Je viens de voir ton édit, sans comprendre ton problème. La représentation que tu obtiens avec struct.pack ne correspond pas à une liste de chiffres en base 2, mais à un format composé d’un signe, d’une mantisse (la liste de chiffres) et d’un exposant (la puissance de 2 à appliquer à cette mantisse).

Et si tu cherches à obtenir quelque chose comme 110,1 il y a encore un peu de boulot.

Je viens de voir ton édit, sans comprendre ton problème. La représentation que tu obtiens avec struct.pack ne correspond pas à une liste de chiffres en base 2, mais à un format composé d’un signe, d’une mantisse (la liste de chiffres) et d’un exposant (la puissance de 2 à appliquer à cette mantisse).

Et si tu cherches à obtenir quelque chose comme 110,1 il y a encore un peu de boulot.

entwanne

non je ne cherche pas/plus a obtenir cela, je croyais que je devais obtenir cela mais en faite mon probleme venait de ma fonction pour retransformer les 0 et 1 en nombre décimal

bon j’ai la solution :

1
2
3
4
5
6
float_to_binnary=''.join('{:08b}'.format(b) for b in struct.pack('>f', -12.487))
float_to_binnary=str(float_to_binnary)

a=struct.pack("l",int(float_to_binnary,2))
a_real=np.frombuffer(a, dtype =np.float32)[0]
print(a_real)

sa marche mais je comprend pas pourquoi je fais un pack avec float (">f") pour encoder mais que je dois utiliser un long ("l") pour décoder ?

+0 -0

Tu ne décodes pas en faisant un struct.pack. Là tu ré-encodes juste les données que tu as décodées en faisant appel à int.

Si tu regardes de plus près, tu verras que struct.pack('>f', -12.487) et struct.pack("l",int(float_to_binnary,2)) sont des valeurs sensiblement similaires. Seuls changent le padding et l’endianness selon ton architecture.

Je ne vois pas quel intérêt tu as à passer par int(..., 2) et struct.pack('l', ...). Puisque tu le demandes, ce second appel ne sert qu’à représenter un nombre sous forme d’une séquence de bytes. Sache que tu peux avoir quelque chose d’équivalent avec la méthode to_bytes des entiers :

1
2
3
4
>>> struct.pack('l', 2**63-1)
b'\xff\xff\xff\xff\xff\xff\xff\x7f'
>>> (2**63-1).to_bytes(8, 'little')
b'\xff\xff\xff\xff\xff\xff\xff\x7f'

Mais encore une fois, le mieux serait que tu détailles vraiment ton problème, que tu décrives ce que tu cherches à faire.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte