• Aucun résultat trouvé

Pour évaluer une fonction numérique, il faut travailler de manière approchée avec les nombres réels. Puisque l’ensemble des nombres réels est indénombrable il n’est pas concevable de repré-senter tous les nombres réels de manière exacte. On doit se limiter à un ensemble dénombrable

— voire, le plus souvent, fini — qui servira d’approximation pour représenter l’ensemble de tous les nombres réels.

Plusieurs systèmes de représentations sont concevables [Mul89] : on peut par exemple décider d’approcher l’ensemble des réels :

– par l’ensemble des rationnels (vus comme couples de nombres entiers) ; – par le début du développement en fraction continue ;

– par le début de l’écriture binaire des nombres ; – etc.

L’idée de représenter les nombres par le début de leur développement binaire donne lieu à deux formats couramment utilisés : la représentation en virgule flottante et la représentation en virgule fixe.

Virgule flottante

Dans la représentation en virgule flottante, on choisit une base entière β≥2 et un entiertqui est la précision du format. La précision indique combien de chiffres significatifs (en baseβ) seront utilisés pour représenter les nombres. L’ensemble des nombres flottants de précisionten baseβ est défini par

Ft={0} ∪ m

βtβe, e∈Z,|m| ∈Jβt−1, βt1K

où Jβt−1, βt1K= [βt−1, βt1]Z. L’entier m est appelé la mantisse et s’écrit sur t chiffres exactement en base β. L’entier e est l’exposant. Il indique l’ordre de grandeur du nombre considéré.

Une autre façon de voir les choses consiste à écrire le développement de m en base β : m = m1· · ·mt. Les bornes surmimpliquent quetchiffres sont nécessaires et suffisants pour écriremen baseβ : doncm16= 0. Le nombre flottant de mantisse m et d’exposanteest alors 0, m1· · ·mt·βe. C’est de là que vient le terme de « virgule flottante » : on ne conserve que les t chiffres les plus significatifs du nombre, son ordre de grandeur étant donné par l’exposant e(qui indique donc la position de la virgule dans l’écriture usuelle).

Dans la pratique, l’exposant est souvent stocké sur un nombre fini de bits défini à l’avance.

L’exposant doit donc rester entre deux bornes emin et emax. La base β la plus répandue est la base 2 ; cependant certains systèmes utilisent d’autres bases (par exemple, Maple ainsi que la plupart des calculettes de poche utilisent la base 10). L’ordinateur russe SETUN, construit en 1958, à l’université de Moscou utilisait la base 3.

La définition d’arithmétique en virgule flottante est régie par une norme qui date de 1985 : la norme IEEE-754 [AI85] (la norme a été récemment révisée [AI08]). La norme définit cinq formats appelés binary32, binary64, binary128, decimal64 et decimal128. Comme leurs noms le laissent penser, les trois premiers sont en base 2 et les deux derniers en base 10. Le format binary32 est aussi connu sous le nom de simple précisionet le format binary64 sous le nom dedouble précision ou encore format double. Le tableau1.1rappelle les caractéristiques de ces formats.

Format β t emin emax

binary32 2 24 125 128

binary64 2 53 1 021 1 024 binary128 2 113 16 381 16 384

decimal64 10 16 382 385

decimal128 10 34 6 142 6 145

Figure 1.1 : Caractéristiques des formats définis dans la norme IEEE-754

La norme définit aussi des valeurs spéciales (NaN, Inf) et précise comment il faut traiter les cas spéciaux tels qu’une division par 0, la racine carrée d’un nombre négatif, etc. En outre, elle explique ce qu’il faut faire lors d’un dépassement de capacité, c’est-à-dire lorsque le résultat d’un calcul est un nombre dont l’exposant n’est pas compris entre emin etemax. Sauf mention contraire, nous ne nous préoccuperons pas de ces spécificités dans la présente thèse.

La norme ne se contente pas de standardiser la représentation des nombres. Elle explique aussi comment il faut calculer avec. Ainsi, elle définit quatre modes d’arrondi.

Définition 1.1. Soitx un nombre réel. Les quatre modes d’arrondi de la norme sont définis de la façon suivante :

– l’arrondi vers le haut dex (arrondi par excès) est le plus petit nombre flottant supérieur ou égal àx. On le notera ∆(x) ;

– l’arrondi vers le bas de x (arrondi par défaut) est le plus grand nombre flottant inférieur ou égal àx. On le notera∇(x) ;

– l’arrondi vers 0 (troncature) consiste à faire un arrondi par défaut sixest positif et un arrondi par excès si x est négatif ;

– l’arrondi au plus près dex est le nombre flottant xb qui minimise|x−xb|. Au cas où il existe deux nombres flottants atteignant ce minimum, on choisit celui dont la mantisse est paire (on parle d’arrondi au plus près pair).

Sixest un nombre réel, on dit quexbest unarrondi fidèlede xsibx∈ {∇(x),∆(x)}.Autrement dit, six est un nombre flottant,xb=x et sinon,xbest l’un des deux nombres flottants encadrant x.

