Arithmétique virgule flottante

exactement représentables – en arithmétique Binary32 et n = 100, 000. méthode .... phénomènes peuvent se produire si un + grand format est disponible :.
2MB taille 24 téléchargements 123 vues
Arithmétique virgule flottante Jean-Michel Muller CNRS - Laboratoire LIP (CNRS-INRIA-ENS Lyon-Université de Lyon) Ecole PRCN – Mars 2013

http://perso.ens-lyon.fr/jean-michel.muller/

Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

1/1

Arithmétique virgule flottante trop souvent perçue comme un tas de recettes de cuisine ; beaucoup de “théorèmes” qui sont vrais. . . souvent ; de simples–mais corrects !–modèles tels que le modèle standard en l’absence d’overflow/underflow, la valeur calculée de (a>b) vaut (a>b) · (1 + δ), |δ| ≤ 2−p , (en base 2, mantisses de p bits et arrondi au plus près) sont très utiles, mais ne permettent pas de capter des comportements subtils, comme dans s = a + b ; z = s - a ; r = b - z et beaucoup d’autres. au passage, est-ce que ces “comportements subtils” sont robustes ? Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

2/1

Propriétés souhaitables d’une arithmétique machine Vitesse : la météo de demain doit être calculée en moins de 24 heures ; Précision, dynamique : par exemple, certaines prédictions de la mécanique quantique et de la relativité générale vérifiées avec erreur relative ≈ 10−14 ; “taille” : surface de circuit, taille du code, consommation mémoire ; Energie consommée : autonomie, chauffe des circuits ; Portabilité : les programmes mis au point sur un système doivent pouvoir tourner sur un autre sans requérir des modifications longues et/ou complexes ; Simplicité d’implantation et d’utilisation : si une arithmétique est trop ésotérique, personne ne l’utilisera.

Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

3/1

Les précurseurs système babylonien de base 60 ; règle à calcul : Gunter (1681-1626), Oughtred (1575-1660) ;

Leonardo Torres y Quevedo (1914) : implantation électromécanique de la machine de Babbage, avec virgule flottante ; Konrad Zuse : Z3 (1941) : base 2, mantisses de 14 bits exposants de 7 bits. Mémoire de 16 nombres. Voir http://www.epemag.com/zuse/

Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

4/1

On peut faire du très mauvais travail. . .

1994 : bug de la division du Pentium, 8391667/12582905 donnait 0.666869 · · · au lieu de 0.666910 · · · ; Excel, versions 3.0 à 7.0, entrez 1.40737488355328, vous obtiendrez 0.64 Sur certains ordinateurs Cray on pouvait déclencher un overflow en multipliant par 1 ; Excel’2007 (premières versions), calculez 65535 − 2−37 , vous obtiendrez 100000 ;

Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

5/1

Un peu d’exotisme

Machine Setun, université de Moscou, 1958. 50 exemplaires ; base 3 et chiffres −1, 0 et 1. Nombres sur 18 « trits » ; idée : base β, nombre de chiffres n, + grand nombre représenté M. Mesure du « coût » : β × n. minimiser β × n sachant que β n ≈ M. Si variables réelles, optimum β = e = 2.718 . . . ≈ 3. Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

6/1

Système virgule flottante  β≥2  base précision p≥1 Paramètres :  exposants extrèmes emin , emax Un nombre VF fini x est représenté par 2 entiers : mantisse entière : M, |M| ≤ β p − 1 ; exposant e, emin ≤ e ≤ emax . tels que x = M × β e+1−p On appelle mantisse réelle, ou mantisse de x le nombre m = M × β 1−p , ce qui donne x = m × β e , avec |m| < β.

Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

7/1

Représentation normalisée Buts : représentation unique et algorithmique plus simple. La représentation normalisée de x, est celle qui minimise l’exposant. Si e > emin , donne nécessairement 1 ≤ |m| < β et β p−1 ≤ |M| ≤ β b − 1. Nombre normal : de valeur absolue ≥ β emin . En base 2 le premier chiffre de mantisse d’un nombre normal est un “1” → pas besoin de le mémoriser. Nombre sous-normal : de la forme M × β emin +1−p . avec |M| ≤ β p−1 − 1. Le premier chiffre de mantisse d’un nombre sous-normal est un zéro. Correspond à ±0.xxxxxxxx × β emin .

Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

8/1

Les sous-normaux compliquent les algorithmes, mais. . . a−b a

0

β emin β emin +1 β emin +2

a−b a

0

b

b

β emin β emin +1 β emin +2

Figure: En haut : nombres VF normaux. Dans cet ensemble, a − b n’est pas représentable → le calcul a − b donnera 0 en arrondi au plus près. En bas : on ajoute les sous-normaux. Jean-Michel Muller

Système DEC VAX ( D format ) HP 28, 48G IBM 370 et 3090 IEEE-754 binary32 IEEE-754 binary64 IEEE-754 binary128 IEEE-754 decimal32 IEEE-754 decimal64 IEEE-754 decimal128

