Adloun

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

La représentation d'un nombre flottant : un bit de signe, un exposant et une mantisse.

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.

Définition 2.1Écriture binaire d'un nombre à virgule

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. »

Exemple 2.2Trois calculs à faire à la main

. , 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 :

ResteBit produit
  (reste )
  (reste )
déjà vu : le cycle recommence

Donc , périodique de période 0011. Ce développement est infini.

Figure : Le développement binaire de , obtenu en multipliant par deux et en gardant les

parties entières. On retombe sur : le motif 0011 se répète indéfiniment, et

aucune machine à mémoire finie ne peut le stocker exactement.
Important

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à.

iRemarque

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

Définition 2.3Nombre 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 :

Figure : Une même mantisse, trois exposants. La virgule se déplace, les chiffres significatifs restent les mêmes — d'où une précision relative constante.

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

La suite du cours · Tous les exercices du chapitre