158 lines
4.2 KiB
Markdown
158 lines
4.2 KiB
Markdown
# 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)
|
||
|
||

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

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