Aller au contenu

Flottants1⚓︎

Il est tout simplement impossible de représenter de manière exacte les nombres réels dans la mémoire d'un ordinateur. Les nombres flottants en constituent l'approximation usuellement utilisée, par exemple pour les calculs scientifiques.

1. Ecriture scientifique en base 10⚓︎

La notation scientifique est une façon de représenter les nombres décimaux. Elle consiste à exprimer le nombre sous la forme \(\displaystyle \pm a\times 10^{n}\), où \(\displaystyle \pm\) est appelé signe, a est un nombre décimal de l'intervalle [1 ; 10[ appelé mantisse et n est un entier relatif appelé exposant. Il n’y a donc qu’un seul chiffre (non nul) à gauche de la virgule, puis un nombre variable de décimales (chiffres après la virgule), lequel dépend de la précision. Ainsi, en toute rigueur, 0 ne peut pas être représenté dans cette notation.

Exemple: \(345=3,45\times 10^2\); \(0,0005678=5,678\times 10^{-4}\)

vocabulaire mantisse

Mais il faut fixer une taille limitée pour la mantisse et l'exposant afin de pouvoir les coder.

Exemple: Dans le cas où l'on a un seul chiffre dans la mantisse et que l'exposant est entre −1 et 1, les nombres décimaux représentables sont :

-90, -80, -70, -60, -50, -40, -30, -20, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, -0.9, -0.8, -0.7, -0.6, -0.5, -0.4, -0.3, -0.2, -0.1, 0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30, 40, 50, 60, 70, 80, 90

Il est important de constater que l'écart entre deux grands nombres représentables est bien plus grand que celui entre deux nombres proches de 0 : La répartition des décimaux représentables n'est pas uniforme

2. Norme IEEE 754: la base 2⚓︎

2.1 Les nombres fractionnaires en base 2⚓︎

Pour représenter en binaire des nombres avec une partie fractionnaire, il faut décomposer celle-ci en une somme de puissances inverses de 2 : \(0,b_1b_2...b_k\) est la représentation binaire de \(b_1\times\dfrac{1}{2}+b_2\times\dfrac{1}{2^2}+\ldots+b_2\times\dfrac{1}{2^k}\)

Contrairement au codage de la partie entière, celui de la partie décimale peut être infini, de la même façon que des nombres fractionnaires peuvent avoir des parties décimales infinies (exemple \(\dfrac{1}{3} = 0,3333\ldots\)).

Des valeurs qui s’expriment simplement en décimal ne peuvent pas être représentées de façon exacte en binaire. Par exemple, le nombre 0,3 est représentée au mieux par 0,01001100 sur un octet après la virgule, soit:

\(0 × \dfrac{1}{2} + 1 × \dfrac{1}{4} + 0 × \dfrac{1}{8} + 0 × \dfrac{1}{16} + 1 × \dfrac{1}{32}+ 1 × \dfrac{1}{64} + 0 × \dfrac{1}{128} + 0 × \dfrac{1}{256}\)

, qui vaut 0,296875.

Pour cette raison, il est recommandé de ne jamais tester l’égalité entre des valeurs non entières, mais plutôt de comparer la valeur absolue de la différence à un nombre suffisamment petit.

Exemple en python

>>> 0.1 * 0.2
0.020000000000000004
>>> 0.1 + 0.1 + 0.1 == 0.3
False

2.2 La norme IEE754 (non exigible)⚓︎

La norme IEEE 754 standardise la représentation des flottants. C'est la norme la plus couramment utilisé dans les ordinateurs. Elle se décline en deux versions : le format binary32 ou simple précision utilise 32 bits pour représenter un flottant, le format binary64 ou double précision utilise 64 bits pour représenter un flottant. Comme Python utilise le deuxième type sur nos machines, on va se concentrer sur celui-ci. Il y a principalement deux différences avec l'écriture scientifique en base 10: - La mantisse est écrite en binaire, elle est donc dans l'intervalle [1, 2[ - l'exposant est un entier entre -1022 et 1023 qui est stocké de manière décalé d'une valeur d = 1023. On remarque que les 2048 valeurs représentables avec 11 bits ne sont pas toutes utilisées ; il manque les valeurs −1023 et 1024.

Si on note \(s\) la valeur 0 (pour +) ou 1 (pour \(-\)) du signe, \(e\) la valeur de l'exposant et \(m ∈ [1, 2[\) celui de la mantisse, la valeur du nombre représenté est :

\[ x = (−1)^s × m × 2^{e−1023} \]

Enfin une dernière difficulté ; le chiffre des unités de la mantisse étant toujours égal à 1, il n'est pas représenté, ainsi les 52 bits de la mantisse représente en fait la fraction c'est à dire les bits de la partie fractionnaire de la mantisse.

Exemple: conversion de 0,1

  • 0,1 est positif donc le bit de signe est 0.
  • \(0,1= 1,6 \times 2^{-4}\) donc l'exposant est -4 ce qui donne en décalé 1019 donc 01111111011
  • Enfin on enlève 1 et on convertir en binaire \(0,6=\dfrac{1}{2}+\dfrac{1}{16}+\dfrac{1}{32}+\dfrac{1}{256}+\dfrac{1}{512}+\ldots\) Donc la mantisse est 100110011.....

Donc 0,1 s'écrit dans la norme IEE754 \(\fbox{0}\fbox{ 01111111011}\fbox{1001100110011001100110011001100110011001100110011010}\)


  1. Cours tiré très largement du manuel NSI 1re Spécialité - Ed. 2021 Hachette et de https://frederic-junier.gitlab.io/parc-nsi