Arithmétique virgule flottante

β 2 2 10 16 16 2 2 2 10 10 10

p 24 56 12 6 14 23+1 52+1 112+1 7 16 34

binary32 = simple précision

Jean-Michel Muller

emin -128 -128 -500 -65 -65 -126 -1022 -16382 -95 -383 -6143

emax 126 126 498 62 62 127 1023 16383 96 384 6144

Mars 2013

9/1

+ grand représ. 1.7 · · · × 1038 1.7 · · · × 1038 9.9 · · · × 10498 7.2 · · · × 1075 7.2 · · · × 1075 3.4 · · · × 1038 1.8 · · · × 10308 1.2 · · · × 104932 9.99 · · · 9 × 1096 9.99 · · · 9 × 10384 9.99 · · · 9 × 106144

binary64 = double précision.

Arithmétique virgule flottante

Mars 2013

10/1

Norme IEEE 754 (1985 et 2008)

la norme IEEE 754-1985 a mis fin à une pagaille (très mauvaise portabilité des algorithmes numériques) ; leader : W. Kahan (père de l’arithmétique des HP35 et Intel 8087) ; formats ; spécification des opérations, des conversions, etc. ; √ gestion des exceptions (max+1, 1/0, −2, 0/0, etc.) ; nouvelle révision adoptée en 2008.

Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

11/1

Juste quelques mots sur les exceptions dans la norme

l’utilisateur peut (difficilement, et c’est un euphémisme) définir le comportement du programme dans les cas exceptionnels ; philosophie par défaut : le calcul doit toujours continuer ; le format comporte deux infinis, et deux zéros. Règles intuitives : 1/(+0) = +∞, 5 + (−∞) = −∞. . . ; √ tout de même un truc bizarre : −0 = −0 ; √ Not a Number (NaN) : résultat de −5, (±0)/(±0), (±∞)/(±∞), (±0) × (±∞), NaN +3, etc.

Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

12/1

Juste quelques mots sur les exceptions dans la norme en général, se comporte “bien” 1+

3 x2

avec x très grand (de sorte que x 2 “dépasse”) → 1. S’en méfier tout de même. Comportement pour x grand de √

I I I

x2 x3 + 1

√ on devrait obtenir un résultat proche de x ; 3 2 si x “dépasse” mais pas x , on obtiendra 0 ; si les 2 dépassent, on obtiendra NaN.

Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

13/1

Quelques propriétés des NaN

se propagent : x+ NaN = NaN. Nécessaire (que faire d’autre ?) mais dangereux (embarqué) ; comparaisons : toute comparaison impliquant un NaN retourne faux (sauf une, voir ci-dessous) → x ≥ y n’est pas exactement le contraire de x < y . si x est un NaN, le test “x = x” retourne “faux” et le test “x 6= x” retourne “vrai” → fournit un moyen simple de tester qu’une variable est un NaN ;

Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

14/1

Mauvaise gestion des exceptions. . . Novembre 1998, navire américain USS Yorktown, on a par erreur tapé un « zéro » sur un clavier → division par 0. Ce problème n’était pas prévu → cascade d’erreurs → arrêt du système de propulsion.

premier envol. . . et premier plongeon d’Ariane 5

Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

15/1

Codages internes des formats binaires de la norme IEEE-754 binary32/simple précision : 32 bits (1 de signe, 8 d’exposant, 23 + 1 de mantisse) ; binary64/double précision : 64 bits (1 de signe, 11 d’exposant, 52 + 1 de mantisse) ; binary128/quad précision : 128 bits (1 de signe, 15 d’exposant, 112 + 1 de mantisse) ; le premier bit de mantisse des normaux est un “1”, celui des sous-normaux est un “0” → on ne le mémorise pas ; exposant biaisé : on représente l’exposant e par l’entier positif e + b (binary32 : b = 127, binary64 : b = 1023, binary128 : b = 16383) ; écriture dans l’ordre (signe, exposant biaisé, mantisse) → comparaison lexicographique, comme pour des entiers, et passage au successeur par incrémentation entière. Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

16/1

Exposants réservés la plage d’exposants “normaux” utilisables est de I I I

−126 à +127 (biaisé : 1 à 254) en binary32, −1022 à +1023 (biaisé : 1 à 2046) en binary64, −16382 à +16383 (biaisé : 1 à 32766) en binary128 ;

l’exposant tient sur 8 bits (binary32), 11 bits (binary64), ou 15 bits (binary128) ; → on peut représenter les entiers de 0 à 255 (binary32), 0 à 1023 (binary64), ou 0 à 32767 (binary128). Les valeurs extrêmes sont réservées : I I

l’exposant biaisé 0 code 0 et les dénormalisés. l’exposant maximum (255 ou 1023 ou 32767 → rien que des “1”) code les valeurs spéciales ±∞ et NaN.

Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

17/1

Exposants réservés

