• Aucun résultat trouvé

Aperçu général des algorithmes

On voit trivialement que erf est impaire ; on peut donc se limiter au calcul de erf(x) lorsque x >0 sans perte de généralité. Sauf mention explicite contraire, on supposera donc toujours que x est strictement positif.

La fonction erf tend vers 1 en +. Aussi, pour de grandes valeurs dex, la représentation binaire de erf(x) est de la forme

0,11| {z }· · ·11

beaucoup de ’1’

b1b2b3· · ·

Il est donc plus intéressant, pour de telles valeurs de x, d’évaluer la fonction complémentaire erfc(x) = 1erf(x). Les graphes des deux fonctions sont représentés en figure1.4.

Parmi les formules données dans [AS65], nous retenons les trois suivantes qui sont appropriées pour l’évaluation en précision arbitraire (équations 7.1.5, 7.1.6, 7.1.23 et 7.1.24 de [AS65]) :

(a) Graphe de erf (b) Graphe de erfc

Figure 1.4 : Graphes des fonctions erf et erfc

erf(x) = 2x On peut écrire ces formules de façon plus compacte en utilisant le symbole 1F1 des fonctions hypergéométriques :

L’équation (1.1) est intéressante essentiellement pour de petites valeurs de x. La série est al-ternée de sorte que le reste est majoré par le premier terme négligé. Le rapport entre deux termes consécutifs est approximativement x2/n. Ainsi, lorsque x < 1, x2 et n contribuent tous les deux à réduire le terme général ; la convergence est donc rapide. Pour de plus grandes valeurs de x, la convergence est assez lente car seule la division par nassure la décroissance du terme général. De toutes façons, le principal inconvénient de la série de Taylor pour de grands arguments ne réside pas dans la rapidité de convergence.

Le principal défaut de (1.1) pour de grands arguments vient du fait que la série est alternée : du coup, la somme est mal conditionnée et beaucoup de précision est perdue lors de son évaluation.

Ceci est dû à un phénomène communément appelé cancellation catastrophique [For70].

Définition 1.2 (Cancellation). On dit qu’il y a cancellationde chiffres lors de la soustraction de deux nombresaetblorsque les chiffres de poids fort deaetbs’annulent entre eux et que seuls les bits de poids faible contribuent à calculer l’information pertinente sur le résultat.

Sia et b sont connus exactement, le phénomène est bénin. Mais si a et b sont entachés d’une certaine erreur, la cancellation conduit à une perte plus ou moins importante de précision.

Aussi les calculs doivent être effectués en utilisant une précision intermédiaire bien plus grande que la précision cible. Nous quantifierons précisément ce phénomène à la section 1.5.3 (proposi-tion 1.13 et lemme 1.14) : comme nous le verrons, lorsque x augmente, l’équation (1.1) devient inutilisable en pratique.

L’équation (1.2) ne présente pas ce problème de cancellation. Son évaluation ne requiert donc pas beaucoup plus de précision que la précision cible. Cependant, sa convergence est un petit peu moins rapide et il faut en plus évaluer e−x2 (la complexité de ce calcul étant approximativement la même que celle de l’évaluation de la série proprement dite).

L’équation (1.3) donne un moyen très efficace d’évaluer erfc et erf pour de grands arguments.

Cependant ε(3)N (x) ne peut pas être rendu arbitrairement petit en augmentantN (il y a une valeur de N optimale atteinte en ⌊x2+ 1/2). Si erfc(x) doit être évalué avec une précision plus grande, on est obligé d’en revenir à l’équation (1.1) ou (1.2).

1.3.1 Schéma d’évaluation

Les trois sommes ont la même structure globale : ce sont des polynômes ou des séries (en la variablex2, 2x2 ou 1/(2x2)) dont les coefficients sont donnés par une récurrence simple impliquant des multiplications et des divisions par des entiers.

Il faut noter que les entiers en question tiendront en pratique sur des entiers machine de 32 ou 64 bits. Or il est connu [Bre78] que la multiplication (ou la division) d’un nombre flottant de t bits par un entier machine peut être effectuée en temps O(t). Cette complexité est à comparer avec la complexité d’une multiplication entre deux nombres det bits qui estO(tlog(t) log(log(t))) asymptotiquement (et seulement quadratique en pratique pour des précisions petites). Les additions et soustractions de deux nombres flottants de tbits s’effectuent aussi en tempsO(t). Le coût total de l’évaluation de la somme est donc globalement dominé par le nombre de multiplications en grande précision (c’est-à-dire entre deux nombres det bits).