La notion d’arrondi fidèle n’est pas définie dans la norme, mais elle nous sera très utile.

En plus de définir des modes d’arrondi, la norme impose que chaque opération arithmétique (addition, soustraction, multiplication, division et racine carrée) soit effectuée avec arrondi correct : le nombre flottantzrenvoyé comme résultat de l’opération doit correspondre à l’arrondi (suivant le mode d’arrondi demandé par l’utilisateur) du résultat exact de l’opération. Par exemple, si le mode d’arrondi choisi par l’utilisateur est l’arrondi par excès, et que l’utilisateur demande à calculer la racine carrée d’un nombre x, le résultat renvoyé par l’algorithme doit être ∆(√x), comme si le

calcul avait été effectué de façon exacte, puis arrondi. La récente révision de la norme recommande que ce principe de l’arrondi correct soit étendu à toutes les fonctions mathématiques proposées à l’utilisateur (exp, cos, etc.).

Précision arbitraire

Le cadre défini par la norme est très commode : il donne des règles claires et partagées par tous pour le calcul numérique sur ordinateur. Il autorise la réalisation de codes portables : puisque les règles du jeu sont parfaitement définies, un même programme s’exécutera de la même façon sur deux machines différentes si celles-ci respectent la norme. De plus, puisque chaque opération est effectuée avec arrondi correct, on peut étudier et borner rigoureusement la façon dont se propagent les erreurs d’arrondi au cours d’une longue série de calculs. La norme permet donc la réalisation d’algorithmes dont la qualité numérique est certifiée.

Cependant, la norme ne propose que cinq formats. Comment faire si l’on souhaite travailler avec plus de précision ? En particulier, si on a besoin de faire du calcul numérique avec plusieurs cen-taines, voire plusieurs milliers de chiffres ? La récente révision de la norme suggère (mais n’impose pas) l’adoption de formats dits étendus permettant à l’utilisateur de travailler avec une précision multiple de 32 quelconque (fixée à la compilation). De même, elle évoque les formats ditsextensibles permettant de faire varier arbitrairement la précision (cependant, là encore, la précision doit être un multiple de 32). Cela étant, ces recommandations ne figuraient pas dans la première version de la norme et ne sont pas encore implémentées en pratique. L’idée d’étendre les définitions et les recommandations de la norme à des formats flottants de précision quelconque était tout de même naturelle ; la bibliothèque MPFR [FHL+07] a justement été développée depuis l’année 2000 pour proposer une telle arithmétique flottante de précision arbitraire. AvecMPFR, l’utilisateur peut choisir au bit près la précision de chaque nombre. La bibliothèque s’inspire de la norme IEEE-754 et en étend les principes : les quatre modes d’arrondi de la norme sont proposés et les opéra-tions sont toutes correctement arrondies. À ce jour, MPFR fournit une implantation des opérations arithmétiques (addition, soustraction, multiplication, division, racine carrée), une cinquantaine de fonctions élémentaires et spéciales (exponentielle, fonctions de Bessel, etc.), ainsi que des routines de conversions et d’entrées/sorties.

La norme IEEE-754 et la bibliothèque MPFR n’adoptent pas exactement la même convention de normalisation pour la mantisse des nombres flottants.1 Pour MPFR, la mantisse est un nombre compris entre 1/2 et 1 alors que dans la norme, la mantisse est un nombre compris entre 1 et 2. Ceci induit un décalage de 1 dans le définition de l’exposant : le nombre 1, m2· · ·mt (dont l’exposant est 0 pour la norme) est vu comme le nombre 0,1m2· · ·mt·21 parMPFR (qui considère donc que son exposant est 1). Dans tout le présent document, nous adoptons la même convention queMPFR.

Virgule fixe

La virgule flottante est sans doute le format le plus utilisé pour les calculs numériques logiciels.

Un autre format classique existe, généralement plutôt réservé à des applications spécifiques et proches du matériel : il s’agit de la représentation en virgule fixe.

La représentation en virgule fixe dépend, elle aussi, d’une base β et d’une précision t. Par ailleurs, on fixe une fois pour toute un entier relatif E qui va servir à indiquer la position de la virgule. Ceci définit un format de virgule fixe. Un nombre dans ce format est la donnée d’un entier

1Il semble que ce choix historique — surprenant de la part des développeurs deMPFR— vienne du fait que le bit de poids fort n’est pas implicite dans MPFR. On peut estimer qu’il est alors plus naturel d’avoir une mantisse dans l’intervalle [1/2,1[.

m s’écrivant sur au plus tbits ; autrement dit|m| ∈q0, βt1y. Le nombre représenté par mest a= m

βE.

SiE est positif, par exemple, tous les nombres seront donc représentés avec au plusE chiffres après la virgule. D’où le nom devirgule fixe. L’arithmétique en virgule fixe se ramène essentiellement à de l’arithmétique entière, ce qui en rend l’implantation simple et efficace. Son inconvénient est que l’ordre de grandeur des nombres à manipuler est choisi d’avance. Cela nécessite donc en général une analyse préalable des ordres de grandeurs des nombres impliqués dans un calcul, de façon à choisir E correctement.