l’exposant biaisé 0 code 0 et les dénormalisés. l’exposant maximum (255 ou 1023 ou 32767 → rien que des “1”) code les valeurs spéciales ±∞ et NaN. −0 +0 −∞ +∞ NaN 5

Jean-Michel Muller

1 0 1 0 0 0

00000000 00000000 11111111 11111111 11111111 10000001

00000000000000000000000 00000000000000000000000 00000000000000000000000 00000000000000000000000 chaîne non nulle 01000000000000000000000

Arithmétique virgule flottante

Mars 2013

18/1

Arrondi correct En général, la somme, le produit, etc. de deux nombres VF n’est pas un nombre VF → nécessité de l’arrondir.

Définition 1 (Arrondi correct) Fonction d’arrondi x 7→ ◦(x) parmi : RN (x) : au plus près (défaut) s’il y en a deux : I I

round ties to even : celui dont la mantisse entière est paire ; round ties to away : (2008 – recomm. en base 10 seulement) celui de plus grande valeur absolue.

RU (x) : vers +∞. RD (x) : vers −∞. RZ (x) : vers zéro. Une opération dont les entrées sont des nombres VF doit retourner ce qu’on obtiendrait en arrondissant le résultat exact. Jean-Michel Muller

Arithmétique virgule flottante

Arrondi correct IEEE-754-1985 : Arrondi correct pour +, −, ×, ÷, conversions. Avantages :

Mars 2013



19/1

et certaines

si le résultat d’une opération est exactement représentable, on l’obtient ; √ si on n’utilise que +, −, ×, ÷ et , et si l’ordre des opérations ne change pas, l’arithmétique est déterministe : on peut élaborer des algorithmes et des preuves qui utilisent ces spécifications ; précision et portabilité améliorées ; en jouant avec les arrondis vers +∞ et −∞ → bornes certaines sur le résultat d’un calcul. L’arithmétique VF devient une structure mathématique en elle même, que l’on peut étudier. IEEE-754-2008 : l’arrondi correct est recommandé (mais pas exigé) pour les principales fonctions mathématiques (cos, exp, log, . . . ) Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

20/1

Arrondi correct l’arrondi correct garantit que l’addition et la multiplication virgule flottante sont commutatives. Pour toute fonction d’arrondi ◦ : ◦(a + b) = ◦(b + a) par contre l’associativité n’est pas conservée. Exemple : a = β p+1 , b = −a, et c = 1, donne RN (a + RN (b + c)) = 0 et RN ( RN (a + b) + c) = 1. la perte d’associativité est plus “douce” pour la multiplication, sauf en cas de dépassements. la distributivité n’est pas préservée non plus. Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

21/1

Erreur relative, unité d’arrondi et “modèle standard”

Pour simplifier : base 2, précision p, unité d’arrondi u = 2−p si arrondi au + près, 2−p+1 avec les autres fonctions d’arrondi, si x et y sont des nombres VF, et si op ∈ {+, −, ×, /}, alors en l’absence d’overflow et d’underflow, RN (x op y ) = (x op y )(1 + 1 ) = (x op y )/(1 + 2 ),

Jean-Michel Muller

Arithmétique virgule flottante

(1a) |1 |, |2 | ≤ u.

Mars 2013

(1b)

22/1

Erreur relative, unité d’arrondi et “modèle standard” Le modèle standard est très utile pour analyser les algorithmes numériques. Exemple 1 : binary64 (base 2, p = 53), et fonction d’arrondi RN ; on veut calculer x1 · x2 · x3 · . . . · xn par l’algorithme : P ← x1 for i = 2 to n do P ← RN (P × xi ) end for la valeur finale de P vérifie P = x1 x2 x3 . . . xn × K , où n−1 n−1 1 − 2−p ≤ K ≤ 1 + 2−p , l’erreur relative est donc majorée par (1 + 2−p ) donnera 1.108 × 10−13 . Jean-Michel Muller

n−1

− 1, Pour n = 500,

Arithmétique virgule flottante

Mars 2013

23/1

Erreur relative, unité d’arrondi et “modèle standard” Exemple 2 (sommation “naïve”) : a1 + a2 + · · · + an approché par σ = RN (· · · RN ( RN ( RN (a1 + a2 ) + a3 ) + a4 ) + · · · + an ). Base 2 et précision p. On rappelle que u = 2−p . En définissant γn = on trouve

nu , 1 − nu

n n X X ai ≤ γn−1 |ai |. σ − i=1

(2)

i=1

Résultats similaires pour produit scalaire, évaluation de polynômes par le schéma de Horner, etc.

Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

24/1

Mais le modèle standard ne fait pas tout

on oublie que le résultat d’un opération est complètement déterminé, on n’utilise pas le fait que certaines opérations sont en fait exactes, on perd certaines propriétés telles que la préservation de la commutativité de + et × ; → incapacité à capter des comportements subtils, comme dans s = a + b ; z = s - a ; r = b - z et beaucoup d’autres.

Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

25/1

Premier exemple : lemme de Sterbenz

