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\).

La notation conventionnelle

\[x_\beta=(-1)^s\left[x_n x_{n-1} \ldots x_1 x_0 \cdot x_{-1} x_{-2} \ldots x_{-m}\right], \quad x_n \neq 0\]

est appelée représentation positionnelle de \(x\) dans la base \(\beta\).

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).

\[x_\beta=(-1)^s\left(\sum_{k=-m}^n x_k \beta^k\right) .\]
Exemple:

L’écriture \(x_{10}=425.33\) désigne le réel \(x=4 \cdot 10^2+2 \cdot 10+5+3 \cdot 10^{-1}+3 \cdot 10^{-2}\), tandis que \(x_6=425.33\) désigne le réel \(x=4 \cdot 6^2+2 \cdot 6+5+3 \cdot 6^{-1}+3 \cdot 6^{-2}\). Un nombre rationnel peut avoir une infinité de chiffres dans une base et un quantité finie de chiffres dans une autre base. Par exemple, la fraction \(1 / 3\) a une infinité de chiffres en base 10, \(x_{10}=0 . \overline{3}\), tandis qu’elle a seulement un chiffre en base 3, \(x_3=0.1\).

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 :

\[\forall \varepsilon>0, \forall x_\beta \in \mathbb{R}, \exists y_\beta \in \mathbb{R} \text { tel que }\left|y_\beta-x_\beta\right|<\varepsilon,\]

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 :

  1. la base 2 ou binaire,

  2. la base 10 ou décimale (la plus naturelle) et

  3. 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

\[x=(-1)^s \cdot\left(0 . a_1 a_2 \ldots a_t\right) \cdot \beta^e=(-1)^s \cdot m \cdot \beta^{e-t}\]

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 :

  1. une case pour le signe, \(t\) cases pour les chiffres significatifs

  2. 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)

32bits

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

64bits

Notons

\[\mathbb{F}(\beta, t, L, U) \equiv\{0\} \cup\left\{x \in \mathbb{R}: x=(-1)^s \beta^e \sum_{i=1}^t a_i \beta^{-i}\right\}\]

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\) :

\[x_{\text {min }}=\beta^{L-1} \leq|x| \leq \beta^U\left(1-\beta^{-t}\right)=x_{\max } .\]

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 :

Définition de l’arrondi

Étant donné \(x \in \mathbb{R}\) en notation positionnelle normalisée, remplaçons \(x\) par son représentant \(f l(x)\) dans \(\mathbb{F}\), défini par

\[f l(x)=(-1)^s\left(0 . a_1 a_2 \ldots \tilde{a}_t\right) \cdot \beta^e, \quad \tilde{a}_t= \begin{cases}a_t & \text { si } a_{t+1}<\beta / 2 \\ a_t+1 & \text { si } a_{t+1} \geq \beta / 2\end{cases}\]

L’application \(f l: \mathbb{R} \rightarrow \mathbb{F}\), appelée arrondi, est la plus communément utilisée (dans l’approche appelée troncature on prendrait plus trivialement \(\left.\widetilde{a}_t=a_t\right)\).

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

Théorème

Si \(x \in \mathbb{R}\) est tel que \(x_{\min } \leq|x| \leq x_{\max }\), alors

\[f l(x)=x(1+\delta) \text { avec }|\delta| \leq \mathrm{u}\]

\[\mathrm{u}=\frac{1}{2} \beta^{1-t}=\frac{1}{2} \epsilon_M\]

est appelé unité d’arrondi (ou précision machine).

On déduit immédiatement du théorème précédent la majoration suivante de l’erreur relative

\[E_{\text {rel }}(x)=\frac{|x-f l(x)|}{|x|} \leq \mathrm{u},\]

tandis qu’on a pour l’erreur absolue

\[E(x)=|x-f l(x)| \leq \beta^{e-t}\left|\left(a_1 \ldots a_t \cdot a_{t+1} \ldots\right)-\left(a_1 \ldots \tilde{a}_t\right)\right| .\]

D’après définition de l’arrondi on a

\[\left|\left(a_1 \ldots a_t \cdot a_{t+1} \ldots\right)-\left(a_1 \ldots \tilde{a}_t\right)\right| \leq \beta^{-1} \frac{\beta}{2},\]

d’où

\[E(x) \leq \frac{1}{2} \beta^{-t+e}\]

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

\[\circ: \mathbb{R} \times \mathbb{R} \rightarrow \mathbb{F}, \quad x \square y=f l(f l(x) \circ f l(y)) .\]

Si \(\circ\) désigne l’addition, on a \(\forall x, y \in \mathbb{R}\)

\[\frac{|x+| y-(x+y) \mid}{|x+y|} \leq \mathrm{u}(1+\mathrm{u}) \frac{|x|+|y|}{|x+y|}+\mathrm{u},\]

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

\[x+(y+z) \neq (x+y)+z.\]
Definition du flop

Nous désignerons par flop (de l’anglais floating operation) une opération élémentaire à virgule flottante (addition, soustraction, multiplication ou division).