Transformer un binaire IEEE754 en float (python)

charsb1973 Messages postés 5 Date d'inscription lundi 15 avril 2024 Statut Membre Dernière intervention 11 septembre 2024 - Modifié le 13 sept. 2024 à 17:49
mamiemando Messages postés 33264 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 13 septembre 2024 - 13 sept. 2024 à 17:51

Hello !

Je cherche à transformer des binaires IEEE754 en float en python sans utiliser d'import.

J'ai déjà codé un programme qui permet de récupérer toutes les parties du code binaire pour les isoler, mais je ne comprends pas comment passer de ça à un nombre.

Voici mon code :

IEEE754 = 11001110000000011100000000000000
signe = int(IEEE754 / 10 ** 31)    # On récupère le signe
binexpb = int(IEEE754 / 10 ** 23)  # On récupère l'exposant
c = signe * 10 ** 8                               
binexp = binexpb - c               # On enlève la valeur du signe pour obtenir le binaire de l exposant...
expbrut = int(str(binexp), 2)      # ... qu'on transforme en nombre décimal
exp = expbrut - 127                # ... et auquel on soustrait 127 (de base pour l'exposant 0 = à l'exposant -127) pour obtenir l'exposant final
m = IEEE754 - binexpb * 10 ** 23   # On récupère la mantisse
mantisse = m + 10 ** 23            # On remet le 1 qui est caché comme il est obligatoire
result = 0
a = 23
nbrzero = 1
g = 0
y = int(mantisse / 10 ** a)        # 'y' est 1er chiffre de la mantisse
mneg = mantisse
for j in range(23):                # Traiter chacun des 23 chiffres
    if y == int(1):                # Si le 1er chiffre est 1...
        mneg = mneg - y * 10 ** a
        a = a - 1
        y = int(mneg / 10 ** a)
        # On multiplie par 10 exposant 'nbrzero'
        # (on verra ce qu'est cette valeur plus tard) pour changer
        # la colonne dans laquelle j écrit les valeurs binaires)
        result = result * 10 ** nbrzero  
        result = result + 1        # Puis on ajoute le 1
        nbrzero = 1
    else:                          # Sinon si le chiffre est égal à 0
        mneg = mneg - y * 10 ** a
        a = a - 1
        y = int(mneg / 10 ** a)
        
        # On ajoute 1 à 'nbrzero' pour que lorsqu'un 1 sera détecté,
        # la boucle repasse dans le if et écrive autant de 0 que de
        # fois ou la boucle est passée par le else. Cela permet aussi
        # de supprimer les 0 en trop qui sont à droite, car s'il
        # n'y a aucun 1 jusqu'à la fin, les 0 ne seront pas écrits
        nbrzero = nbrzero + 1
print(mantisse)
print(y)
print(g)
print(result)
print(a)
print(exp)

Le résultat est affiché par print(result)

Quelqu'un peut-il m'aider, s'il vous plaît ? Merci beaucoup !

A voir également:

2 réponses

PierrotLeFou
12 sept. 2024 à 02:01

Si tu transformes le signe et ajuste correctement l'exposant, que penses-tu de ceci?

resultat = signe * mantisse * 2**exposant

0
mamiemando Messages postés 33264 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 13 septembre 2024 7 777
13 sept. 2024 à 17:51

Bonjour,

Est-ce que ce snippet ne fait pas exactement ce que tu veux ?

Bonne chance

0