Lemme 1 (Sterbenz) Base β, avec nombres sous-normaux disponibles. Soient a et b deux nombres VF positifs. Si a ≤ b ≤ 2a 2 alors a − b est un nombre VF. → Il est calculé exactement dans n’importe lequel des 4 modes d’arrondi. Preuve : élémentaire en utilisant la notation x = M × β e+1−p .

Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

26/1

Erreur de l’addition VF (Møller, Knuth, Dekker) Premier résultat : représentabilité. RN (x) = x arrondi au plus près.

Lemme 2 Soient a et b deux nombres VF. Soient s = RN (a + b) et r = (a + b) − s. s’il n’y a pas de dépassement de capacité en calculant s, alors r est un nombre VF.

Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

27/1

Erreur de l’addition VF (Møller, Knuth, Dekker) Démonstration : Supposons |a| ≥ |b|, 1

s est “le” nombre VF le plus proche de a + b → il est plus près de a + b que a ne l’est. Donc |(a + b) − s| ≤ |(a + b) − a|, par conséquent |r | ≤ |b|.

2

posons a = Ma × β ea −p+1 et b = Mb × β eb −p+1 , avec |Ma |, |Mb | ≤ β p − 1, et ea ≥ eb . a + b est multiple de β eb −p+1 ⇒ s et r sont multiples de β eb −p+1 également ⇒ ∃R ∈ Z t.q. r = R × β eb −p+1 mais |r | ≤ |b| ⇒ |R| ≤ |Mb | ≤ β p − 1 ⇒ r est un nombre VF.

Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

28/1

Obtenir r : l’algorithme fast2sum (Dekker) Théorème 1 (Fast2Sum (Dekker)) β ≤ 3. Soient a et b des nombres VF dont les exposants vérifient ea ≥ eb (si |a| ≥ |b|,OK). Algorithme suivant : s et r t.q. s + r = a + b exactement ; s est “le” nombre VF le plus proche de a + b.

Algorithme 1 (FastTwoSum)

Programme C 1

s ← RN (a + b) z ← RN (s − a) r ← RN (b − z)

s = a+b; z = s-a; r = b-z;

Se méfier des compilateurs “optimisants”. Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

29/1

Preuve dans un cas simplifié : β = 2 et |a| ≥ |b| s = RN (a + b) z = RN (s − a) t = RN (b − z) si a et b sont de même signe, alors |a| ≤ |a + b| ≤ |2a| donc (base 2 → 2a représentable, arrondi croissant) |a| ≤ |s| ≤ |2a| → (Lemme Sterbenz) z = s − a. Comme r = (a + b) − s est représentable et b − z = r , on trouve RN (b − z) = r . si a et b sont de signes opposés, alors 1

2

soit |b| ≥ 12 |a|, auquel cas (lemme Sterbenz) a + b est exact, donc s = a + b, z = b et t = 0 ; soit |b| < 12 |a|, auquel cas |a + b| > 12 |a|, donc s ≥ 12 |a| (base 2 → 12 a est représentable, et l’arrondi est croissant), donc (lemme Sterbenz) z = RN (s − a) = s − a = b − r . Comme r = (a + b) − s est représentable et b − z = r , on trouve RN (b − z) = r .

Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

30/1

Algorithme TwoSum (Møller-Knuth) pas besoin de comparer a et b ; 6 opérations au lieu de 3 → moins cher qu’une mauvaise prédiction de branchement en comparant a et b.

Algorithme 2 (TwoSum) s ← RN (a + b) a0 ← RN (s − b) b0 ← RN (s − a0 ) δa ← RN (a − a0 ) δb ← RN (b − b0 ) r ← RN (δa + δb )

Knuth : ∀β, en absence d’underflow et d’overflow a + b = s + r , et s est le nombre VF le plus proche de a + b. Boldo et al : (preuve formelle) en base 2, marche même si underflow.

Preuves formelles (en Coq) d’algorithmes similaires très pratiques : http://lipforge.ens-lyon.fr/www/pff/Fast2Sum.html. Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

31/1

TwoSum est optimal Supposons qu’un algorithme vérifie : pas de tests, ni d’instructions min/max ; seulement des additions/soustractions arrondies au + près : à l’étape i, on calcule RN (u + v ) ou RN (u − v ), où u et v sont des variables d’entrée ou des valeurs précédemment calculées. Si cet algorithme retourne toujours les mêmes résultats que 2Sum, alors il nécessite au moins 6 additions/soustractions (i.e., autant que 2Sum). preuve : most inelegant proof award ; 480756 algorithmes avec 5 opérations (après suppression des symétries les plus triviales) ; chacun d’entre eux essayé avec 2 valeurs d’entrée bien choisies.

Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

32/1

Revenons au calcul de sommes Compensated summation (Kahan) pour approcher x1 + x2 + · · · xn .

Algorithme 3 s ← x1 c ←0 for i = 2 to n do y ← RN (xi − c) t ← RN (s + y ) c ← RN ( RN (t − s) − y ) s←t end for return s

Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

33/1

