• Aucun résultat trouvé

Une fois l’arithmétique décimale multi-précision de base construite, on peut s’en servir pour développer les fonctions élémentaires et enrichir notre environnement. Nous allons d’abord présenter une méthode générale d’étude de la propagation d’erreur qui pourra être applicable pour le développement de plusieurs fonctions, pour ensuite étudier ces fonctions au cas par cas.

4.3.1 Discussions à propos de la propagation d’erreurs

Avant d’aller plus loin dans la construction de cette bibliothèque arithmétique, pre-nons un moment pour analyser la propagation d’erreurs. En effet, le calcul de fonctions transcendantes telle que l’exponentielle ou le logarithme demande plusieurs conversions entre nombres décimaux et binaires, introduisant ainsi une erreur qui se propagera tout au long du calcul.

Il y a trois différents types d’erreurs pouvant apparaître dans le cas général du calcul d’une fonction décimale D :F10

k10→ F10k

10, approximation d’une fonction réelle f : R → R. Nous supposons pour le développement de notre bibliothèque qu’il existe déjà une fonction binaire multi-précision donnant une approximation de f , notée B :F2

k2→ F2k

2.

La première est l’erreur de conversionε du nombre décimal x10∈ F10k10vers le nombre binaire x2∈ F2k

2, telle que

La seconde est l’erreur de calculθ survenant lors de l’appel de la fonction B telle que

y2 = B (x2) = f (x2) · (1 + θ). (4.21)

Si la fonction B fournit un arrondi correct vers le plus proche, on a alors |θ| ≤ 2−k02,θ ∈ R. De la même façon que dans l’algorithme 4.1, nous passons par un intermédiaire binaire très précis afin d’assurer l’arrondi correct du résultat en décimal à la précision k10. Ainsi la précision k0

2dans un premier temps telle que k0

2= k2+c, avec c = 4, et une boucle de Ziv est effectuée sur le résultat y2qui est réévalué avec une précision k20 plus grande si nécessaire, de la même façon que dans l’algorithme de conversion. Par conséquent, la troisième est l’erreur de conversionη du nombre binaire calculé vers le résultat décimal telle que

y10 = ◦k10¡ y2¢

= y2·¡1 + η¢, |η| ≤ 10−k10, η ∈ R. (4.22) En résumé, on peut décrire la fonction décimale D telle que

D (x10) = ◦k10¡B ¡◦k2(x10)¢¢

= B (x10· (1 + ε)) ·¡1 + η¢

D (x10) = f (x10· (1 + ε)) ·¡1 + η)·(1 + θ¢. (4.23)

Passer par une précision intermédiaire permettant d’assurer l’arrondi correct du ré-sultat y2à la précision décimale k10implique que, selon les hypothèses d’arrondi correct de la fonction intermédiaire B , l’erreur qui aura le plus d’impact sur le résultat y10est la première erreur de conversionε. On réécrit alors D telle que D (x10) = f (x10· (1 + ε)).

On peut approcher la fonction D (x10) par f (x10· (1 + ε)) = f (x10+ x10ε). Soit un entier n ∈ N, si f est n fois dérivable en le point x10∈ F10k10⊂ R, alors par l’application du théorème de Taylor-Lagrange, il existe un nombre réelξ entre x10et x10· (1 + ε) tel que

f (x10+ x10ε) = f (x10) + f0(ξ) · x10ε = f (x10) · µ 1 +x10f 0(ξ) f (x10) ε ¶ . (4.24)

Sous cette forme, on voit facilement qu’il est suffisant de calculer le premier terme car les termes d’ordre supérieur sont négligeable pour l’approximation de D (x10). Dans ce cas, la stabilité de l’erreur est liée au conditionnement de la fonction, qui quantifie à quel point la valeur de sortie est affectée par de petites variations en entrée. Si le conditionnement est borné, on peut assurer que la propagation de l’erreur aura un impact négligeable dans l’algorithme. Cependant, si ce n’est pas le cas, nous devrons trouver une méthode pour évaluer la fonction d’une autre façon.

4.3.2 Exponentielle

Étudions maintenant le cas de la fonction exponentielle. Nous voulons d’abord borner l’erreur de conversion comme expliqué dans le protocole précédent décrit section 4.3.1.

exp (x2) = exp(x10· (1 + ε)) = exp (x10) · exp(x10ε),

exp (x2) = exp(x10) ·¡1 + ε0¢ , ε0 = exp (x10ε) − 1.

(4.25)

On peut donc réécrire l’erreurε telle que ε = log(x1+ε10 0). Sous cette forme, on voit qu’il est facile de borner cette erreur comme |ε| ≤ 10−k10pour tout x10∈ F10k10. Ceci implique qu’on peut écrire la fonction exponentielle décimale en utilisant la méthode de conversion du nombre décimal pour utiliser la fonction exponentielle binaire, et convertir le résultat de nouveau en décimal. Si l’erreur croît avec l’exponentielle, elle est toujours négligeable par rapport à la précision du résultat attendu.

4.3.3 Logarithme

Le cas du logarithme est un peu plus complexe. On peut le réécrire de la façon suivante log(x2) = log(x10· (1 + ε)) log(x2) = log(x10) · µ 1 + 1 log(x10log(1 + ε) ε · ε ¶ (4.26)

On peut voir sous cette forme que l’erreurε est directement liée au terme 1

log(x10). Cela signifie que lorsque cette quantité n’est pas bornée, l’erreur croît considérablement.

L’évaluation du logarithme en le point x10= 1 peut être définie manuellement telle que log(x10) = 0. Cependant autour de ce point, l’erreur produite par la conversion du nombre décimal en binaire est amplifiée par le calcul du logarithme. Dans ce cas, atteindre un arrondi correct avec notre algorithme de conversion sur la valeur en sortie peut néces-siter un grand nombre d’itérations, répétant ainsi les appels à l’opération de logarithme binaire en MPFR. Le temps d’exécution de l’algorithme n’est alors plus compétitif pour une bibliothèque arithmétique multi-précision décimale rapide.

On peut s’affranchir de ce problème facilement en utilisant judicieusement les fonc-tions de MPFR à notre disposition, notamment en appelant la fonctionmpfr_log1pautour de 1. Pour se faire, on calcule d’abord t10= x10− 1, avec x10autour de 1, c’est-à-dire que nous bornons x10tel que 12≤ x10≤ 2. Alors, par l’application du lemme 2, ou lemme de Sterbenz, cette soustraction décimale est exacte.

Lemme 2 (Sterbenz [105]). Soit un système de nombres à virgules flottantes en baseβ avec des nombres dénormalisés, si x et y sont deux nombres à virgules flottantes finis tels que

y

2≤ x ≤ 2y, (4.27)

alors x − y est représentable exactement.

La variable t10 est ensuite convertie en binaire à une précision k2 telle que t2

mpd_get_fr(t2, t10). On appellempfr_log1psur cette variable t2, de sorte que le résultat calculé est l’arrondi de log (1 + t2) = log(1 + (x10− 1) (1 + ε)) = log(x10(1 + ε)). Finalement, nous calculons bien le logarithme souhaité correctement arrondi autour de 1.

Traiter ponctuellement les cas où l’erreur de conversion est amplifiée dans l’algorithme n’est pas toujours possible, notamment lorsqu’il y a un grand nombre de points difficiles, comme dans le cas des fonctions trigonométriques telles que sin et cos.