# Codage des décimaux : les flottants ## Attendus | Contenus | Capacités attendues | | :--: | :-- | | Représentation approximative des nombres réels : notion de nombre flottant | Calculer sur quelques exemples la représentation de nombres réels : 0.1, 0.25 ou 1/3. | ## Petit rappel : la base 10 Intéressons nous à l'écriture d'un nombre décimal en base 10, comme par exemple 223,25 ### Codage de la partie entière Nous savons tous ici, en base 10, que 223 se compose de : - 3 unités, - 2 dizaines - 2 centaines. Cela vient de la série de divisions ci-dessous, sur laquelle les restes fournissent le nombre d'unités (3), de dizaines (2) et de centaines (2 aussi) ![partie entière base 10](assets/div1base10.jpg) On écrit alors $`223 = 2 \times 100 + 2 \times 10 + 3 \times 1`$​ : c'est sa décomposition en base 10 ### Codage de la partie décimale Pour la partie décimale, 0.25, en base dix également, on a l'habitude de lire 2 dixièmes et 5 centièmes. Cela vient cette fois de multiplication par 10 : * $`0,25 \times 10 = 2.5`$ : la partie entière indique le nombre de dixièmes (2) et la partie décimale restante est 0,5 * $`0,5 \times 10 = 5`$ : la partie entière indique le nombre de centièmes (5) et il n'y a plus de partie décimale à _explorer_. On vient de voir que $`0,25 = 2 \times \frac{1}{10} + 5 \times \frac{1}{100}`$ Ainsi on peut écrire : $`223,25 = 2 \times 100 + 2 \times 10 + 3 + 2 \times \frac{1}{10} + 5 \times \frac{1}{100}`$ En **notation scientifique**, on obtient : $`223,25= 2,2325 \times 10²`$​ **Définition** > La __notation scientifique__ est une façon de représenter les nombres décimaux. Elle consiste à exprimer le nombre sous la forme $`\pm a\times 10^{n}`$, où $`\pm`$ est appelé signe, $`a`$ est un nombre décimal de l'intervalle $`[1 ; 10[`$ appelé __mantisse (ou significande)__ et $`n`$ est un entier relatif appelé __exposant__. ## En base 2 ### Codage de la partie entière Pour la partie entière, c'est exactement le même principe mais en divisant cette fois par 2 : ![partie entière base 10](assets/div1base2.jpg) On écrit alors : $`223 = 1 \times 2⁰ + 1 \times 2¹ + 1 \times 2² +1 \times 2³ + 1 \times 2⁴ + 0 \times 2⁵ + 1 \times 2⁶ +1 \times 2⁷`$ : C'est sa décomposition en base 2. Ainsi $`223 = 11111011_2`$ ### Codage de la partie décimale Pour la partie décimale, on procède comme en base 10 mais en multipliant par 2 au lieu de multiplier par 10 : - $`0,25 \times 2 = 0,5`$​​ : la partie entière vaut **0**, la partie décimale restante est 0.5 - $`0,5 \times 2 = 1,0`$ : la parie entière vaut **1**. il n'y a plus rien après la virgule donc nous avons terminé On vient de voir que $`0.25 = 0 \times 2^{-1} + 1 \times 2^{-2}`$ : c'est sa décomposition en base 2 Ainsi, on peut écrire : * $`123,25 = 11011111,01_2`$ * En notation scientifique en base 2 : $`123,25 = 1,111101110_2 \times 2 ^7`$ **Travail à faire** > Trouvez l'écriture scientifique en base 2 des nombres décimaux ci-dessous : > > * 8,5 > * 12,125 ## Problème... Cherchons maintenant l'écriture scientifique de 0,1 en base 2. * $`0,1 \times 2 = 0,2`$ : partie entière **0** , la partie décimale restante est 0,2 * $`0,2 \times 2 = `$ **!! SPOILER plus bas, ne défilez pas avant d'avoir trouvé ! !!** **Conclusion :** **On ne peut coder de façon exacte le nombre 0,1 en base 2.** **Et ce n'est pas le seul dans ce cas : la plupart des décimaux sont dans le même cas !** **On est donc contraint de faire une approximation !!** Allons un peu dans la console de Thonny : ```Python >>> 0.1 + 0.1 + 0.1 == 0.3 ??? ``` Ce n'est pas une erreur ou un bug de Python mais la conséquence d'une approximation liée au codage en base 2 : ```python >>> 0.1 + 0.1 + 0.1 ??? ``` > **Il n'est pas possible de coder un nombre décimal en valeur exacte en base 2**. > > **On obtient une approximation du nombre décimal, et non le nombre en lui même.** > > **Cette approximation est appelée _nombre en virgule flottante_ et correspond au type _float_ en Python.** ## IEEE-754 Voir https://www.youtube.com/watch?v=mtizhxkB-Zw&ab_channel=Wandida%2CEPFL A compléter ________ Inspiré de Mieszczak Christophe CC BY SA