Manipulation des entiers signés : signe et valeur absolue

publicité
Manipulation des entiers signés : signe et valeur absolue
Système non redondant de base r ;
chiffres ∈ {0, 1, . . . , r − 1} → on représente tous les entiers
positifs.
Comment représenter les entiers relatifs (i.e. signés) ?
Première solution : signe et valeur absolue
conceptuellement simple ;
calcul de l’opposé trivial ;
deux représentations du zéro : +0 et −0 ;
algorithme (et donc circuit) différent pour addition et
soustraction
Manipulation des entiers signés : complément à la base (r
pair)
on dispose de n positions (on représente r n nombres
différents), on choisit de représenter tous les nombres compris
entre −r n /2 et r n /2 − 1 modulo r n
un nombre positif (entre 0 et r n /2 − 1) est représenté par son
écriture usuelle ;
un nombre x entre −r n /2 et −1 est représenté par l’écriture
usuelle de x + r n ;
signe : x ≥ 0 ⇔ son chiffre de poids fort xn−1 est < r /2 ;
Exemple : r = 10, n = 4, 3265 s’écrit 3265, et −3265 s’écrit
6735 ;
en base 2 (complément à 2), xn−1 xn−2 · · · x0 représente
n−1
−xn−1 2
+
n−2
X
i=0
xi 2i .
L’addition en complément à la base
l’addition se fait modulo r n → addition usuelle en ignorant la
retenue sortante ;
+
6 7 3 5
4 2 6 6
61 1 0 0 1
→ −3265 + 4266 = 1001.
dépassement de capacité lors du calcul de x + y :
s’ils sont de signes opposés, aucun dépassement possible ;
sinon : dépassement ssi la somme obtenue est de signe différent
Soustraction ?
ici : base 2 ;
calculer x − y c’est calculer x + (−y ) ;
si y = (yn−1 . . . y0 ) en complément à 2, définissons
ȳ = (yn−1 . . . y0 ) ;
y + ȳ = (1111 · · · 1) = −1, donc −y = ȳ + 1
→ soustraire un nombre = ajouter son complément, avec une
retenue entrante égale à 1 dans l’additionneur.
Multiplication
Multiplier : au moins aussi difficile qu’additionner (on s’en doutait !)
x
000 · · ·
001
X = 2n x + 1
y
000 · · ·
001
Y = 2n y + 1
2n
le produit XY donne :
xy
x +y
000 · · ·
01
4n
XY = 22n xy + 2n (x + y ) + 1.
→ Si on savait calculer XY en temps meilleur que O(log(4n))
= O(log(n)), on aurait x + y en temps meilleur que O(log(n)).
Théorème de Brent et Kung
Multiplieur n bits : circuit avec portes logiques à 2 entrées.
Hypothèses :
1
entrées et sorties en base 2 non redondante ;
2
circuit : surface plane et convexe d’aire A(n) ;
3
les connexions ont une largeur minimale λ > 0 ;
4
au plus ν ≥ 2 connexions peuvent se croiser en un point ;
5
un plot d’entrée/sortie contient un carré de côté λ ;
6
un bit met un temps ≥ τ pour se propager dans une connexion
ou pour être transmis par un plot d’entrée/sortie.
La surface A(n) du multiplieur et son temps de calcul T (n) vérifient
1
A(n) [T (n)] ≥
128
2
λτ
ν
2
· (n + 2)2
Multiplieurs cellulaires
pour simplifier : base 2 (non redondante), nombres positifs
uniquement ;
Algorithme “à la main” :
×
p5
a2 b1
a2 b2 a1 b2
p4
p3
a2
b2
a2 b0
a1 b1
a0 b2
p2
a1
a0
b1
b0
a1 b0 a0 b0
a0 b1
p1
p0
deux idées : addition carry-save, et dans une même colonne on
peut intervertir les bits comme ça nous arrange.
Petit retour sur l’addition carry-save
xy z
u =x ⊕y ⊕z
t = xy + xz + yz
FA
tu
a3 b 3
a2 b 2
a1 b1
FA
FA
FA
s4 s3
a0 b 0 0
FA
s1
s2
s0
a3 a3 b 3
(2) (1)
a2 a2 b2
(2) (1)
a1 a1 b 1
(2) (1)
a0 a0 b 0
(2) (1)
FA
FA
FA
FA
0
(1) (2)
s4 s4
0
(1) (2)
s3 s3
(1) (2)
s2 s2
(1) (2)
s1 s1
(1) (2)
s0 s0
Multiplieurs cellulaires
a4 b0
a 3 b4
a2 b0
0
a 1 b0
0
a2 b1
a1 b 1
a 3 b2
a2 b2
a1 b2
a0 b2
a3 b3
a 2 b3
a1 b3
a 0 b3
a2 b4
a 1 b4
a0 b4
a4 b2
a4 b4
a 3 b0
a3 b1
a 4 b1
a 4 b3
0
0
a0 b0
a0 b1
0
p9
p8
p7
p6
p5
p4
p3
p2
p1
p0
Multiplieurs cellulaires
temps : celui du plus long chemin dans ce graphe → 2n − 2
cellules FA pour un multiplieur n bits ;
n − 1 lignes identiques, et une seule est active à la fois, donne
2 idées
une seule ligne “rebouclée” sur elle-même (multiplieurs
“parallèle-série”) ;
pipe-line (en traitant à part la dernière ligne)
Faire mieux (mais plus gros !) : multiplieurs en temps logarithmique.
Décomposition récursive de la multiplication
Base r , nombres positifs (pour simplifier). On veut multiplier
A = A1 r n + A0 par B = B1 r n + B0 , où A0 , A1 , B0 , B1 s’écrivent sur
n chiffres.
Décomposition naïve (ou 4M)
AB = r 2n A1 B1 + r n (A1 B0 + A0 B1 ) + A0 B0
en séquentiel (logiciel), donne un temps en O(n2 ) pour
multiplier des nombres de n bits.
Décomposition de Karatsuba (ou 3M)
On calcule d’abord U = A1 B1 , V = A0 B0 ,
W = (A1 − A0 )(B1 − B0 ), et on obtient par la suite
AB = r 2n U + r n (U + V − W ) + V
en séquentiel (logiciel), chaque fois qu’on double n, on
log 3 multiplie (en gros. . . ) par 3 le temps → temps en O n log 2 .
Multiplieur “récursif” (4M) de Luk et Vuillemin
Circuit d’acheminement des opérandes
4M
n
2
4M
n
2
4M
n
2
4M
n
2
addition (en redondant) des résultats partiels
Temps de calcul en O(log(n)). . . mais circuit purement académique
Multiplieurs en temps logarithmique
appelés “arbres de Wallace”. . . mais c’est un peu injuste
multiplication (surtout en binaire) addition de n nombres
un additionneur “carry save” : peut se voir comme un
“compresseur” qui prend 3 entrées (non redondantes) et qui
exprime leur somme comme somme de ses 2 sorties (non
redondantes) ;
arbre d’addition : on fait des réductions partielles 3 → 2 :
l’ingénieur qui conçoit le circuit en bave (placement), mais
aucune difficulté conceptuelle
temps logarithmique
Arithmétique virgule flottante
s’est peu à peu imposée pour représenter les réels (en précision
finie) en machine ;
au début : pagaille totale :
avec certains Crays, multiplication par 1 → overflow ;
IBM 360 + Fortran : I = 14.0 / 2.0 donnait le résultat 1.0
1985 Norme IEEE 754-1985 : standardisation des formats et
√
du comportement des opérations (+,−,×,÷, )
prédictabilité
possibilité de construire des algorithmes et des preuves
pas de fonctions élémentaires (sin, cos, exp. . . les constructeurs
en profitent pour faire n’importe quoi)
2008 Nouvelle norme IEEE 754-2008
Les constructeurs en profitaient pour faire n’importe quoi
Computing System
Exact result
Vax VMS (g or h format)
HP 48 GX
HP 700
HP 375, 425t (4.3 BSD)
matlab V.4.2 c.1 for Macintosh
matlab V.4.2 c.1 for SPARC
Silicon Graphics Indy
SPARC
IBM RS/6000 AIX 3005
IBM 3090/600S-VF AIX 370
PC : Borland TurboC 2.0
Sharp EL5806
DECstation 3100
Casio fx-8100, fx180p, fx 6910 G
TI 89
sin x
−0.8522008497671888017727 · · ·
−0.852200849 · · ·
−0.852200849762
0.0
−0.65365288 · · ·
0.8740
−0.8522
0.87402806 · · ·
−0.85220084976718879
−0.852200849 · · ·
0.0
4.67734e − 240
−0.090748172
NaN
Error
Trig. arg. too large
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| < β.
Système virgule flottante
Ceci peut définir plusieurs représentations pour un même
nombre (7 × 101 = 70 × 100 ). L’ensemble des représentations
d’un même nombre est appelé une cohorte.
représentation normale : celle pour laquelle l’exposant est
minimum ;
une représentation normale vérifie :
soit |M| ≥ β p−1 (nombres normaux, de v.a. ≥ β emin )
soit |M| < β p−1 et e = emin (nombres sous-normaux, de v.a.
< β emin )
normal : ±m0 .m1 m2 · · · mp−1 × 2e , m0 6= 0, e ≥ emin ;
sous-normal : ±0.m1 m2 · · · mp−1 × 2emin .
En base 2 le premier chiffre de mantisse d’un nombre normal est un
“1” → pas besoin de le mémoriser.
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.
Système
DEC VAX
( D format )
HP 28, 48G
IBM 370
et 3090
IEEE-754
IEEE-754-R
“binary 128”
IEEE-754-R
“decimal 64”
β
2
2
10
16
16
2
2
p
24
56
12
6 (24 bits)
14 (56 bits)
23+1
52+1
emin
-128
-128
-500
-65
-65
-126
-1022
emax
126
126
498
62
62
127
1023
+ grand représ.
1.7 · · · × 1038
1.7 · · · × 1038
9.9 · · · × 10498
7.2 · · · × 1075
7.2 · · · × 1075
3.4 · · · × 1038
1.8 · · · × 10308
2
112+1
-16382
16383
1.2 · · · × 104932
10
16
-383
384
9.999 · · · 9 × 10384
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 juin 2008, promulguée en août.
Formats (norme 754-1985)
Format
Single precision
Double precision
Single-extended
Double-extended
Double-extended (IA32)
Hidden bit ?
yes
yes
optional
optional
no
p
24
53
≥ 32
≥ 64
64
emin
−126
−1022
≤ −1022
≤ −16382
−16382
emax
127
1023
≥ 1023
≥ 16383
16383
Formats “basiques” binaires (norme 754-2008)
Name
p
emax
emin
binary16
11
+15
−14
binary32
(basic)
24
+127
−126
binary64
(basic)
53
+1023
−1022
binary128
(basic)
113
+16383
−16382
Formats “basiques” décimaux (norme 754-2008)
Name
p
emax
emin
decimal32
7
+96
−95
decimal64
(basic)
16
+384
−383
decimal128
(basic)
34
+6144
−6143
Arrondi correct
Definition 1 (Arrondi correct)
Mode d’arrondi actif parmi :
au plus près (défaut) s’il y en a deux :
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.
vers +∞.
vers −∞.
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.
Arrondi correct
IEEE-754-1985 : Arrondi correct pour +, −, ×, ÷,
conversions. Avantages :
√
et certaines
si le résultat d’une opération est exactement représentable, on
l’obtient ;
√
si on n’utilise que +, −, ×, ÷ et , 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, . . . )
Premier exemple : lemme de Strebenz
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).
Apparente contradiction avec ce qu’on entend parfois dire sur la
soustraction de nombres proches.
Erreur de l’addition VF
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.
Erreur de l’addition VF
Démonstration : Supposons |a| ≥ |b|,
1
2
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|.
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.
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)
Se méfier des compilateurs “optimisants”.
s = a+b;
z = s-a;
r = b-z;
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.
Optimalité de l’algorithme TwoSum
Definition 2
Par la suite, on appelle Algorithme sans branchements à base de
RN-additions un algorithme
sans comparaisons, expressions conditionnelles, ou instructions
min/max ;
n’utilisant que des additions/soustractions en arrondi au plus
près : à l’étape i l’algorithme calcule RN (a + b) ou
RN (a − b) où a et b sont soit des variables d’entrée, soit des
valeurs calculées auparavant.
Graphe de dépendance d’un tel algorithme : DAG (Graphe orienté
acyclique). Profondeur de l’algorithme = profondeur du DAG.
Optimalité de l’algorithme TwoSum
Théorème 2
Dans tous les formats de la norme IEEE 754-2008, un algorithme
sans branchements à base de RN-additions qui calcule les mêmes
résultats que 2Sum demande au moins 6 opérations arithmétiques
(i.e., autant que 2Sum).
Théorème 3
Dans tous les formats de la norme IEEE 754-2008, un algorithme
sans branchements à base de RN-additions qui calcule les mêmes
résultats que 2Sum est de profondeur ≥ 5 (i.e., la même que
2Sum).
démonstrations : grand prix de l’inélégance mathématique ;
480756 algorithmes à 5 opérations (après suppression des
symétries les plus immédiates) ;
chacun d’eux essayé avec 2 couples d’entrées bien choisis.
Téléchargement