Nous pouvons tirer parti de la structure particulière des sommes et réduire ainsi le nombre de multiplications en grande précision. Cette technique, introduite initialement par Paterson et Stockmeyer [PS73], est présentée par Smith [Smi89] comme le principe de sommation concurrente d’une série. Supposons que nous voulions évaluer le polynôme suivant (en la variabley) :

S(y) =α0+α0α1y+· · ·+α0α1· · ·αN−1yN−1. (1.5) Nous supposons que les αi (i= 0, . . . , N 1) sont des petits entiers ou des inverses d’entier. La multiplication par αi est donc rapide. On suppose que L est un paramètre entier, et par souci de simplicité on suppose que N est un multiple de L. Le cas général se déduit aisément de ce cas particulier. Smith a remarqué que S(y) s’exprime de la façon suivante :

S(y) = 1 α0 + α0· · ·αL(yL) + · · · + α0· · ·αN−L(yL)N/L−1 + y α0α1 + α0· · ·αL+1(yL) + · · · + α0· · ·αN−L+1(yL)N/L−1 + · · ·

+ yL−1 α0· · ·αL−1 + α0· · ·α2L−1(yL) + · · · + α0· · ·αN−1(yL)N/L−1 . En notantSi la somme entre parenthèses sur la i-ème ligne de ce tableau, on a donc

S(y) =S0+S1y+· · ·+SL−1yL−1.

Les sommes Si sont évaluées de façon concurrente : une variable acc est utilisée pour stocker les valeurs successives

α0, α0α1, . . . , α0· · ·αL−1, α0· · ·αL(yL), etc.

et les sommesSi sont calculées au fur et à mesure. La puissanceyLest calculée uniquement une fois, au début, en temps O(log(L)). Les multiplications (ou divisions) sont toutes des multiplications rapides sauf la multiplication paryLqui a lieu N/L−1 fois.

Finalement, le polynôme S(y) =S0+S1y+· · ·+SL−1yL−1 est évalué par le schéma de Horner qui nécessiteL−1 multiplications en grande précision.

Algorithme : ConcurrentSeries

1

Input :y,L,N,t

Output : la somme S(y) de l’équation (1.5)

/* chaque opération est effectuée en précision t */

zpower(y,L) ; /* obtenu par exponentiation binaire */

2

Algorithme 1.1 :Algorithme de sommation concurrente d’une série

L’algorithme complet nécessiteN/L+L−2 +O(log(L)) multiplications en grande précision (et O(N) additions et multiplications/divisions par des petits entiers). La valeur optimale deLestL≃

√N. Le coût total est alors approximativement 2

N multiplications lentes alors qu’une évaluation directe de toute la somme par schéma de Horner aurait nécessité environN multiplications lentes.

Il faut remarquer toutefois que cette méthode nécessite de l’espace mémoire pour stocker les valeurs intermédiaires Si jusqu’à l’évaluation finale (Lt bits sont donc nécessaires). L’algorithme complet est résumé en figure « algorithme 1.1».

Finissons par une dernière remarque sur cet algorithme. Considérons la valeur de la variableacc juste après que la ligne 7 de l’algorithme a été exécutée. La variable acc est alors une valeur approchée de α0· · ·αk(yL)⌊k/L⌋. Or, à tout moment, i= (k mod L) donc (acc·yi) est une valeur approchée deα0· · ·αkyk qui est le coefficient d’ordrek du polynômeS(y). Cela signifie qu’il n’est

pas forcément nécessaire de connaître N en avance : on peut utiliser un test de la forme sommer les termes jusqu’à en trouver un dont la valeur absolue est inférieure à une certaine borne. Bien sûr, (acc·yi) n’est qu’une valeur approchée du coefficient exact. Si l’on n’est pas prudent, on risque de sous-estimer la valeur exacte et d’arrêter la sommation trop tôt. Il nous faudra donc choisir les modes d’arrondis lors de l’évaluation de la somme de telle sorte que acc reste toujours une surestimation de la valeur absolue exacte.