Additionner n nombres : compensated summation (Kahan) Le même, réécrit avec des Fast2Sum.

Algorithme 4 s ← x1 c←0 for i = 2 to n do y ← ◦(xi + c) (s, c) ← Fast2Sum(s, y ) end for return s → variante de l’algorithme naïf, où à chaque pas on ré-injecte l’erreur de l’addition précédente.

Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

34/1

Pichat, Ogita, Rump, Oishi

Algorithme 5 s ← x1 e←0 for i = 2 to n do (s, ei ) ← 2Sum(s, xi ) e ← RN (e + ei ) end for return RN (s + e) → variante de l’algorithme naïf, où à chaque pas on accumule les erreurs des additions pour les rajouter à la fin.

Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

35/1

Pichat, Ogita, Rump, Oishi On rappelle que u = 2−p (base 2 et précision p), et que γn =

nu . 1 − nu

Théorème 2 (Ogita, Rump et Oishi) En appliquant l’algorithme de P.,O., R., et O. à xi , 1 ≤ i ≤ n, et si nu < 1, alors, même en cas d’underflow (mais sans overflow), le résultat final retourné par l’algorithme, σ, satisfait n n n X X X 2 xi ≤ u xi + γn−1 |xi |. σ − i=1

Jean-Michel Muller

i=1

Arithmétique virgule flottante

i=1

Mars 2013

36/1

Table: Erreurs de diverses méthodes pour xi = RN (1/i) – donc tous les xi sont exactement représentables – en arithmétique Binary32 et n = 100, 000.

méthode ordre croissant ordre décroissant compensated (Kahan) Pichat ; ou Rump, Ogita & Oishi

Jean-Michel Muller

erreur en ulps 6.86 738.9 0.137 0.137

Arithmétique virgule flottante

Mars 2013

37/1

Table: Erreurs de diverses méthodes pour xi = RN (cos(i)) – donc tous les xi sont exactement représentables – en arithmétique Binary32 et n = 5000.

méthode increasing order decreasing order compensated (Kahan) Pichat ; or Ogita, Rump and Oishi

Jean-Michel Muller

Arithmétique virgule flottante

erreur en ulps 18.90625 16.90625 6.90625 0.09375

Mars 2013

38/1

Une autre propriété (Kahan)

x z=p x2 + y2 arrondi correct, arrondi au plus près, base 2 ; pas d’overflow/underflow. x et y sont des nombres VF, La valeur calculée de z est comprise au sens large entre −1 et +1. Propriété importante car jugée (naïvement !) évidente par la plupart des programmeurs, qui pourront par exemple calculer une fonction de z définie seulement entre −1 et +1. Le programmeur expérimenté de 2012 rejoint le programmeur naïf de 1980 ! Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

39/1

Et les produits ? FMA : fused multiply-add (fma), calcule RN (ab + c). RS6000, PowerPC Itanium, Bulldozer, Haswell. Spécifié dans IEEE 754-2008 si a et b sont des nombres VF, alors r = ab − RN (ab) est un nombre VF ; 

obtenu par l’algorithme TwoMultFMA

p r

= =

RN (ab) →2 RN (ab − p)

opérations seulement. p + r = ab. sans fma, algorithme de Dekker : 17 opérations (7 ×, 10 ±).

Itanium 2 Jean-Michel Muller

PowerPC 5 Arithmétique virgule flottante

Mars 2013

40/1

