Files
1ereNSI/representation_base/seance_3/README.md

158 lines
4.2 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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