C7.4 : Représentation des nombres à virgule

Python fait-il des calculs corrects ?

Mise en évidence

💻 Evaluer les instruction suivantes :

>>>1.1 + 1.1
>>>1.1 + 1.1 + 1.1

    Les résultats vous semble-t-ils normaux ?

💻 Evaluer les instruction suivantes :

>>>0.1 + 0.1 - 0.2
>>>0.1 + 0.1 + 0.1 - 0.3

    Les résultats vous semble-t-ils normaux ?

💻 Evaluer les instruction suivantes :

>>>3 + 10**(-16) == 3
>>>3 + 10**(-15) == 3

    Les résultats vous semble-t-ils normaux ?

Bilan

...

...

Prendre connaissance

Valeur en base 10 d'un nombre à virgule écrit en base 2

Exemples

Exemple d'un nombre à virgule écrit en base 10 : le nombre \(\pu{83,14}\) peut s'écrire : \(8×10^1+3×10^0+1×\frac{1}{10^1}+4×\frac{1}{10^2}\)

Exemple d'un nombre a virgule écrit en base 2 : le nombre \(\pu{10,011}\) peut s'écrire : \(1×2^1+0×2^0+0×\frac{1}{2^1}+1×\frac{1}{2^2}+1×\frac{1}{2^3}\)

Généralisation

La valeur en base 10 du nombre qui s'écrit \(a_n…a_2\ a_1\ a_0\ ,b_1\ b_2\ b_3…\) en base \(x\) est donné par la relation :

\(a_n…a_2\ a_1\ a_0\ ,b_1\ b_2\ b_3…=a_n×2^n+…+a_2×2^2+a_1×2^1+a_0×2^0+b_1×\frac{1}{2^1}+b_2×\frac{1}{2^2}+b_3×\frac{1}{2^3}+…\)

Cette relation permet de calculer la valeur en base 10 d'un nombre à virgule écrit en base 2.

Valeur en base 2 d'un nombre à virgule écrit en base 10

Généralité

L'écriture un base 2 d'un nombre à virgule écrit en base 10 nécessite :

Conversion de la partie après la virgule en base 2

La conversion d'une partie décimale en base 2 se fait par des multiplications successives par 2.

Exemple du nombre 3,14 :

Détail du mécanisme de la conversion du nombre 3,14

S'entrainer pour bien comprendre

• Donner en base 10 la valeur du nombre à virgule qui s'écrit 111,111 en binaire.

• Donner en base 10 la valeur du nombre à virgule qui s'écrit 1010,1010 en binaire.

• Écrire, en binaire, le nombre dont la valeur en base 10 est 5,25 (on s'arrêtera à 4 bits pour la partie décimale).

• Écrire, en binaire, le nombre dont la valeur en base 10 est 8,8 (on s'arrêtera à 4 bits pour la partie décimale).

Remarque

Un nombre qui a un nombre de chiffre après la virgule fini lorsqu'on l'écrit en base 10, peut avoir un nombre de chiffre après la virgule infini lorsqu'on souhaite l'écrire en base 2.

Le nombre de bits utilisé pour le codage d'un nombre à virgule étant limité, il y a nécessairement des arrondis. C'est cela qui explique les problèmes de calculs qui ont été soulevés dans la paragraphe I.

Pour aller plus loin : représentation des nombres à virgule

Ecriture normalisée d'un nombre binaire à virgule

L'écriture normalisée d'un nombre à virgule fait apparaître 3 parties :

Ainsi, tous les nombres à virgule en base 2 peuvent s'écrire sous la forme : \(Nombre = {(-1)}^s × 2^e × m\)

Exemple avec le nombre 101,110 :

Illustration du vocabulaire sur le nombre 101,110

Représentation du nombre sur 32 bits (respectivement 64 bits)

Répartition des bits

Comme pour les entiers relatifs, le nombre de bits utilisé pour la représentation est définit à l'avance.

• 1 bit est réservé pour le code S correspondant au signe.

• 8 bits (respectivement 11 bits) sont réservés pour le code E correspondant à l'exposant.

• 23 bits (respectivement 52 bits) sont réservés pour le code M correspondant à la mantisse.

Schéma de l'utilisation des bits pour S, E et M

Codage du signe

Le code S du signe est égale au signe s, autrement dit S = 0 si le nombre est positif et S = 1 si le nombre est négatif.

Codage de l'exposant

Le code E de l'exposant est \(E = e + 2^{n-1} - 1\) (où n est le nombre de bits utilisé pour coder l'exposant). L'ajoute de \(2^{n-1} - 1\) a pour but que E soit toujours un nombre positif, que l'exposant soit positif ou négatif.

Codage de la mantisse

Le code M de la mantisse est celui de la partie après la virgule de la mantisse. Le 1 avant la virgule est omis car il est est présent dans toutes les écritures normalisée des nombres à virgules en binaire.

Bilan

\(Nombre = {(-1)}^s × 2^{E-2^{n-1}+1} × 1,M\)

Applications pour bien comprendre

• Donner la valeur décimale du nombre binaire flottant suivant codé sur 32 bits :

1100 0011 0101 0110 1100 0000 0000 0000

• Donner la valeur décimale du nombre binaire flottant suivant codé sur 64 bits :

0001 0000 0011 1101 0011 1001 0101 1000 0000 0000 0000 0000 0000 0000 0000 0000

Outils

L'outils en ligne suivant permet de connaitre les différentes valeurs possibles correspondant à un représentation machine et inversement : hexed.it