# 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
