Aller au contenu

Les flottants

En base 10

Nous appellerons flottants (p, emin, emax) les nombres de la forme s × m × 10e où:

  • s est le signe (+ ou -),
  • m la mantisse: nombre à p chiffres, avec exactement un chiffre (non nul) avant la virgule,
  • e est l'exposant avec emin ≤ e ≤ emax.
Note

Il s'agit donc de nombres pour lesquels nous imposons l'écriture en notation scientifique.
Les nombres de chiffres pour m et pour e sont bornés: il s'agit de tenir compte des contraintes des nombres en machine qui seront toujours représentés avec le même nombre, nécessairement fini, de bits (sur les machines actuelles, usuellement 64 bits).

Note

La définition donnée ici n'est pas tout à fait la définition générique des flottants, mais nous nous tiendrons à cette approche pour simplifier.

Exercice

Quels sont les flottants (p = 2, emin = -1, emax = 1)?

Réponse

Les mantisses possibles:

  • 1,0; 1,1; 1,2; ...; 1,9
  • 2,0; 2,1; 2,2; ..., 2,9
  • ...
  • 9,0; 9,1; 9,2; ...; 9,9

Les exposants possibles sont -1, 0 et 1.

Les flottants (p = 2, emin = -1, emax = 1) sont donc:

  • Les nombres:

    • 0,10; 0,11; 0,12; ...; 0,19 (c'est à dire 1,0×10-1; 1,1×10-1; 1,2×10-1; ...; 1,9×10-1)
    • 0,20; 0,21; 0,22; ..., 0,29 (c'est à dire 2,0×10-1; 2,1×10-1; 2,2×10-1; ...; 2,9×10-1)
    • ...
    • 0,90; 0,91; 0,92; ...; 0,99 (c'est à dire 9,0×10-1; 9,1×10-1; 9,2×10-1; ...; 9,9×10-1)
  • Les nombres:

    • 1,0; 1,1; 1,2; ...; 1,9 (c'est à dire 1,0×100; 1,1×100; 1,2×100; ...; 1,9×100)
    • 2,0; 2,1; 2,2; ..., 2,9(c'est à dire 2,0×100; 2,1×100; 2,2×100; ...; 2,9×100)
    • ...
    • 9,0; 9,1; 9,2; ...; 9,9 (c'est à dire 9,0×100; 9,1×100; 9,2×100; ...; 9,9×100)
  • Les nombres:

    • 10; 11; 12; ...; 19 (c'est à dire 1,0×101; 1,1×101; 1,2×101; ...; 1,9×101)
    • 20; 21; 22; ..., 29 (c'est à dire 2,0×101; 2,1×101; 2,2×101; ...; 2,9×101)
    • ...
    • 90; 91; 92; ...; 99 (c'est à dire 9,0×101; 9,1×101; 9,2×101; ...; 9,9×101)
  • Et les opposés de ces nombres.

Exercice

Observez les nombres flottants (p = 2, emin = -1, emax = 1). Que pouvez-vous dire de l'écart entre un nombre et le nombre suivant?

nombre suivant

On peut déjà remarquer que la notion de "nombre suivant" a un sens alors qu'elle n'en a pas avec les nombres réels.

Remarque

Raisonnons uniquement sur les positifs.

Entre deux "petits" nombres consécutifs (par exemple entre 0,10 et 0,11), l'écart est de 0,01.

Entre deux "grands" nombres (par exemple 90 et 91), l'écart est de 1.

Conséquence

A partir de la remarque de l'exercice précédent, on en déduit quelques conséquences pour les nombres en machine.

Si l'on doit représenter tous les réels par les flottants précédents, tous les réels de l'intervalle [0,10; 0,105[ (ouvert ou fermé à droite, choix possible) seront représentés par le même flottant (à savoir le flottant 1,0×10-1).

Et tous les réels de l'intervalle [10; 10,5[ seront représentés par le flottant 1,0×101. Ainsi, suivant qu'il s'agit de nombres proches de 0 ou éloignés de 0, les nombres auront pour représentant dans les flottants un nombre plus ou moins éloigné de lui. Ou en d'autres termes, un même flottant sera représentant de chacun des réels d'un intervalle plus ou moins grand.

Note

La remarque porte sur l'écart absolu (valeur absolue de la différence entre le nombre et son représentant flottant). Les écarts relatifs (valeur absolue du quotient écart absolu/ nombre) sont par contre "un peu plus constants" pour les ensembles de flottants usuellement utilisés en machine (et c'est là une propriété importante pour le calcul scientifique en machine).

La conséquence la plus importante est que l'on ne peut pas attendre que les opérations sur les flottants aient les mêmes propriétés que les opérations sur les réels. Nous avons déjà constaté cela. Par exemple la non commutativité avec:

>>> 1 + 10**(-16) -1
0.0
>>> 1 - 1 + 10**(-16)
1e-16
  • Pouvez-vous expliquer la différence de résultat dans les deux lignes précédentes?
Une explication

On a:

>>> 1+10**(-16)
1.0

tandis que

>>> 0 + 10**(-16)
1e-16

Sans rentrer dans les détails, on peut reprendre les idées exposées plus haut (séparation des cas "proches de 0" des cas "éloignés de 0"):

  • 10**(-16) est proche de 0 et aura un représentant flottant assez fidèle,
  • 1 + 10**(-16) est plus éloigné de 0 et les réels entre 1 et 1 + 10**(-16) auront tous 1 pour représentants.

Dans 1 + 10**(-16) -1, on évalue 1 + 10**(-16) qui donne 1 puis on évalue 1 - 1, on obtient 0.

Dans 1 - 1 + 10**(-16), on évalue 1 - 1 qui donne 0 puis on évalue 0 + 10**(-16), on obtient 10**(-16).

En base 2

Nous appellerons flottants (p, emin, emax) les nombres de la forme s × m × 2e où:

  • s est le signe (+ ou -),
  • m la mantisse: nombre à p bits, avec exactement un bit (non nul, donc égal à 1) avant la virgule,
  • e est l'exposant avec emin ≤ e ≤ emax.

C'est sous cette forme (flottants en base 2) que les nombres seront en général représentés en machine.

En machine, que valent p et emin, emax? Le choix dépend de normes qui peuvent évoluer (pour améliorations, ou pour s'adapter aux nouvelles capacités des machines, etc...)
Voir en page suivante, la norme IEEE 754.

Un exemple

Prenons p = 6 et emin = -5, emax = 5.

Nous avons vu que 0,1dix = 0,0 0011 0011 0011 0011... 2
où la séquence 0011 se répète indéfiniment.

Si nous devons utiliser cet ensemble de flottants (p = 6 , emin = -5, emax = 5) pour représenter l'ensemble des réels, le nombre 0,1dix sera représenté par le flottant 1,1 0011 × 10-100 (écriture binaire).

De même 0,2dix = 0, 0011 0011 0011 0011...2 où la séquence 0011 se répète indéfiniment.
0,2dix sera représenté par 1,1 0011 × 10-11 (écriture binaire).

Cherchons à additionner 0,1dix + 0,2dix. On ne dispose, dans la machine, que des représentants flottants. Ce sont donc ces représentants que l'on additionne et non les nombres réels.

Sans rentrer dans les détails des algorithmes mis en oeuvre en machine, effectuons cela "à la main":

1,1 0011 × 10-100 + 1,1 0011 × 10-11
= 0,110011 × 10-11 + 1,1 0011 × 10-11 (écriture binaire).

0 , 1 1 0 0 1 1
+ 1 , 1 0 0 1 1
1 0 , 0 1 1 0 0 1

Le résultat de cette addition est donc 10,011001 × 10-11.

Quel flottant correspond à cela? Le flottant 1,00110 × 10-10.

A vous

  • Donner la valeur décimale de 1,00110 × 10-10.
Valeur décimale de 1,00110 × 10-10

1,00110 × 10-10 (binaire) s'écrit en décimal \left(1 + \frac{1}{2^3} + \frac{1}{2^4}\right) \times 2^{-2}, soit \frac{1}{2^2} + \frac{1}{2^5} + \frac{1}{2^6}, soit \frac{19}{64} \approx 0,296875.

  • Avec ce système de flottants a-t-on 0.1 + 0.2 = 0.3?
0.1 + 0.2 = 0.3?

O,3 s'écrit en binaire 0, 01 0011 0011 0011... (répétition de 0011 indéfiniment). Avec le système de flottants choisi, 0.3 est donc représenté par 1,00110.10-10. Il semble donc que 0.1 + 0.2 soit égal à 0.3 (c'est à dire que le flottant associé à 0.1 + 0.2 soit bien le même que le flottant associé à 0.3) avec ce système de représentants des nombres.

  • Et avec le système de flottants p=5 (emin=-5, emax=5), aura-t-on 0.1+0.2 = 0.3?
Une réponse

0,1dix = 0,0 0011 0011 0011 0011... 2 = 1, 1 0011 0011... × 10-100
0,2dix = 0, 0011 0011 0011 0011...2 = 1, 1 0011 0011...× 10-11
0,3dix = 0, 01 0011 0011 0011...2 = 1, 0011 0011 0011 × 10-10

Si 0,1dix est représenté par 1, 1 001 × 10-100 et 0,2dix par 1, 1 001× 10-11, la somme (0, 11001 + 1,1001)× 10-11 donne 10,01011× 10-11, représenté par le flottant 1,0010× 10-10 alors que 0,3dix sera plutôt représenté par 1, 0011× 10-10. On n'aurait donc pas avec ce système 0.1+0.2 = 0.3.

On peut aussi représenter (pour arrondir au plus proche) 0,1dix par 1, 1 010 × 10-100 et 0,2dix par 1, 1 010 × 10-11. La somme (0,11010 + 1,1010)× 10-11 donne 10,01110× 10-11 soit 1,001110× 10-11, qui serait représenté par le flottant 1,0100× 10-10 (en arrondissant au plus proche), ce qui ne correspond pas non plus au flottant représentant 0,3dix qui serait 1, 0011× 10-10.

Avec p=5, il semble que l'on n'ait pas 0.1 + 0.2 = 0.3.

Important

Avec les systèmes de flottants en machine, il faudrait rentrer un peu dans les détails des représentations et des algorithmes mis en oeuvre (arrondi, addition...) mais l'essentiel du principe conduisant à 0.1 + 0.2 ≠ 0.3 est là:

  • on représente les valeurs réelles (il y en a une infinité) par une quantité finie de nombres,
  • on représente avec un nombre fini de chiffres des nombres nécessitant une infinité (ou un grand nombre) de chiffres,
  • on utilise plusieurs bases.

Un changement dans certains choix peut annuler certains "problèmes" mais en présentera nécessairement d'autres.