ad − bc “naïf” avec un fma ˆ = RN (bc) ; on a envie de calculer w ˆ ). puis (avec un fma), xˆ = RN (ad − w peut être catastrophique (bien pire que de faire RN ( RN (ad ) − RN (bc))). En effet, considérons le cas : a = b, et c = d ; ˆ = RN (ad ) 6= ad . ad n’est pas exactement représentable en VF : w On aura : la valeur exacte de x = ad − bc est nulle ; xˆ 6= 0, → l’erreur relative |ˆ x − x|/|x| est infinie.

Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

41/1

ad − bc précis avec un fma (base 2) Algorithme de Kahan pour x = ad − bc : ˆ ← RN (bc) w ˆ − bc) e ← RN (w ˆ) fˆ ← RN (ad − w xˆ ← RN (fˆ + e) Retourner xˆ

avec le “modèle standard” : |ˆ x − x| ≤ J|x| où J = 2u + u2 + (u + u2 )u |bc| |x| → précis tant que u|bc| 6 |x| en utilisant les propriétés de RN (Jeannerod, Louvet, M., 2011) |ˆ x − x| ≤ 2u|x|

u = 2−p asymptotiquement optimal. → × et ÷ complexes. Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

42/1

Erreur d’un FMA En collaboration avec Sylvie Boldo (2005) ; β = 2, p ≥ 3, fma, ni underflow ni overflow ; a, x, y : nombres VF ; un fma calcule r1 = RN (ax + y ) ; Deux questions : I I

combien faut-il de nombres VF pour représenter r1 − (ax + y ) ? peut-on les calculer facilement ?

Réponses : I I

I

deux nombres ; il faut 19 opérations (1 TwoMultFMA, 2 TwoSum, 2 additions, 1 FastTwoSum) ; Je n’avais aucune confiance en notre preuve avant que Sylvie Boldo la transcrive en Coq.

Peut servir à faire des “évaluations de polynômes compensées”. Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

43/1

L’algorithme de Malcolm-Gentleman Arithmétique VF de base β. Fonction d’arrondi ◦ ∈ { RN , RU , RD , RZ }.

Algorithme 6 A ← 1.0 B ← 1.0 while ◦(◦(A + 1.0) − A) = 1.0 do A ← ◦(2 × A) end while while ◦(◦(A + B) − A) 6= B do B ← ◦(B + 1.0) end while return B

Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

44/1

Cet algorithme calcule β Base β, précision p, Ai = A après ième passage dans le 1er while ; Récurrence → si 2i ≤ β p − 1, alors Ai = 2i exactement. Donne Ai + 1 ≤ β p → ◦(Ai + 1.0) = Ai + 1. On en déduit ◦(◦(Ai + 1.0) − Ai ) = ◦((Ai + 1) − Ai ) = 1. Donc tant que 2i ≤ β p − 1,on reste dans la 1ère boucle. Considérons le plus petit j t.q. 2j ≥ β p . On a Aj = ◦(2Aj−1 ) = ◦(2 × 2j−1 ) = ◦(2j ). Comme β ≥ 2, on déduit β p ≤ Aj < β p+1 . Donc le successeur VF de Aj est Aj + β → ◦(Aj + 1.0) vaudra soit Aj soit Aj + β donc ◦(◦(Aj + 1.0) − Aj ) vaudra 0 ou β : dans tous les cas, il sera 6= 1.0 → on quitte la boucle. Donc à la fin de la 1ère boucle while, A vérifie β p ≤ A < β p+1 . Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

45/1

Considérons la 2ème boucle while. On a vu que le successur VF de A est A + β. Donc tant que B < β, ◦(A + B) vaut soit A soit A + β → ◦(◦(A + B) − A) vaut 0 ou β : dans les 2 cas on reste dans la boucle. Dès que B = β, ◦(A + B) vaut exactement A + B, donc ◦(◦(A + B) − A) = B. On quitte donc la 2ème boucle dès que B = β

Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

46/1

Les erreurs les plus dangereuses sont idiotes

la sonde Mars Climate Orbiter s’est écrasée sur Mars en 1999 ; une partie des développeurs des logiciels supposait que l’unité de mesure était le mètre ; l’autre partie croyait que c’était le pied.

Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

47/1

Donc tout va pour le mieux dans le meilleur des mondes. . .

arrondi correct → arithmétique “déterministe” ; on calcule facilement l’erreur d’une addition ou multiplication VF ; on peut “ré-injecter” cette erreur plus tard → sommes, produits scalaires, évaluations de polynômes, . . . précis déjà de nombreux tels algorithmes compensés, sûrement d’autres à venir.

. . . sauf que la vie n’est pas si simple !

Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

48/1

Arithmétique déterministe ? Programme C : double a = 1848874847.0; double b = 19954562207.0; double c; c = a * b; printf("c = %20.19e\n", c); return 0;

Selon l’environnement, 3.6893488147419103232e+19 ou 3.6893488147419111424e+19 (nombre Binary64 le plus proche du résultat exact).

Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

49/1

Arithmétique déterministe ?

option de compilation gcc par défaut -mfpmath=387 -march=pentium4 -mfpmath=sse

résultat c = 3.6893488147419103232e+19 c = 3.6893488147419103232e+19 c = 3.6893488147419111424e+19

Table: Résultats sur plateforme Linux/Debian Etch 32-bit Intel, avec gcc 4.1.2 20061115. Le défaut est d’utiliser les registres 387.

Note : le “bon résultat” est 3.6893488147419111424e+19.

Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

50/1

Doubles arrondis

plusieurs formats VF dans un même environnement → difficile de savoir dans quel format certaines opérations sont faites ; peut rendre le résultat d’une suite d’opérations difficile à prédire ; Supposons que routes les variables déclarées soient du même format. Deux phénomènes peuvent se produire si un + grand format est disponible : variables implicites t.q. le résultat de “a+b” dans “d = (a+b)*c” : difficile de savoir dans quel format elles sont calculées ; variables explicites : peuvent être d’abord arrondies dans le format de destination → conduit à un double arrondi.

Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

51/1

Que s’est-il produit dans l’exemple ? La valeur de a*b est 36893488147419107329. En binaire : 64 bits

}| { z 10000000000000000000000000000000000000000000000000000 | {z } 10000000000 01 53 bits

Le produit est d’abord arrondi au format INTEL “double-extended”, on obtient 64 bits

z }| { 10000000000000000000000000000000000000000000000000000 | {z } 10000000000 ×4 53 bits

quand cette valeur intermédiaire est arrondie au format de destination binary64, cela donne (arrondi : RN ) 13 10000000000000000000000000000000000000000000000000000 | {z }×2 53 bits

= 3689348814741910323210 ,

→ produit arrondi vers le bas, alors qu’il aurait dû être arrondi vers le haut. Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

52/1

Est-ce un problème ? Dans la plupart des applications, sans incidence ; peut rendre le résultat de programmes numériques difficile à prédire (exemples intéressants dûs à Monniaux) ; la plupart des compilateurs permettent de s’affranchir du problème. Cependant, I I I

parfois mal documenté ; restriction à la portabilité ; impact possible sur la vitesse et la précision

→ voir quelles propriétés restent varies en présence de doubles arrondis (par exemple : quels algorithmes de sommation continuent à être très précis). Pas de problème avec les instructions SSE, et IEEE 754-2008 améliore la situation. Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

53/1

Exemple : 2Sum et doubles arrondis Format cible de précision p ; format plus large de précision p + p 0 .

Algorithme 7 (2Sum-with-double-roundings(a, b)) (1) (2) (3) (4) (5) (6)

s ← RN p ( RN p+p0 (a + b)) or RN p (a + b) a0 ← RN p ( RN p+p0 (s − b)) or RN p (s − b)) b0 ← ◦(s − a0 ) δa ← RN p ( RN p+p0 (a − a0 )) or RN p (a − a0 ) δb ← RN p ( RN p+p0 (b − b0 )) or RN p (b − b0 ) t ← RN p ( RN p+p0 (δa + δb )) or RN p (δa + δb )

