KlarIA
💻 NSI (spécialité)1ereCours

Nombres flottants et valeurs booléennes

📖

Cours

Nombres flottants et valeurs booléennes

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,20{,}1 + 0{,}2 n'est pas égal à 0,30{,}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 22 : 21=0,52^{-1} = 0{,}5, puis 22=0,252^{-2} = 0{,}25, 23=0,1252^{-3} = 0{,}125, 24=0,06252^{-4} = 0{,}0625, et ainsi de suite.

110,1012=4+2+0,5+0,125=6,625.\overline{110{,}101}^{\,2} = 4 + 2 + 0{,}5 + 0{,}125 = 6{,}625.

ÉtapePartie entièreReste
0,25×2=0,50{,}25 \times 2 = 0{,}5000,50{,}5
0,5×2=1,00{,}5 \times 2 = 1{,}01100

Donc 0,25=0,0120{,}25 = \overline{0{,}01}^{\,2} : l'écriture s'arrête, elle est exacte.

De même, 0,75=0,1120{,}75 = \overline{0{,}11}^{\,2} et 6,5=110,126{,}5 = \overline{110{,}1}^{\,2}.

0,1=0,000110011001120{,}1 = \overline{0{,}0\,0011\,0011\,0011\ldots}^{\,2}

C'est le même phénomène que 1/3=0,3331/3 = 0{,}333\ldots en base 1010 : le nombre 0,10{,}1 n'a pas d'écriture binaire finie. Il en va de même pour 0,20{,}2, pour 0,30{,}3, et pour 1/3=0,01010121/3 = \overline{0{,}010101\ldots}^{\,2}.

Le programme applique la méthode à la fraction 110\dfrac{1}{10}, avec des entiers uniquement pour rester exact. Essaie ensuite 38\dfrac{3}{8}, puis 13\dfrac{1}{3}.

1.2 Le nombre flottant

Un ordinateur dispose d'un nombre fixe de bits, en général 6464.

La virgule « flotte » grâce à l'exposant : le même format code 1030010^{-300} et 1030010^{300}.

Ce format est fixé par la norme IEEE 754. Il en existe une version sur 3232 bits. Aucun détail de la norme n'est à connaître.

Structure d'un nombre flottant

1.3 Une représentation approximative

Si la mantisse d'un nombre est infinie, on la tronque à 5252 bits et on arrondit : le nombre stocké n'est plus exactement le nombre voulu.

Exécute ce bloc avant de lire la suite.

En mémoire, 0.1 vaut en réalité 0,10000000000000000550{,}1000000000000000055\ldots

L'erreur est de l'ordre de 101710^{-17} : on dispose d'environ 1616 chiffres significatifs corrects.

1.4 Règles pratiques

2. Les valeurs booléennes

2.1 Deux valeurs

C'est le résultat d'une comparaison (x > 3, a == b, mot in liste), et c'est le type des conditions dans if et while.

>>> 7 > 3
True
>>> "z" in "python"
False
>>> type(7 > 3)
<class 'bool'>

2.2 Les opérateurs and, or, not, xor

aabba and ba or ba xor b
00000
01011
10011
11110
OpérateurNomVrai quand…
a and betles deux sont vrais
a or bouau moins un est vrai (ce « ou » n'est pas exclusif)
a xor bou exclusifexactement un des deux est vrai, c'est-à-dire aba \neq b
not anona 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.

2.3 Dresser la table d'une expression

Pour une expression à nn variables, la table a 2n2^n lignes. On ajoute une colonne par sous-expression.

Voici la table de E=(a and not b) or cE = (a \text{ and not } b) \text{ or } c.

aabbccnot ba and not bEE
000100
001101
010000
011001
100111
101111
110000
111001

Python peut dresser la table à ta place. Remplace l'expression par une autre, par exemple a or (b and c).

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.

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 aa et bb 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.

Demi-additionneur : xor et and

3. Exemple résolu pas à pas

Correction · Question a

Partie entière : 5=10125 = \overline{101}^{\,2}.
Partie fractionnaire : 0,375×2=0,750{,}375 \times 2 = 0{,}75, on note 00 ; 0,75×2=1,50{,}75 \times 2 = 1{,}5, on note 11 ; 0,5×2=10{,}5 \times 2 = 1, on note 11.
Donc 5,375=101,01125{,}375 = \overline{101{,}011}^{\,2}. Vérification : 4+1+0,25+0,125=5,3754 + 1 + 0{,}25 + 0{,}125 = 5{,}375.
L'écriture est finie : ce nombre est exactement représentable.

Correction · Question b

0,3×2=0,60{,}3 \times 2 = 0{,}6, on note 00 ; 0,6×2=1,20{,}6 \times 2 = 1{,}2, on note 11 ; 0,2×2=0,40{,}2 \times 2 = 0{,}4, on note 00 ; 0,4×2=0,80{,}4 \times 2 = 0{,}8, on note 00 ; 0,8×2=1,60{,}8 \times 2 = 1{,}6, on note 11.
On retombe sur 0,60{,}6 : la période est 10011001, l'écriture 0,0100110012\overline{0{,}0\,1001\,1001\ldots}^{\,2} est infinie.
Les trois nombres sont arrondis, et 0.1 + 0.2 donne 0,300000000000000040{,}30000000000000004 : l'expression vaut False.
Test correct : abs(0.1 + 0.2 - 0.3) < 1e-9.

Correction · Question c
aabba or bEEnot anot bFF
0001111
0110100
1010010
1110000

Les colonnes EE et FF 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.

Créer mon compte gratuitement