Nombre à convertir en mot machine 64 bits :
Mot machine 64 bits à convertir en nombre décimal :
La fonction suivante convertit la partie fractionnaire du nombre n
en binaire et donne ainsi son développement binaire (équivalent d’un dévelopement décimal).
Tous les nombres auront nécessairement un développement binaire fini (et seront donc des fractions dyadiques) puisque le flottant donné en argument a lui même une écriture fini (il est codé sur 64 bits !).
def conv_fract(n):
n = abs(n)
n = n-int(n)
count = 0
s = ''
n *= 2
eps = 1e-9
while count < 64:
print(n)
if n >= 1:
s += '1'
if not 1-eps < n < 1+eps:
n = (n-1)*2
else: # fin du développement binaire
break
else:
s += '0'
n *= 2
count += 1
return s
La méthode consiste à multiplié par 2 lorsque le nombre est inférieur à 1 et à retirer 1 lorsqu’il dépasse.
On constate sur l’enchaînement des résultats intermédiaires que le chiffre avant la virgule correspond au développement binaire du nombre :
'00011001100110011001100110011001100110011001100110011010001100110011001100110011001100110011001100110011001101'
Un code possible pour obtenir l’écriture du nombre sur 64 bits via la norme IEEE-754.
def conv_iee(n: float) -> str:
s = ''
if n < 0:
s += '1'
else:
s += '0'
n = abs(n)
if n > 1:
mantisse_str = bin(int(n))[3:] # on enlève le 1er 1
mantisse_str += conv_fract(n)[:52-len(mantisse_str)]
exp = len(bin(int(n))[2:])-1 + 1023
exp_str = bin(exp)[2:]
s += (11-len(exp_str))*'0'+ exp_str
else:
if n == 0:
exp = 0
exp_str = '0'*11
s += exp_str
mantisse_str = '0'*52
else:
dvlpt = "0"+conv_fract(n)
exp = 0
while dvlpt[exp] == "0":
exp += 1
exp = exp*(-1) + 1023
exp_str = bin(exp)[2:]
s += (11-len(exp_str))*'0' + exp_str # on ajoute des 0 à gauche pour compléter à 11 caractères
mant = conv_fract(n)
mantisse_str = ""
test = True
for i in range(len(mant)):
if not test or mant[i] != "0": # on enlève les 0 qui précèdent le 1er 1
mantisse_str += mant[i]
test = False
mantisse_str = mantisse_str[1:] # on enlève le 1er 1
if len(mantisse_str) < 52:
mantisse_str += (52-len(mantisse_str))*'0'
s += mantisse_str
s = s[0]+" "+s[1:12]+" "+s[12:]
return s
Enfin, code d’un convertisseur d’un mot machine 64 bits vers sa valeur décimale :
def deconv(s: str) -> float:
mot = ''
for c in s:
if c != ' ':
mot += c
if int(mot) == 0:
return 0
exp = int(mot[1:12],2) - 1023
nombre = 2**exp
mantisse = mot[12:]
for c in mantisse:
exp -= 1
nombre += int(c)*2**exp
if mot[0] == "1":
nombre *= -1
return nombre