◦(u) : RN p (u), RN p+p0 (u), or RN p ( RN p+p0 (u)), ou n’importe quel “arrondi fidèle”.

Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

54/1

Exemple : 2Sum et doubles arrondis

Théorème 2 p ≥ 4 et p 0 ≥ 2. Si a et b sont des nombres VF de précision p, en l’absence d’overflow, l’algorithme ?? vérifie t = RN p (a + b − s).

→ de nombreuses propriétés restent vraies ou ne demandent que peu de modifications ; suivre les travaux de Sylvie Boldo (http://www.lri.fr/~sboldo/), sur des preuves “hardware-independent” de programmes.

Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

55/1

ULP : Unit in the Last Place

Base β, précision p. Dans ce qui suit, x est un réel, et X un nombre VF censé l’approcher.

Définition 3 Si x ∈ [β e , β e+1 ) alors ulp (x) = β max(e,emin )−p+1 . En gros : distance entre 2 nombres VF au voisinage de x. arrondi au + près ' erreur majorée par 1/2 ulp .

Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

56/1

ULP : Unit in the Last Place Propriété 1 En base 2, |X − x|
12 ulp de yn+1

yn+1 1 ulp = 2−p

Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

61/1

Qu’en déduit-on ? pour être à distance > 1/2 ulp de yn+1 , 1/b doit être à moins de bα2 2−2p < b2−2p du milieu de 2 nombres VF consécutifs ; la distance entre yn et 1/b doit donc être de la forme 2−p−1 + , avec || < b2−2p ; implique α
1/2 ulp de yn+1 , 1/b doit être à moins 2 de 12 + b2−p b2−2p du milieu de 2 nombres VF consécutifs.

Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

62/1

b est un nombre VF entre 1 et 2 ⇒ b = B/2p−1 où B ∈ N, 2p−1 < B ≤ 2p − 1 ; le milieu de 2 nombres VF consécutifs au voisinage de 1/b est de la forme g = (2G + 1)/2p+1 où G ∈ N, 2p−1 ≤ G < 2p − 1 ; on en déduit

2p g − 1 = 2BG + B − 2 b B.2p+1

la distance entre 1/b et le milieu de 2 nombres VF consécutifs est un multiple non nul de 1/(B.2p+1 ) = 2−2p /b.

Jean-Michel Muller

Distance entre

Arithmétique virgule flottante

1 b

Mars 2013

et g , quand b1 − yn+1 > 21 ulp

1 b

63/1



est de la forme k2−2p /b, k ∈ Z, k 6= 0 ; on doit avoir

|k| · 2−2p < b



1 + b2−p 2

donc  |k|
p) → approximation y de f (x) dont l’erreur sur la mantisse est ≤ 2−m . peut être fait avec format intermédiaire plus grand, avec TwoSum, TwoMultFMA, etc. obtenir un arrondi correct de f (x) à partir de y : impossible si f (x) est trop proche d’un point où l’arrondi change (en arrondi au plus près : milieu de 2 nombres VF consécutifs). → il faut trouver—quand il existe—le plus petit m qui convienne pour tous les nombres VF.

Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

73/1

Résultats Table: Pires cas pour l’exponentielle de nombres double précision.

Interval [−∞, −2−30 ] [−2−30 , 0) (0, +2−30 ]

[2−30 , +∞]

