III. Les flottants¶
Cours¶
En informatique, les nombres réels sont représentés par des flottants. Pourquoi ne pas utiliser le même nom que le nom mathématique, comme pour les entiers ? Ces deux ensembles ne sont en fait pas tout à fait équivalents.
A. Test d'égalité de flottants¶
Que doit, a priori, renvoyer le test 0.1 + 0.2 == 0.3
?
Il devrait renvoyer True
.
Que renvoie-t-il en fait ?
Il renvoie False
.
Quelle est en fait la valeur de 0.1 + 0.2
?
Sa valeur est 3.0000...00004
Cela s'explique par la représentation de ces valeurs en machine.
B. Décomposition et conversion de la base 2 à la base 10¶
Prenons le nombre \(0.375\). On peut décomposer la partie après la virgule dans la base 10 en fonction des puissances de 10, comme on l'a fait pour la partie entière :
\(0.375 = 3*10^{-1} + 7*10^{-2} + 5*10^{-3}\)
Les rangs des puissances de 10 sont numérotés négativement, celui du premier chiffre à gauche étant -1.
De la même façon, un nombre à virgule écrit en binaire se décompose en fonction de \(2^{rang}\) :
\(10.011_2 = 1*2^1+1*2^{-2}+2^{-3} = 2+0.25+0.125 = 2.380\)
C. Conversion de la base 10 à la base 2¶
C.1. Cas général¶
Méthode : Conversion de la partie après la virgule d'un nombre réel de la base 10 à la base 2
- On la multiplie par 2.
- La partie entière de ce produit donne le premier coefficient après la virgule.
- On garde la partie décimale du produit. On réitère l'algorithme avec cette valeur, jusqu'à ce qu'elle devienne nulle.
- Le nombre converti se lit en combinant les parties entières du produit.
Exemples :
- Remplir le tableau suivant, pour obtenir la conversion de \(0.375\).
Multiplication par 2 de la partie après la virgule | Partie entière du produit | Partie après la virgule du produit |
---|---|---|
Solution
Multiplication par 2 de la partie après la virgule | Partie entière du produit | Partie après la virgule du produit |
---|---|---|
\(0.375*2=0.750\) | \(0\) | \(0.750\) |
\(0.750*2=1.500\) | \(1\) | \(0.5\) |
\(0.5*2=1\) | \(1\) | \(0\) |
Donc \(3.375_{10} = 11.011_2\)
- Trouver la représentation binaire de \(0.25_{10}\).
Solution
Multiplication par 2 de la partie après la virgule | Partie entière du produit | Partie après la virgule du produit |
---|---|---|
\(0.25*2=0.5\) | \(0\) | \(0.5\) |
\(0.5*2=1\) | \(1\) | \(0\) |
Donc \(0.25_{10}=0.01_2\)
Récapitulatif de la méthode
Pour convertir un réel de la base 10 à la base 2 :
- On convertit sa partie entière en faisant des divisions euclidiennes successives par 2, jusqu'à obtenir un quotient de 0,
- On convertit sa partie après la virgule en faisant des multiplications successives par 2, jusqu'à obtenir un produit qui vale 0.
Exemple
Comment s'écrit le réel \(5.25_{10}\) en binaire ?
Solution
\(5.25_{10} = 101.01_2\)
C.2. Cas particuliers¶
- Que se passe-t-il lorsque l'on veut convertir la fraction \(1/3\), qui a une écriture infinie quand il est écrit avec une virgule ?
Solution
Multiplication par 2 de la partie après la virgule | Partie entière du produit | Partie après la virgule du produit |
---|---|---|
\(1/3*2=2/3\) | \(0\) | \(2/3\) |
\(2/3*2=4/3\) | \(1\) | \(1/3\) |
L'algorithme ne se termine pas.
- Ecrire les 5 premières étapes de la conversion de \(0.1_{10}\).
Solution
Multiplication par 2 de la partie après la virgule | Partie entière du produit | Partie après la virgule du produit |
---|---|---|
\(0.1*2=0.2\) | \(0\) | \(0.2\) |
\(0.2*2=0.4\) | \(0\) | \(0.4\) |
\(0.4*2=0.8\) | \(0\) | \(0.8\) |
\(0.8*2=1.6\) | \(1\) | \(0.6\) |
\(0.6*2=1.2\) | \(1\) | \(0.2\) |
Que peut-on en déduire sur la représentation de \(0.1_{10}\) dans la machine ? Pourquoi le test 0.1 + 0.2 == 0.3
renvoie-t-il False
?
L'algorithme ne s'arrête pas, donc 0.1 ne peut pas être représenté de manière exacte. \(0.1+0.2\) ne fait pas exactement 0.3 à cause de la représentation approximative de ces nombres dans la machine.
Conclusion¶
En programmation, est-il pertinent de tester l'égalité entre deux flottants ? Comment peut-on faire alors ?
Ce n'est pas pertinent, car on peut avoir des erreurs dues à l'approximation de la représentation. On peut, à la place, tester si ces nombres sont suffisamment proches.