]> AND Private Git Repository - cours-maths-dis.git/blob - arithmetique/representation.tex
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
ajout de sujet de partiels
[cours-maths-dis.git] / arithmetique / representation.tex
1
2 \section{Introduction}
3
4
5 Pour des raisons évidentes, il est impossible de représenter exactement en machine un nombre réel dont le développement binaire, et a fortiori décimal, est infini.
6
7
8 \begin{Ex}
9 Par exemple 1/3, mais aussi 1/10 (dont le développement décimal 0,1 est fini, mais pas le développement binaire) ne sont pas exactement représentables.
10 \end{Ex}
11
12
13
14 Cette limitation interdit la représentation de tout nombre irrationnel, dont le dé\-ve\-lop\-pe\-ment est toujours infini et non périodique. On ne peut donc représenter que :
15 \begin{itemize}
16 \item des nombres rationnels,
17 \item et, parmi ceux-ci, seuls ceux qui admettent un développement binaire fini et \og pas trop long\fg{},
18 \end{itemize}
19 \noindent c'est-à-dire, au total, un nombre fini de nombres rationnels.\\
20
21
22
23 La représentation généralement adoptée est la représentation dite \og en virgule flottante\fg{}\index{représentation!en virgule flottante}, parce qu'elle permet de traiter de manière à peu près satisfaisante les opérations sur deux opérandes de grandeurs très différentes.
24
25 \begin{Ex}
26 En \og virgule fixe\fg{}, les limitations physiques des machines interdiraient de représenter simultanément, par exemple, $10^{100}$ et $10^{-100}$ , alors que la représentation en virgule flottante le permet. 
27 \end{Ex}
28
29
30
31
32 Bien entendu, l'addition de ces deux nombres donnera le premier (exactement) comme résultat, ce qui n'est pas gênant, mais leur multiplication donnera bien $1$ comme résultat (aux erreurs de représentation et de calcul près, car aucun de ces deux nombres n'est représentable exactement en machine).
33
34
35 \section{Les formats IEEE}
36
37 \subsection{La norme IEEE 754}
38
39 La représentation des nombres réels en machine (en \og virgule flottante\fg{} ) fait l'objet d'une norme (norme IEEE 754).\\
40
41 Cette norme reconnaît trois formats :
42 \begin{itemize}
43  \item \og single\fg{} (réel représenté sur 32 bits),
44 \item \og double\fg{} (64 bits),
45 \item \og extended\fg{} (80 bits).
46 \end{itemize}
47
48 Les formats \og single\fg{} et \og double\fg{} sont analogues, à la taille des diverses composantes près.\\
49
50
51 Cette même norme prévoit un certain nombre de spécifications qui concernent les  calculs sur les réels représentés (indépendamment du format retenu) : aucune opération sur les réels ne doit provoquer, par
52 elle-même, d'interruption du déroulement normal du programme. Ni une
53 division par $0$, ni un dépassement de capacité, ni une tentative de
54 calcul impossible.\\
55
56 C'est au logiciel qui gouverne les calculs de vérifier le résultat et de provoquer, s'il le juge utile (et c'est ce que font en général les compilateurs), une interruption.\\
57
58 Néanmoins, il a fallu prévoir des représentations spéciales pour ces cas particuliers :
59 \begin{itemize}
60  \item l'une s'appelle \og INF\fg{} (infini),
61  \item l'autre \og NAN\fg{} (abréviation pour \og not a number\fg{} ).
62 \end{itemize}
63
64 \begin{Ex}
65 D'après ces spécifications, le résultat de $1/0$ (en réels) doit être INF, celui de $0/0$ doit être NAN.
66
67 On doit obtenir aussi $\sqrt{-1}=\rm{NAN}$, $\log{0}=-\rm{INF}$, $1/\rm{INF}=0$, mais  $\rm{INF}/\rm{INF}=\rm{NAN}$, de même que toute opération dont l'un des opérandes est NAN, par exemple $\sin(\rm {NAN})=\rm {NAN}$, $1+\rm{NAN}=\rm{NAN}$...
68 \end{Ex}
69
70
71 \begin{Rem}
72 Si vous voulez observer ces résultats, effectifs, vous serez obligés d'opérer depuis l'assembleur, aucun compilateur ne vous autorisera à tenter d'obtenir de pareilles horreurs!
73 \end{Rem}
74
75
76
77 Dans la représentation d'un nombre réel, on numérotera les bits à partir de 0 et à partir de la droite (bit \og le moins significatif\fg{} ) jusqu'à (respectivement) 31, 63 ou 79 (bit \og dominant\fg{} ).
78
79 \bigskip
80
81 \subsection{Format \og single\fg{}}\vskip 10pt
82
83 \begin{center} \begin{tabular}{|c|c|c|} \hline
84 s & \quad e \quad (8 bits) \quad & \quad m \quad (23 bits) \quad \\ \hline
85 \end{tabular}\end{center}\vskip 10pt
86
87 \noindent On retrouve la valeur du réel x représenté de la manière suivante :\\
88
89 \begin{itemize}
90 \item si $0 < e < 255$, alors $x=(-1)^s\cdot 2^{e-127}\cdot(1,m)$
91 \item si $e = 0$ et $m \not = 0$, alors $x=(-1)^s\cdot 2^{-126}\cdot(0,m)$
92 \item si $e = 0$ et $m = 0$, alors $x = 0$
93 \item si $e = 255$ et $m = 0$, alors $x = (-1)^s \cdot INF$
94 \item si $e = 255$ et $m \not = 0$, alors $x$ est un $NAN$
95
96 Comme, dans ce cas, $m$ peut prendre n'importe quelle valeur non nulle, il est possible de conserver de cette manière un code qui permet de reconnaître l'origine de l'erreur.
97 \end{itemize}
98
99
100 \subsection{Format \og double\fg{}} \vskip 10pt
101 \begin{center} \begin{tabular}{|c|c|c|} \hline
102 s & \quad e \quad (11 bits) \quad & \quad m \quad (52 bits) \quad \\ \hline
103 \end{tabular}\end{center}\vskip 10pt
104 On retrouve la valeur du réel x représenté de la manière suivante :\\
105
106 \begin{itemize}
107 \item si $0 < e < 2047$, alors $x=(-1)^s\cdot 2^{e-1023}\cdot(1,m)$
108 \item si $e = 0$ et $m \not = 0$, alors $x=(-1)^s\cdot 2^{-1022}\cdot(0,m)$
109 \item si $e = 0$ et $m = 0$, alors $x = 0$
110 \item si $e = 2047$ et $m = 0$, alors $x = (-1)^s \cdot INF$
111 \item si $e = 2047$ et $m \not = 0$, alors $x$ est un $NAN$
112 \end{itemize}
113
114
115 \subsection{Format \og extended\fg{}}\vskip 10pt
116 \begin{center} \begin{tabular}{|c|c|c|c|} \hline
117 s & \quad e \quad (15 bits) \quad & i & \quad m \quad (63 bits) \quad \\
118 \hline \end{tabular}\end{center}\vskip 10pt
119 On retrouve la valeur du réel x représenté de la manière suivante :\\
120
121 \begin{itemize}
122 \item si $0 \infeg e < 32767$, alors $x=(-1)^s\cdot 2^{e-16383}\cdot(i,m)$
123 \item si $e = 32767$ et $m = 0$, alors $x = (-1)^s \cdot INF$ (quelle que soit la valeur de
124 $i$)
125 \item si $e = 32767$ et $m \not = 0$, alors $x$ est un $NAN$ (quelle
126 que soit la valeur de $i$)
127 \end{itemize}
128
129
130 \subsection{D'une manière générale...}
131
132
133 \begin{enumerate}
134 \item s, représenté sur 1 bit, est le signe du nombre (0 pour +, 1 pour
135 -)\\
136
137 \item e est l'\og exposant biaisé\fg{}, \emph{i.e.} l'exposant translaté.
138
139 Cette translation a été introduite de manière à faciliter la comparaison des réels représentés entre eux :
140 \begin{itemize}
141  \item Pour deux réels positifs non nuls, le plus grand est évidemment celui qui a le plus grand exposant (s'ils ont le même, on compare alors les \og mantisses\fg{} $m$).
142 \item Or, la représentation ordinaire dans les formats \og single\fg{} et \og double\fg{} ne permet pas la représentation de 0 : $[x = (-1)^s\cdot 2^{e-t}\cdot (1,m)]$ ne peut pas être nul, même si $m$ et $e-t$ sont nuls, auquel cas on obtient $1$ (ou $-1$).
143 \item Par ailleurs, comme $0$ est le plus petit réel positif, il est logique de lui attribuer le plus petit exposant (c'est-à-dire $-128$ ou $-1024$), et de lui attribuer évidemment une \og mantisse\fg{} nulle.
144 \item Mais il est plus simple (pour les tests) que $0$ possède un exposant nul, ce qui oblige à rendre tous les autres exposants positifs par la translation indiquée.
145 \item Pour retrouver le véritable exposant, il faut donc retrancher cette quantité à l'exposant de la représentation.\\
146 \end{itemize}
147
148 \item La notation $1,m$ (ou $0,m$ ou $i,m$) signifie que le nombre entier
149 $m$ doit être considéré comme la partie fractionnaire d'un nombre dont la représentation binaire a pour partie entière $1$ (ou $0$ ou $i$).\\
150
151 \item Pour les formats \og single\fg{} et \og double\fg{}, la formule à appliquer est différente dans le cas où l'exposant e est nul.
152
153 Il s'agit de ce que l'on appelle un \og réel dénormalisé\fg{}, introduit pour le motif suivant :
154 \begin{itemize}
155  \item les chiffres significatifs du réel représenté sont contenus dans la mantisse ;
156 \item celle-ci est de longueur fixe pour un format donné,
157 \item donc, quel que soit l'ordre de grandeur du réel, sa représentation est obtenue avec la même précision relative, ce qui permet de conna\^\i tre la précision du résultat d'un calcul.
158 \end{itemize}
159
160 Cette mantisse $(1,m)$ représente un nombre compris entre $1$ (inclus, si $m=0$) et $2$ (exclu).
161
162 On obtient ce nombre en multipliant ou en divisant le réel à représenter par $2$ jusqu'à ce que le résultat soit compris entre $1$ et $2$. Le nombre d'opérations effectuées donne l'exposant (le vrai, négatif dans le cas de multiplications, positif dans le cas de divisions).
163
164 Pour des nombres réels trop petits, l'exposant peut alors être lui-même trop petit pour être représentable dans la plage qui lui est fixée. On admet alors que, pour la plus petite valeur de l'exposant (\og biaisé \fg{} ), c'est-à-dire $0$, la mantisse est à interpréter sous la forme $0,m$, ce qui permet de représenter encore quelques réels trop petits pour être représentés dans la représentation normalisée (les Anglo-Saxons parlent de \og progressive underflow\fg{} ). 
165
166 Ces réels \og dénormalisés\fg{} sont distingués des autres, parce qu'ils sont représentés avec une précision moindre (la mantisse a moins de 52 chiffres binaires significatifs).
167
168 Autrement dit, la précision d'un calcul qui utilise un réel dénormalisé n'est plus assurée, mais le risque d'une division par $0$ (alors que le \og vrai\fg{} nombre n'est pas nul) est diminué.\\
169
170 \item La distinction entre réels \og normalisés\fg{} et \og dénormalisés \fg{} disparaît dans le format \og extended\fg{}, puisque la partie entière de la mantisse y figure explicitement (le bit $i$, valeur $0$ ou $1$).
171
172 L'inconvénient est qu'il existe alors plusieurs représentations
173 possibles pour un même nombre réel.
174
175 \begin{Ex}
176 $1$ peut être représenté par $i=1$, $m=0$, $e=16383$, mais aussi par $i=0$, $m=100....0$, $e=16384$, ou encore $i=0$, $m=010...0$, $e=16385$, etc.
177 \end{Ex}
178
179 Mais il est clair que, pour la précision d'un calcul, il vaut mieux
180 utiliser tous les bits disponibles dans la mantisse (pour avoir le maximum
181 de chiffres significatifs).
182
183 C'est-à-dire qu'il faut choisir, parmi toutes les représentations possibles pour un nombre réel, celle pour laquelle $i=1$ : c'est ce que fait la machine (que les opérations soient implantées logiciellement ou effectuées par un coprocesseur arithmétique).
184
185 Autrement dit, on réservera la valeur $0$ pour $i$ au cas où l'exposant \og biaisé\fg{} est nul, comme pour les autres formats, et le problème de la précision se pose de la même manière.
186 \end{enumerate}
187
188
189
190 \subsection{Format \og extended\fg{} des microprocesseurs.} Dans un langage tel que C (ou java),
191 \begin{itemize}
192  \item le format \og single\fg{} est obtenu avec les valeurs de type \og float\fg{},
193 \item le format \og double\fg{} est disponible dans les valeurs de type
194 \og double\fg{},
195 \item le format \og extended\fg{} dans les valeurs de type \og long double\fg{}.\\
196 \end{itemize}
197
198 Pour être complet, il est nécessaire de préciser que les microprocesseurs modernes possèdent presque tous, intégrée, une unité de calcul spécialisée dans le calcul sur les réels, ayant des registres de taille adaptée à la représentation de ces nombres (donc plus longs
199 que les registres de l'unité de calcul arithmétique et logique principale).\\
200
201
202 Plus anciennement, ce rôle était confié à une unité externe que l'on appelait \og coprocesseur arithmétique\fg{} et qui était quelquefois optionnelle.
203
204 Si, dans ce cas, l'option n'avait pas été retenue, les opérations sur les réels  étaient implémentées logiciellement au prix d'un dramatique allongement des temps de calcul.\\
205
206
207 Toujours est-il que les formats disponibles dans une unité de calcul sur les flottants dépendent de la taille des registres, et ceux-ci sont parfois limités à 64 bits, ce qui interdit le format \og extended\fg{} en natif sur la machine (si le langage de programmation utilisé y donne accès, les opérations sont alors implémentées logiciellement).\\
208
209 Lorsque le format \og extended\fg{} est disponible en natif dans la machine, les registres sont en général de taille 96 bits (et non 80).
210
211 Les 16 bits supplémentaires, s'ils sont évidemment utilisés par le processeur pour sa cuisine interne, ne sont jamais significatifs dans les résultats accessibles à l'utilisateur, et sont mis à 0.
212
213 Autrement dit, on obtient le réel au format \og extended\fg{} en supprimant les 16 bits nuls.
214 \vskip 10pt
215 \begin{center} \begin{tabular}{|c|c|c|c|c|c} \hline
216 s & \quad e \quad (15 bits) \quad & \quad (16 bits nuls) \quad & i & \quad m
217 \quad (63 bits) \quad \\ \hline \end{tabular}\end{center}\vskip 10pt
218
219 \bigskip
220
221
222 \section{Réels représentables et précision}
223
224 Tous les réels normalisés représentés en machine comportent le même nombre de chiffres binaires significatifs (dans un format donné).\\
225
226 Comme deux nombres dont les expressions binaires comportent le même nombre de chiffres n'ont pas nécessairement le même nombre de chiffre en
227 représentation décimale, le nombre de chiffres significatifs en base
228 10 peut varier d'une unité.
229
230 \begin{Ex}
231 1000 en base 2 est 8 en décimal : 4 chiffres binaires, 1 chiffre décimal, 1100 binaire est 12 décimal : 4 chiffres binaires, 2 chiffres décimaux.
232 \end{Ex}
233
234
235 Ainsi,
236 \begin{itemize}
237  \item en format \og single\fg{}, on a 6 ou 7 chiffres significatifs,
238 \item en format \og double\fg{}, 15 ou 16 chiffres,
239 \item en format \og extended\fg{}, 19 ou 20.\\
240 \end{itemize}
241
242
243 Une telle précision peut sembler totalement superflue : elle est cependant largement insuffisante pour, par exemple, les calculs en astronomie (trajectoires de satellites, etc.), pour lesquels il est
244 nécessaire de faire appel à des précisions nettement supérieures...
245
246 \bigskip
247
248 \noindent Le plus grand nombre réel représentable en format \og single\fg{} est tel que
249 \begin{itemize}
250 \item $e = 254$, donc le véritable exposant est $254-127=127$
251 \item $m$ est constitué de 23 \og 1\fg{} , la mantisse a donc pour valeur
252 $1,1\ldots 1$, c'est-à-dire
253 $1+2^{-1}+2^{-2}+2^{-3}+\cdot\cdot\cdot+2^{-23}$ (somme d'une progression
254 géométrique de raison 1/2, donc) $= 2-2^{-23}$.
255 \item Il vaut donc exactement $2^{127}(2-2^{-23}) = 2^{128}-2^{104}$, c'est à dire approximativement $3,403\cdot 10^{38}$.\\
256 \end{itemize}
257
258
259 \noindent Le plus petit réel positif normalisé (\og single\fg{} ) est tel que
260 \begin{itemize}
261 \item $e = 1$, donc le véritable exposant est $1-127=-126$
262 \item $m=0$, donc la mantisse vaut 1
263 \item Il vaut donc exactement $2^{-126}$ c'est-à-dire approximativement
264 $1,175\cdot 10^{-38}$.\\
265 \end{itemize}
266
267
268 \noindent Le plus petit réel positif dénormalisé (\og single\fg{} ) est tel que
269 \begin{itemize}
270 \item $e = 0$, donc le véritable exposant est $-126$
271 \item $m=0\ldots 01$, donc la mantisse vaut $0,0\ldots 01$, soit $2^{-23}$
272 \item Il vaut donc exactement $2^{-149}$ c'est-à-dire approximativement
273 $1,401\cdot 10^{-45}$.\\
274 \end{itemize}
275
276 \noindent En format \og double\fg{}, les nombres correspondants sont
277 $1,7\cdot 10^{308}$, $2,3\cdot 10^{-308}$, $5\cdot 10^{-324}$.\\
278
279 \noindent En format \og extended\fg{}, les nombres correspondants sont
280 $1,1\cdot 10^{4932}$, $1,7 \cdot 10^{-4932}$, $1,9 \cdot 10^{-4951}$.\\
281
282
283 Les réels qui sont représentés en machine sont exacts; par contre, tous les nombres réels ne sont pas représentables (la représentation est évidemment discrète).
284
285 \begin{Ex}
286 Considérons le réel $1$ en format \og extended\fg{} : \og vrai exposant\fg{} : $0$, $s=0$, $i=1$, $m=0$, donc $e=16383$, c'est-à-dire (en hexadécimal) : 
287 \begin{itemize}
288  \item 3FFF pour les 16 premiers bits,
289 \item 8000 hexadecimal pour les 16 suivants,
290 \item et tous les derniers sont nuls,
291 \end{itemize}
292
293 \noindent donc : 3FFF 8000 0000 0000 0000.
294
295 Le réel représentable en machine, supérieur à $1$ et le plus proche
296 de $1$, a évidemment un $m$ égal à $0\ldots 01$, il s'agit donc 
297 de 3FFF 8000 0000 0000 0001. 
298
299 La différence des mantisses $(i,m)$ de ces deux nombres est $0,0\ldots 01$, soit (exactement) $2^{-63}$, ou encore (environ) $1,08\cdot 10^{-19}$. 
300 \end{Ex}
301
302 En d'autres termes...
303 \begin{itemize}
304  \item Dans l'intervalle $[1,2[$, les réels représentables varient de $2^{-63}$ en $2^{-63}$.
305 \item Dans l'intervalle $[2,4[$, les réels représentables varient de $2^{-62}$ en $2^{-62}$.
306 \item etc.
307 \item Dans l'intervalle $[2^{63},2^{64}[$, les réels représentables varient de $2^0$ en $2^0$, donc d'unité en unité : on ne peut plus représenter que des nombres entiers, mais il s'agit d'entiers qui sont plus grands que les entiers de la machine (sur 32 bits seulement).
308 \item Dans l'intervalle suivant, on ne peut plus représenter tous les entiers, on n'en représente plus qu'un sur deux, puis un sur quatre, etc.\\
309 \end{itemize}
310
311 \begin{Rem}
312
313 Les calculs sur les réels en machine sont exacts dans le sens suivant :
314
315 Si, par exemple, on additionne, soustrait ou multiplie deux entiers représentables sous forme de réels en machine, et si le résultat est aussi représentable sous forme de réel en machine, alors ce résultat est exact.
316
317 Autrement dit, il s'agit encore d'un entier exactement.
318 \end{Rem}
319
320
321 Le problème de la division est différent, parce que c'est évidemment l'algorithme de la division des réels qui est appliqué et non celui de la division euclidienne des entiers.\gsaut
322
323 \begin{Ex}
324 Soit à représenter $8,5$ sous forme de réel double précision (format \og double\fg{} )
325 \begin{enumerate}
326  \item Le ramener entre 1 et 2 par divisions par 2 : $8,5 = 8\times 1,0625$.
327 \item L'exposant est donc $3$, et $e=3+1023=1026$, les 12 premiers bits sont donc $0100\,0000\,0010$ (en effet, $1026=1024+2$, et $1024$ est $2^{10}$, dont l'écriture binaire est \og 1\fg{} suivi de 10 \og 0\fg{} . On rajoute $2$, soit $10$ binaire).
328 \item $1,0625 = 1 + 0,0625$, et $0,0625= 2^{-4}$, soit (en binaire) $0,0001$, donc $m=0001\,00\ldots$ 
329 \end{enumerate}
330
331 On obtient : 0100 0000 0010 0001 0000 0000 $\ldots$, soit 4021 0000 0000 0000 en hexadécimal.
332 \end{Ex}
333
334
335 \begin{Ex}
336 Soit à représenter $0,1$ sous forme de réel double précision
337 \begin{enumerate}
338  \item Le ramener entre $1$ et $2$ par multiplications par $2$ : $16\times
339 0,1=1,6$
340 \item L'exposant est donc $-4$, et $e=-4+1023=1019$, les 12 premiers bits sont (comme $s = 0$) 0011 1111 1011 (3FB hexadécimal)
341 \item $1,6=1+0,6$.
342
343 Pour obtenir la représentation binaire de $0,6$, il faut effectuer la division de 6 par 10 en base 2, ou, mieux, celle de 3 par 5 (donc 11 par 101 en base 2).
344
345 On obtient : 0,1001 1001 1001 $\ldots$.
346
347 Ce développement binaire est infini mais périodique, il suffit de le tronquer à 52 chiffres et d'effectuer l'arrondi.
348
349 Les 4 derniers bits sont 1001 et le suivant serait 1, donc l'arrondi est fait à 1010 pour les 4 derniers, soit A hexadécimal (la représentation n'est donc pas exacte, on l'a signalé plus haut).
350
351 Les précédents (par groupe de 4) sont égaux à 1001, soit 9 hexadécimal; on obtient finalement : 3FB9 9999 9999 999A.
352 \end{enumerate}
353  
354 Attention : en \og single\fg{} , la représentation de 0,1 serait 3DCC CCCD et, en \og extended\fg{} : 3FFB CCCC CCCC CCCC CCCD (faites-le aussi!).
355
356
357 Autrement dit : le passage d'un format à l'autre n'est pas évident en hexadécimal (il ne suffit pas de \og raccourcir\fg{} ou de \og rallonger\fg{} !).
358 \end{Ex}
359
360
361
362 \gsaut
363 \centerline{\x{Fin du Chapitre}}