worst case (binary) exp(−1.1110110100110001100011101111101101100010011111101010 × 2−27 ) = 1.111111111111111111111111100 · · · 0111000100 1 159 0001... × 2−1 exp(−1.0000000000000000000000000000000000000000000000000001 × 2−51 ) = 1.111111111111111 · · · 11111111111111100 0 0100 1010... × 2−1 exp(1.1111111111111111111111111111111111111111111111111111 × 2−53 ) = 1.0000000000000000000000000000000000000000000000000000 1 1104 0101... exp(1.0111111111111110011111111111111011100000000000100100 × 2−32 ) = 1.0000000000000000000000000000000101111111111111101000 0 057 1101... exp(1.1000000000000001011111111111111011011111111111011100 × 2−32 ) = 1.0000000000000000000000000000000110000000000000010111 1 157 0010... exp(1.1001111010011100101110111111110101100000100000001011 × 2−31 ) = 1.0000000000000000000000000000001100111101001110010111 1 057 1010... exp(110.00001111010100101111001101111010111011001111110100) = 110101100.01010000101101000000100111001000101011101110 0 057 1000...

Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

74/1

Résultats

Table: Pires cas pour les logarithmes de nombres double précision.

Interval [2−1074 , 1)

(1, 21024 ]

worst case (binary) log(1.1110101001110001110110000101110011101110000000100000 × 2−509 ) = −101100000.00101001011010100110011010110100001011111111 1 160 0000... log(1.1001010001110110111000110000010011001101011111000111 × 2−384 ) = −100001001.10110110000011001010111101000111101100110101 1 060 1010... log(1.0010011011101001110001001101001100100111100101100000 × 2−232 ) = −10100000.101010110010110000100101111001101000010000100 0 060 1001... log(1.0110000100111001010101011101110010000000001011111000 × 2−35 ) = −10111.111100000010111110011011101011110110000000110101 0 160 0011... log(1.0110001010101000100001100001001101100010100110110110 × 2678 ) = 111010110.01000111100111101011101001111100100101110001 0 064 1110...

Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

75/1

Conclusion

l’arrondi correct des fonctions les plus communes est faisable à coût raisonnable ; recommandé dans la norme IEEE 754-2008 (juin 2008) ; bibliothèque CRLIBM disponible à https://lipforge.ens-lyon.fr/projects/crlibm/

Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

76/1

Quelques logiciels utiles CRLIBM : fonctions mathématiques avec arrondi correct. http://lipforge.ens-lyon.fr/projects/crlibm/

La documentation qui explique les méthodes utilisées est à http: //lipforge.ens-lyon.fr/frs/download.php/41/crlibm-0.10.pdf

GAPPA : outil de vérifications de propriétés VF (p.ex. bornes) et de génération de preuves formelles. http://lipforge.ens-lyon.fr/www/gappa/

MPFR : arithmétique multi-précision avec arrondi correct. http://www.mpfr.org/

MPFI (basé sur MPFR) : arith. d’intervalles multi-précision. http://perso.ens-lyon.fr/nathalie.revol/software.html

PARI/GP : calculs rapides en arithmétique (factorisations, théorie algébrique des nombres, courbes elliptiques. . . ). http://pari.math.u-bordeaux.fr/ Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

77/1

Tester votre environnement virgule flottante

PARANOIA (W. Kahan et ses élèves) : http://www.netlib.org/paranoia/ UCB Test (plus récent, plus complet) : http://www.netlib.org/fp/ucbtest.tgz MPCHECK : test des fonctions mathématiques : http://www.loria.fr/~zimmerma/free/ méthodes de recherches de “cas difficiles” pour les opérateurs arithmétiques : John Harrison (factorisation), Michael Parks (remontée de Hensel) ;

Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

78/1

La virgule flottante sur le web le site de W. Kahan (père de la norme IEEE 754, de l’arithmétique du 8087 et de la HP35) : http://http.cs.berkeley.edu/~wkahan/ le site de D. Hough sur la révision de la norme http://www.validlab.com/754R/ l’article de Goldberg “What every computer scientist should know about Floating-Point arithmetic” http://www.validlab.com/goldberg/paper.pdf l’équipe AriC du LIP (ENS Lyon) http://www.ens-lyon.fr/LIP/AriC/ l’équipe Pequan du LIP6 (Paris 6) http://www.lip6.fr/recherche/team.php?id=120 l’équipe CACAO du Loria (Nancy) http://www.loria.fr/equipes/cacao/ ma propre page http://perso.ens-lyon.fr/jean-michel.muller/ Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

79/1

Une minute de pub Michael Overton Numerical Computing with IEEE Floating Point Arithmetic Siam, 2001 Bo Einarsson Accuracy and Reliability in Scientific Computing Siam, 2005 Jean-Michel Muller Elementary Functions, algorithms and implementation, 2ème édition Birkhauser Boston, 2006 Brisebarre, de Dinechin, Jeannerod, Lefèvre, Melquiond, Muller (coordinator), Revol, Stehlé and Torres A Handbook of Floating-Point Arithmetic Birkhauser Boston, 2010. Jean-Michel Muller

Arithmétique virgule flottante

Mars 2013

80/1