Après les entiers, voici deux autres types de base.
Les nombres flottants (type float) représentent les réels de façon approximative : comprendre pourquoi 0,1+0,2 n'est pas égal à 0,3 évite des bugs classiques.
Les booléens (type bool) ne prennent que deux valeurs, vrai ou faux. Ils se combinent avec and, or, not et xor, et sont au cœur des conditions, des boucles, et même des circuits qui additionnent les bits.
1. Les nombres réels en machine
1.1 La partie fractionnaire en binaire
Après la virgule, les positions valent des puissances négatives de 2 : 2−1=0,5, puis 2−2=0,25, 2−3=0,125, 2−4=0,0625, et ainsi de suite.
110,1012=4+2+0,5+0,125=6,625.
Étape
Partie entière
Reste
0,25×2=0,5
0
0,5
0,5×2=1,0
1
0
Donc 0,25=0,012 : l'écriture s'arrête, elle est exacte.
De même, 0,75=0,112 et 6,5=110,12.
0,1=0,0001100110011…2
C'est le même phénomène que 1/3=0,333… en base 10 : le nombre 0,1 n'a pas d'écriture binaire finie.
Il en va de même pour 0,2, pour 0,3, et pour 1/3=0,010101…2.
Le programme applique la méthode à la fraction 101, avec des entiers uniquement pour rester exact.
Essaie ensuite 83, puis 31.
deffraction_binaire(num, den, nb_chiffres):
"""Chiffres binaires après la virgule de num/den (avec 0 <= num < den)."""
chiffres = ""for i inrange(nb_chiffres):
num = num * 2# on multiplie par 2
chiffres = chiffres + str(num // den) # partie entière : 0 ou 1
num = num % den # on garde le resteif num == 0:
breakreturn"0," + chiffres
print(fraction_binaire(1, 10, 24))
1.2 Le nombre flottant
Un ordinateur dispose d'un nombre fixe de bits, en général 64.
La virgule « flotte » grâce à l'exposant : le même format code 10−300 et 10300.
Ce format est fixé par la norme IEEE 754. Il en existe une version sur 32 bits. Aucun détail de la norme n'est à connaître.
1.3 Une représentation approximative
Si la mantisse d'un nombre est infinie, on la tronque à 52 bits et on arrondit : le nombre stocké n'est plus exactement le nombre voulu.
au moins un est vrai (ce « ou » n'est pas exclusif)
a xor b
ou exclusif
exactement un des deux est vrai, c'est-à-dire a=b
not a
non
a est faux
En Python, le ou exclusif de deux booléens s'écrit a != b, ou a ^ b.
Python retrouve ces tables. Ajoute une colonne pour not a, ou pour a and not b.
for a in [False, True]:
for b in [False, True]:
print(a, b, "| and :", a and b, "| or :", a or b, "| xor :", a != b)
defxor(a, b):
return a or b
2.3 Dresser la table d'une expression
Pour une expression à n variables, la table a 2n lignes.
On ajoute une colonne par sous-expression.
Voici la table de E=(a and not b) or c.
a
b
c
not b
a and not b
E
0
0
0
1
0
0
0
0
1
1
0
1
0
1
0
0
0
0
0
1
1
0
0
1
1
0
0
1
1
1
1
0
1
1
1
1
1
1
0
0
0
0
1
1
1
0
0
1
Python peut dresser la table à ta place. Remplace l'expression par une autre, par exemple a or (b and c).
print("a b c E")
for a in [False, True]:
for b in [False, True]:
for c in [False, True]:
E = (a andnot b) or c
print(int(a), int(b), int(c), " ", int(E))
2.4 Le caractère séquentiel de and et or
On parle aussi d'évaluation en court-circuit. Elle sert à protéger une expression dangereuse.
t = [4, 0, 7]
i = 5if i < len(t) and t[i] == 0: # i est trop grand : t[i] n'est jamais évaluéprint("case nulle")
else:
print("rien à signaler")
x, y = 10, 0print(y != 0and x / y > 2) # pas de division par zéro
Inverse maintenant les deux conditions du if, en écrivant t[i] == 0 and i < len(t), puis relance : l'erreur d'index apparaît.
2.5 Application : l'addition binaire
Additionner deux bits a et b donne une somme et une retenue.
Ce circuit montre que les opérateurs logiques suffisent à calculer : un processeur n'est qu'un immense assemblage de portes logiques.
defdemi_additionneur(a, b):
"""a et b valent 0 ou 1 ; renvoie (somme, retenue)."""
somme = (a != b) # xor
retenue = (a == 1and b == 1) # andreturnint(somme), int(retenue)
for a in [0, 1]:
for b in [0, 1]:
print(a, "+", b, "->", demi_additionneur(a, b))
3. Exemple résolu pas à pas
Correction · Question a
Partie entière : 5=1012.
Partie fractionnaire : 0,375×2=0,75, on note 0 ; 0,75×2=1,5, on note 1 ; 0,5×2=1, on note 1.
Donc 5,375=101,0112.
Vérification : 4+1+0,25+0,125=5,375.
L'écriture est finie : ce nombre est exactement représentable.
Correction · Question b
0,3×2=0,6, on note 0 ; 0,6×2=1,2, on note 1 ; 0,2×2=0,4, on note 0 ; 0,4×2=0,8, on note 0 ; 0,8×2=1,6, on note 1.
On retombe sur 0,6 : la période est 1001, l'écriture 0,010011001…2 est infinie.
Les trois nombres sont arrondis, et 0.1 + 0.2 donne 0,30000000000000004 : l'expression vaut False.
Test correct : abs(0.1 + 0.2 - 0.3) < 1e-9.
Correction · Question c
a
b
a or b
E
not a
not b
F
0
0
0
1
1
1
1
0
1
1
0
1
0
0
1
0
1
0
0
1
0
1
1
1
0
0
0
0
Les colonnes E et F sont identiques : les deux expressions sont équivalentes.
C'est une loi de De Morgan.
Correction · Question d
x != 0 est faux, donc and renvoie False sans évaluer 10 / x : il n'y a aucune erreur.
Avec l'ordre inverse, Python évaluerait d'abord 10 / x et provoquerait une erreur de division par zéro.
À retenir
Révise ce chapitre avec KlarIA
Tuteur qui t'explique pas à pas, quiz pour t'entraîner, flashcards pour mémoriser. Gratuit.