Représentation des nombres en machine
Toute opération qu’effectue un ordinateur ("opération machine") est entachée par des erreurs d’arrondi. Elles sont dues au fait qu’on ne peut représenter dans un ordinateur qu’un sous-ensemble fini de l’ensemble des nombres réels.
Dans cette section, après avoir rappelé la notation positionnelle des nombres réels, nous introduisons leur représentation machine.
1. Le système positionnel
Soit une base fixée \(\beta \in \mathbb{N}\) avec \(\beta \geq 2\), et soit \(x\) un nombre réel comportant un nombre fini de chiffres \(x_k\) avec \(0 \leq x_k<\beta\) pour \(k=-m, \ldots, n\).
Le point entre \(x_0\) et \(x_{-1}\) est appelé point décimal si la base est 10, point binaire si la base est 2, et \(s\) dépend du signe de \(x\) ( \(s=0\) si \(x\) est positif, 1 si \(x\) est négatif).
La notation conventionnelle signifie
Tout nombre réel peut être approché par des nombres ayant une représentation finie. On a en effet, pour une base \(\beta\) fixée, la propriété suivante :
où \(y_\beta\) a une représentation positionnelle finie.
Bien que, d’un point de vue théorique, toutes les bases soient équivalentes, les ordinateurs emploient en général trois bases :
-
la base 2 ou binaire,
-
la base 10 ou décimale (la plus naturelle) et
-
la base 16 ou hexadécimale.
Presque tous les ordinateurs modernes utilisent la base 2, exceptés certains qui emploient la base 16. |
Dans la représentation binaire, les chiffres se réduisent aux deux symboles 0 et 1, appelés bits (de l’anglais binary digits).
En hexadécimal les symboles utilisés pour la représentation des chiffres sont \(0,1, \ldots, 9\), A, B, C, D, E, F.
Clairement, plus petite est la base adoptée, plus longue est la chaîne de caractères nécessaire à la représentation d’un même nombre.
Afin de simplifier les notations, nous écrirons \(x\) au lieu de \(x_\beta\), sous-entendant ainsi la base \(\beta\).
2. Le système des nombres à virgule flottante
Supposons qu’un ordinateur dispose de \(N\) cases mémoires pour stocker les nombres. Étant donné un nombre réel non nul \(x\), sa représentation en virgule flottante est donnée par
où \(t \in \mathbb{N}\) est le nombre de chiffres significatifs \(a_i\) (avec \(0 \leq a_i \leq \beta-1\) ), \(m=a_1 a_2 \ldots a_t\) un entier, appelé mantisse, tel que \(0 \leq m \leq \beta^t-1\) et \(e\) un entier appelé exposant. Clairement, l’exposant ne peut varier que dans un intervalle fini de valeurs admissibles : posons \(L \leq e \leq U\) (typiquement \(L<0\) et \(U>0\) ).
Les \(N\) cases mémoires sont à présent réparties ainsi :
-
une case pour le signe, \(t\) cases pour les chiffres significatifs
-
les \(N-t-1\) cases restantes pour les chiffres de l’exposant.
Le nombre zéro a une représentation à part. |
Il y a typiquement sur un ordinateur deux formats disponibles pour les nombres à virgule flottante : les représentations en simple et en double précision. Dans le cas de la représentation binaire, ces formats sont codés dans les versions standards avec \(N=32\) bits (simple précision)

et avec \(N=64\) bits (double précision)

