Représentation des nombres
Contents
1 Les entiers 1
1.1 Base 2 . . . 1
1.2 La notation en complément à 2 . . . 2
1.2.1 Le principe . . . 2
1.2.2 Résumons . . . 2
1.2.3 En termes de congruences . . . 2
1.2.4 Concrètement . . . 3
1.2.5 Avantages . . . 3
1.3 Exemple . . . 3
2 Représentation des réels 3 2.1 Principe . . . 3
2.1.1 Le type oat . . . 3
2.1.2 La mantisse . . . 4
2.1.3 L'exposant . . . 4
2.1.4 Ecart entre deux ottants consécutifs . . . 4
2.2 Limitations . . . 4
2.2.1 Le zéro . . . 5
2.2.2 Arrondis . . . 5
2.3 Exemple 1 : 2n±1 . . . 5
2.3.1 253−1. . . 5
2.3.2 254−1. . . 5
2.3.3 253+ 1. . . 5
2.4 Exemple 2 : 43. . . 5
2.5 Exemple 3 : s+ = 2∗ ∗(−n) . . . 6
2.6 Représentation de 0.1 . . . 7
2.6.1 Valeur dee . . . 7
2.6.2 Valeur dem . . . 7
2.6.3 Autre approche . . . 7
2.6.4 Ecart entrexet X . . . 7
2.7 Calcul de0.1 + 0.2 . . . 8
1 Les entiers
1.1 Base 2
Tout entierk∈
0,2N −1s'écrit de manière unique
k=
N−1
X
j=0
aj.2j où lesaj sont dans{0,1}.
Démonstration Par récurrence surk.
Ecrivons la division euclidienne dekpar2 k= 2.q+r et
k=
N−1
X
j=0
aj.2j Donca0=ret
q=
N−1
X
j=1
aj.2j−1
1.2 La notation en complément à 2
1.2.1 Le principe
On souhaite représenter les entiers de I=
−2N−1,2N−1−1 surN bits en base 2.
On constate qu'il y en a bien2N. Notations
I1=
0,2N−1−1 ,I2=
−2N−1,−1 , I3=
2N−1,2N −1 , I=I1∪I2, Ie=I1∪I3
| −2N−1...−1|0...2N−1−1|2N−1...2N−1|
Les entiers positifs
Les éléments deI1 sont simplement représentés par leur écriture en base 2.
Les entiers négatifs
Sik∈I2, on représentekpar l'écriture en base 2 de2N +k, plutôt que par le signe−et la valeur absolue dek. Les éléments deI2sont donc représentés par des éléments deI3.
Il n'y a pas de confusion possible, car 2N +k∈I3
Il est trop grand pour être confondu avec les éléments deI1=
0,2N−1−1. 1.2.2 Résumons
- Six∈I1, xest représenté par l'écriture en base 2 de xe=x; son premier chire est donc 0.
- Six∈I2,xest représenté par l'écriture en base 2 de ex=x+ 2N, et son premier chire est donc 1.
Dans les deux cas,xest représenté par l'écriture en base deux dexe, qui est le reste de la division dexpar2N :
xe∈
0,2N−1
=Ie 1.2.3 En termes de congruences
x∈Ietx∈Isont deux représentants de la même classe dans /2N ; mais
1.2.4 Concrètement
Soitk∈I1. Pour calculer la représentation de−kà partir de la représenta- tion dek, on remplace les 0 par des 1 et inversement, et on ajoute 1.
Explication : écrivons
k=
N−1
X
j=0
aj.2j Alors :
−kf = 2N −k= 2N− a0+...+ 2N−1aN−1 Donc :
−kf = 1 + 1 + 2 +...+ 2N−1
− a0+...+ 2N−1aN−1
Donc :
−kf = 1 +
N−1
X
j=0
(1−aj).2j = 1 +
N−1
X
j=0
bj.2j oùbj= 1−aj.
1.2.5 Avantages
Avec cette méthode, 0 admet une unique représention ; l'addition s'eectue de la même manière pour tous les entiers, indépendamment de leur signe ; pourvu qu'on le résultat soit dansI bien sûr.
En eet, modulo2N,x≡xeety≡ye, donc x+y≡ex+ey
1.3 Exemple
N= 8. I= [−128,127]. Représenter 1, 2, 3, 4, 16, 127,
-1, -2, -3, -4, -16, -127, -128.
Réponse
00000001, 00000010,00000011,00000100,00010000,01111111,
11111111, 11111110,11111101,11111100,11110000,10000001,10000000.
2 Représentation des réels
2.1 Principe
2.1.1 Le type oat
En Python, 'oat' ou 'oat64' (double-précision) : les nombres sont représen- tés sur 64 bits ( 8 octets ) ; attention, byte'octet.
- 1 bit pour le signeε - 11 pour l'exposante
- 52 pour la mantissem,1≤m <2 x=ε.m.2e m= 1 +
52
X
k=1
ak 2k On constate que six >0,
e=blog2(x)c
2.1.2 La mantisse
Le premier chire de m est toujours 1, il n'est donc pas nécessaire de le représenter.
Il y a donc52chires après la virgule dansm. Remarque
La mantissemvaut
m= p 252 oùpest un entier vériant
252≤p≤253−1 2.1.3 L'exposant
−1022≤e≤1023
On le représente par e+ 1023, un peu comme pour la représentation en complément à 2.
1≤e+ 1023≤2046
0 et 2047 sont réservés pour des cas particuliers,0,±∞, N aN, ...
Exemples
Déterminer l'exposantedu oat représentant les nombres
√ 2, π, 1
3, 1 5, 1
10, 3 10 Réponses
0,1,−2,−3,−4,−2 Autres exemples
ln 2, γ,2022, e, c
Réponses
−1,−1,10,1,28 2.1.4 Ecart entre deux ottants consécutifs Ecart absolu :
y−x= 2e−52 Ecart relatif :
2−52
2 ≤y−x x ≤2−52 L'écart relatif varie peu.
2.2 Limitations
On ne peut pas représenter de manière exacte tous les rationnels (sans parler des réels !). Par exemple :
- les nombres trop grands : 2.0**(1024).
- les nombres trop proches de zéro : 2**(-1100) - tous ceux qui n'ont pas une écriture nie en base 2.
- tous ceux qui ont une écriture nie mais trop longue en base 2.
2.2.1 Le zéro
Si on applique la formule
x=ε.m.2e
le nombre0 n'est pas représenté. On choisit de le représenter par tous les bits nuls ; donc :
m= 1 ete=−1023 2.2.2 Arrondis
Un réel qui n'est pas un oat est représenté par le oat le plus proche.
Concrètement :
- si le premier bit négligé est 1, on arrondit au oat supérieur.
- si le premier bit négligé est 0, on arrondit au oat inférieur.
Cas particulier
Dans le cas où le oat le plus proche n'est pas unique, on choisit alors celui qui se termine par un zéro : le plus 'simple'.
De même, en base 10, pour arrondir1.605à deux chires après la virgule, on choisira
1.6 plutôt que
1.61
2.3 Exemple 1 : 2
n± 1
2.3.1 253−1 x = 2**(53)-1 y = oat(x) x == y z = int (y) y-xz-x
Réponses ? 2.3.2 254−1
Même question avec
x= 254−1 2.3.3 253+ 1
Même question avec
x= 253+ 1
2.4 Exemple 2 :
43Calculer le réel suivant écrit en base 2
s= 1,01010101...
Réponse
s=
∞
X
k=0
1 22k =
∞
X
j=0
1 4j = 4
3
Quel est le oatS qui le représente ?
...010101|010101...
est arrondi en
010101|
donc par défaut.
Donc
S=
26
X
k=0
1 4
k
Ecarts−S ?
s−S=
∞
X
k=27
1 4k =1
3.2−52 Vérication
On souhaite vérier que
3.252(s−S) = 1 soit
254−3.S.252= 1 Pour cela on calcule de manière exacte
2∗ ∗54− 3∗int (S∗2∗ ∗52) Par contre
2∗ ∗54 −3∗(S∗2∗ ∗52) renvoie 0.
En eet la multiplication par 3 nécessite un arrondi.
2.5 Exemple 3 : s + = 2 ∗ ∗(−n)
Que répond le programme suivant ? s, n = 1, 0
while s != 2:
n += 1 s += 1/2**n print(n)
Celui-là ? s, n = 0, 0 while s != 1:
n += 1 s += 1/2**n print(n)
Réponses 53 et 54.
Explication ?
Dans le deuxième cas, l'exposant e vaut−1.
2.6 Représentation de 0.1
x= 0.1 2.6.1 Valeur dee
e=−4 car
1≤24.x= 1.6<2 2.6.2 Valeur dem
16x= 1,6 = 1 +1 2 +x D'où, en base 2 :
16x= 1,10011001100...
Python ne conserve que 52 chires après la virgule, et arrondit au plus proche :
...0011001|10011...
devient :
...0011010|
xest donc représenté par un nombre strictement plus grand : X. 2.6.3 Autre approche
ms'écrit
m= p 252 avecpentier.
On cherche l'entierpqui minimise
16.x− p 252
=
16 10− p
252
donc, l'entierpqui minimise
256−10.p
Avec ou sans machine, on calcule le resterde la division euclidienne de256 par 10 :
256= 10q+r On trouver= 6.
q < 256
10 =q+ 6
10 < q+ 1 On choisit doncp=q+ 1.
2.6.4 Ecart entrexet X
p=256 10 + 4
10 Donc
X =x+2−54
10 =x+err1
2.7 Calcul de 0.1 + 0.2
Poury= 0.2 = 2.x:
eY =−3; évidemment,m est le même que pourx. Donc Y =y+2−53
10 =y+err2
Python ne calcule pasx+y, maisZ=X+Y, qui n'est pas un oat, et qui est donc arrondi à son tour à une valeurS.
1
4 < Z <1 2 donc pourZ, l'exposant esteZ =−2. Valeur de S
Les derniers chires des mantisses deX et Y :
X : . . . 1 1 0 0 1 1 0 1 0
Y : . . . 1 0 0 1 1 0 1 0
Z : . . . 0 1 1 0 0 1 1 1
S : . . . 0 1 1 0 1 0 0
exp . . . −54 −55 −56
-Y est obtenu en multipliantX par 2, d'où le décalage.
-Z est obtenu en ajoutantX etY.
-S est obtenu en arrondissantZ au oat immédiatement supérieur ;Z fait partie des cas particuliers où le oat le plus proche n'est pas unique :
S=Z±2−55 Le choix qui est fait est
S=Z+ 2−55=Z+err3
Donc pour Python,0.1 + 0.2vaut0.3 +err, avec un écart err=err1+err2+err3=2−51
10 On peut le vérier avec :
decimal.Decimal(0.1 + 0.2)