Flottants, booléens et textes
Cours · NSI (première), chapitre 2 · première, spécialité numérique et sciences informatiques · le début du chapitre, la suite sur Adloun
Le chapitre précédent a codé les entiers, et il l'a fait exactement : chaque entier représentable a une écriture binaire, et une seule. Ce chapitre traite les trois autres types de base — les nombres à virgule, les valeurs de vérité, les caractères — et le premier d'entre eux impose d'abandonner l'exactitude. C'est le fait le plus déroutant de tout le programme de première, et le plus utile : une machine ne calcule pas sur les réels, elle calcule sur des approximations de réels, et il faut le savoir avant d'écrire une comparaison.
2.1 Les nombres à virgule
2.1.1 La virgule en base deux
Le principe de l'écriture positionnelle ne s'arrête pas à la virgule. En base dix, les rangs après la virgule pèsent , , ; en base deux, ils pèsent , , , et ainsi de suite.
Un réel de s'écrit en base deux
Pour obtenir les chiffres, on inverse le procédé du chapitre 1 : au lieu de diviser par deux et de garder les restes, on multiplie par deux et on garde les parties entières.
Capacité attendue
« Calculer sur quelques exemples la représentation de nombres réels : 0.1, 0.25 ou 1/3. »
. , partie entière ; , partie entière , reste . On s'arrête. Donc , exactement.
. ; , reste . On retrouve : le motif se répète indéfiniment. Donc , périodique de période 01.
. Déroulons :
| Reste | Bit produit | |
|---|---|---|
| (reste ) | ||
| (reste ) | ||
| déjà vu : le cycle recommence |
Donc , périodique de période 0011. Ce développement est infini.
parties entières. On retombe sur : le motif 0011 se répète indéfiniment, et
est un nombre parfaitement banal en base dix — et il n'a pas d'écriture binaire finie. Une machine qui ne dispose que d'un nombre fini de bits ne peut donc pas le stocker exactement. Elle stocke le nombre représentable le plus proche. Tout part de là.
Le phénomène n'a rien de mystérieux : la base dix connaît le même. s'écrit , sans fin. Un réel a une écriture finie en base si et seulement si son dénominateur (fraction réduite) ne contient que des facteurs premiers de . En base dix, : les dixièmes, les quarts, les cinquièmes passent. En base deux, seuls les dénominateurs puissances de deux passent — et contient un .
2.1.2 Ce qu'est un nombre flottant
Un nombre flottant est un nombre représenté sous la forme
où la mantisse est écrite sur un nombre fixé de bits et l'exposant est un entier relatif, lui aussi écrit sur un nombre fixé de bits.
Le nom vient de là : la virgule ne reste pas à une place fixe, elle « flotte » — c'est l'exposant qui la déplace. Le procédé est celui de la notation scientifique , transposé en base deux. Il permet de représenter aussi bien des nombres minuscules que colossaux avec le même nombre de bits, au prix d'une précision relative : un flottant garde un nombre à peu près constant de chiffres significatifs, quel que soit son ordre de grandeur.
Un dessin vaut mieux qu'une phrase pour cette histoire de virgule mobile :
Hors programme : Ce que le programme n'exige pas
La norme qui régit ces nombres s'appelle IEEE-754, et le programme est explicite : « aucune connaissance précise de la norme IEEE-754 n'est exigible ». Retenez seulement l'ordre de grandeur utile : les flottants de Python occupent 64 bits, dont 53 pour la mantisse, ce qui correspond à environ 15 à 16 chiffres décimaux significatifs. Le détail du découpage, les valeurs spéciales, les modes d'arrondi : hors programme.
2.1.3 La conséquence :
>>> 0.1 + 0.2
0.30000000000000004
>>> 0.1 + 0.2 == 0.3
False
Ce n'est pas un défaut de Python : tout langage utilisant les flottants du processeur donne le même résultat. L'explication tient en une phrase : ni ni ne sont stockés exactement, leur somme approchée n'est pas le flottant le plus proche de , et les deux valeurs diffèrent d'un poil — ici, environ .
On peut regarder ce que la machine stocke vraiment. Python sait afficher la valeur décimale exacte du flottant qu'il a retenu pour :
>>> from decimal import Decimal
>>> Decimal(0.1)
Decimal('0.1000000000000000055511151231257827021181583404541015625')
Ce nombre-là, lui, est exact : c'est le flottant le plus proche de . Il n'est simplement pas .
Exercices du chapitre
- Écrire en base deux, à la main corrigé
- Dérouler le calcul du développement binaire de corrigé
- Expliquer pourquoi 0.1 + 0.1 + 0.1 == 0.3 est faux alors que 0.1 + 0.1… corrigé
- L'addition des flottants n'est pas associative corrigé
- Dresser la table de vérité de corrigé
- Montrer que a ⊕ a = 0 et a ⊕ 0 = a. En déduire que (x ⊕ k) ⊕ k = x… corrigé