Notons
avec \(\beta \geq 2,0 \leq a_i \leq \beta-1, L \leq e \leq U\), l’ensemble des nombres à virgule flottante écrits en base \(\beta\), comportant \(t\) chiffres significatifs et dont l’exposant peut varier dans l’intervalle \(] L, U[\). Afin d’assurer l’unicité de la représentation d’un nombre, on suppose que \(a_1 \neq 0\) et \(m \geq \beta^{t-1}\). On dit dans ce cas que \(a_1\) est le chiffre significatif principal, \(a_t\) le dernier chiffre significatif et la représentation de \(x\) est alors dite normalisée. La mantisse \(m\) varie à présent entre \(\beta^{-1}\) et 1 . Toujours pour assurer l’unicité de la représentation, on suppose que le nombre zéro a également un signe (on prend typiquement \(s=0\) ). Il est immédiat de vérifier que si \(x \in \mathbb{F}(\beta, t, L, U)\) alors \(-x \in \mathbb{F}(\beta, t, L, U)\). On a de plus l’encadrement suivant pour la valeur absolue de \(x\) :
3. Arrondi d’un nombre réel en représentation machine
Le fait que, sur tout ordinateur, seul un sous-ensemble \(\mathbb{F}(\beta, t, L, U)\) de \(\mathbb{R}\) soit effectivement disponible pose plusieurs problèmes pratiques.
Tout d’abord se pose la question de la représentation dans \(\mathbb{F}\) d’un nombre réel quelconque donné.
D’autre part, même si \(x\) et \(y\) sont deux nombres de \(\mathbb{F}\), le résultat d’une opération entre eux n’appartient pas nécessairement à \(\mathbb{F}\). On doit donc définir une arithmétique sur \(\mathbb{F}\).
L’approche la plus simple pour résoudre le premier problème consiste à arrondir \(x \in \mathbb{R}\) de façon à ce que le nombre arrondi appartienne à \(\mathbb{F}\). Parmi toutes les manières possibles d’arrondir un nombre, considérons la suivante :
Clairement, \(f l(x)=x\) si \(x \in \mathbb{F}\) et de plus \(f l(x) \leq f l(y)\) si \(x \leq y \forall x, y \in \mathbb{R}\) (propriété de monotonie). |
Tout ce qui a été dit jusqu’à présent est seulement valable pour les nombres dont l’exposant \(e\) appartient à \(] L, U[\). En effet, si \(x \in]-\infty,-x_{\max }[\cup] x_{\max }, \infty[\) la valeur \(f l(x)\) n’est pas définie, tandis que si \(x \in]-x_{\min }, x_{\min }\) l’opération d’arrondi est toujours définie.
Dans le premier cas quand \(x\) est le résultat d’une opération sur des nombres de \(\mathbb{F}\), on parle d’overflow, dans le second cas on parle d’underflow (ou de graceful underflow si les nombres dénormalisés sont pris en compte).
L’overflow provoque une interruption du programme par le système. |
A part dans des situations exceptionnelles, on peut facilement quantifier l’erreur, absolue ou relative, commise quand on remplace \(x\) par \(f l(x)\).
On peut montrer la propriété suivante
On déduit immédiatement du théorème précédent la majoration suivante de l’erreur relative
tandis qu’on a pour l’erreur absolue
D’après définition de l’arrondi on a
d’où
4. Opérations machines en virgule flottante
Comme on l’a dit précédemment, il est nécessaire de définir sur l’ensemble des nombres machines une arithmétique, autant que possible analogue à l’arithmétique de \(\mathbb{R}\).
Ainsi, pour une opération arithmétique quelconque \(\circ: \mathbb{R} \times \mathbb{R} \rightarrow \mathbb{R}\) entre deux opérandes de \(\mathbb{R}\) (où le symbole \(\circ\) peut désigner l’addition, la soustraction, la multiplication ou la division) nous noterons \(\circ\) l’opération machine correspondante définie par
Si \(\circ\) désigne l’addition, on a \(\forall x, y \in \mathbb{R}\)
et donc l’erreur relative associée à la somme sera petite, à moins que \(x+y\) ne soit lui-même petit.
La somme de deux nombres proches en module mais de signes opposés mérite un commentaire particulier : dans ce cas, en effet, \(x+y\) peut être petit, ce qui génère ce qu’on appelle les erreurs d’annulation.
Il est important de remarquer que certaines propriétés de l’arithmétique classique sont conservées quand on passe à l’arithmétique des flottants (comme, par exemple, la commutativité de la somme ou du produit de deux termes), tandis que d’autres sont perdues. C’est le cas de l’associativité de la somme : on peut en effet montrer qu’en général