\(
\newcommand{\llbracket}{[\![}
\newcommand{\rrbracket}{]\!]}
\newcommand{\er}{e_{\operatorname{reel}}}
\newcommand{\eb}{e_{\operatorname{biais}}}
\)
Cours n°4 :
Nombres à virgule flottante
IEEE 754
R1.03 - Intro. Archi
Victor Poupet
Nombres à virgule
Pour représenter des nombres à virgule, on peut associer des poids fractionnaires à certaines positions
- Nombre de bits fixés
- Poids fixés
→ virgule fixe
Problème 1 : Perte de précision si l'ordre de grandeur change
Problème 2 : Intervalle réduit
Virgule flottante
Idée : Représenter séparément la valeur et la position de la virgule
→ Virgule flottante
Notation scientifique (base \(b\)): $$ x = ±y \times b^e$$
avec
- \(1 ≤ y < b\)
- \(e \in \mathbb{Z}\)
Exemples (base 10) :
\(\begin{align}121 &= 1,21 \times 10^2\\
-5640000 &= -5,64 \times 10^6\\
45,1 &= 4,51 \times 10^1\\
-0,000000123 &= -1,23 \times 10^{-7}\\
6,43 &= 6,43 \times 10^0
\end{align}\)
→ Même précision quel que soit l'ordre de grandeur
Schéma
Éléments de la représentation en virgule flottante :
- Signe (s)
- Exposant (e)
- Mantisse (m)
Valeur représentée : $$x = (-1)^s\times m\times 2^e$$
Signe
Le signe d'un nombre à virgule flottante
- dans la mantisse ?
- séparément (bit de signe) ? ← solution choisie
Le signe est encodé par le premier bit (comme pour les entiers)
- 0 si positif
- 1 si négatif
Exposant
- L'exposant peut être positif ou négatif
- Représentations possibles :
- Signe / magnitude
- Complément à 1 ou à 2
- Repr. biaisée ← solution choisie
- Pour faciliter les comparaisons, on choisit une représentation croissante
- Exposant donne l'ordre de grandeur
→ placé avant la mantisse
Solution :
- Décalage pour éviter les valeurs négatives
- Sur \(n\) bits, $$\eb = \er + 2^{n-1} - 1$$
$$\begin{align}-2^{n-1} + 1 &\leq \er \leq 2^{n-1} \\
0 &\leq \eb \leq 2^{n}-1
\end{align}$$
- Sur \(8\) bits, $$\eb = \er + 127$$
$$\begin{align}-127 &\leq \er \leq 128 \\
0 &\leq \eb \leq 255
\end{align}$$
Mantisse
- Signe codé séparément, donc codage binaire de la valeur absolue
- Dans le cas général $$1 ≤ m < 2$$ $$m = 1, \ldots$$
- Il n'est pas nécessaire d'indiquer le \(1\) initial (1 implicite)
Par exemple, pour représenter \(12.75\) :
- \(12,75_{10} = 1100,11_{2}\)
- \(m = {\color{red}1},{\color{blue}10011}\)
- On écrit \(\color{blue}1001100\ldots\)
Norme IEEE 754
IEEE Standard for Floating-Point Arithmetic (1985)
- Fixe la représentation des nombres
- Corrige plusieurs problèmes liés aux implémentations précédentes
- Définit le comportement en cas d'exception (division par zéro, dépassement de capacité, etc.)
- Définit les règles d'arrondi pour les opérations
Norme IEEE 754
- Simple précision (32 bits)
- 1 bit de signe
- 8 bits d'exposant biaisé à 127
- 23 bits de mantisse
- Double précision (64 bits)
- 1 bit de signe
- 11 bits d'exposant biaisé à 1023
- 52 bits de mantisse
Norme IEEE 754
IEEE 754 définit deux représentations différentes pour chaque format :
- Représentation normalisée
- Représentation non normalisée (exceptions)
Représentation normalisée
- \(000\ldots 00 < e_b < 111\ldots 11\)
(sinon non-normalisée)
En simple précision
- plus petit nombre représentable : \(1,0 \times 2^{-126}\)
- plus grand nombre représentable : \(1,111\ldots 1 \times 2^{127} ≈ 2^{128}\)
Exemple
Considérons $$x = -73,25_{10}$$
- Signe ? négatif → \(1\)
- Représentation binaire de \(|x|\) $$1001001,01$$
- Notation scientifique $$1,00100101 \times 2^6$$
-
Mantisse sur 23 bits (\(1\) implicite)$$001001010000\ldots 0$$
- Décalage de l'exposant $$\eb = \er + 127 = 133$$
- Exposant biaisé en binaire (8 bits) $$10000101$$
→ Représentation de -73,25 en simple précision :$$1\ 10000101\ 001001010000\ldots 0$$
Représentations non-normalisées
Il existe 3 types de représentations non-normalisées
- Représentation dénormalisée
- Représentation des infinis (\(±\infty\))
- Représentation des exceptions : Not a Number (NaN)
Représentation dénormalisée
- Champ de l'exposant ne contient que des 0
- Exposant réel vaut \(-2^{|E|-1}+2\) (ex: -126 en SP)
- Mantisse n'a pas de \(1\) implicite : \(0 \leq m < 1\)
Valeur représentée
- \(x = (-1)^s \times 0,\overline{m} \times 2^{-126}\)(en SP)
- \(x = (-1)^s \times 0,\overline{m} \times 2^{-1022}\)(en DP)
Représentation dénormalisée
Importance de la représentation dénormalisée :
- Permet de représenter zéro : \(000000\ldots 0\) ou \(100000\ldots 0\)
- Plus petit nombre dénormalisé (> 0) : \(0,0000\ldots 01 \times 2^{-126} = 2^{-149}\) (en SP)
- La différence de 2 nombres distincts est toujours non-nulle
- Plus grand nombre dénormalisé : \(0,11\ldots 11 \times 2^{-126} ≈ 2^{-126}\) (en SP)
(Rappel) plus petit nombre normalisé : \(1,0\times 2^{-126}\) (en SP)
Infini
La représentation correspond à un infini si
- le champ de l'exposant ne contient que des 1
- le champ de la mantisse ne contient que des 0
$$\begin{align}0\ 11111111\ 00000000000000000000000 &\rightarrow +\infty\\
1\ 11111111\ 00000000000000000000000 &\rightarrow -\infty\\
\end{align}$$
Not a Number
La représentation correspond à Not a Number (NaN) si
- le champ de l'exposant ne contient que des 1
- le champ de la mantisse contient au moins un 1
Exemples :$$\begin{align}0\ 11111111\ 00000000110001101000000 &\rightarrow \operatorname{NaN}\\
1\ 11111111\ 01101100001000010110000 &\rightarrow \operatorname{NaN}\\
\end{align}$$
- Ne correspond pas à une valeur numérique
- On ne peut pas effectuer d'opération arithmétique avec NaN (produit toujours NaN)
- Résultat des opérations indéfinies (division par 0, \(\infty / \infty\), etc.)
Bilan
Type |
Exposant |
Mantisse |
Zéro |
\(0\) |
\(0\) |
Nombre dénormalisé |
\(0\) |
\(\neq 0\) |
Nombre normalisé |
\(1\) à \(2^{|E|}-2\) |
quelconque |
Infinis |
\(2^{|E|} - 1\) |
\(0\) |
NaN |
\(2^{|E|} - 1\) |
\(\neq 0\) |
- Simple précision
- \(|E| = 8\)
- \(2^{|E|} = 256\)
- Double précision
- \(|E| = 11\)
- \(2^{|E|} = 2048\)
Addition / Soustraction
Pour additionner (ou soustraire) deux nombres en IEEE 754
- Restaurer le bit de poids fort (1 implicite)
- Décaler les mantisses pour représenter au même exposant
- Additionner (ou soustraire) les mantisses
- Renormaliser le résultat (nouvel exposant, 1 implicite, arrondi)
\(0.5 + (-0.375)\)
\(\begin{eqnarray}0.5 &\rightarrow& 1.0 \times 2^{-1}\\
-0.375 &\rightarrow& -1.1 \times 2^{-2}\\
\end{eqnarray}\)
\(1.0 \times 2^{-1} + (-0.11) \times 2^{-1}\)
\( = 0.01 \times 2^{-1}\)
\( = 1.0 \times 2^{-4}\)
Multiplication
La multiplication est légèrement plus simple
- Calculer le signe du résultat
- Ajouter les exposants (réels)
- Restaurer le bit de poids fort
- Effectuer la multiplication des mantisses
- Arrondir, réajuster l'exposant et renormaliser
Arrondis
IEEE 754 définit 4 modes d'arrondis :
- Au plus proche : arrondir vers la valeur la plus proche, en préférant un nombre pair (LSB=0) si égale distance (mode par défaut)
- Vers moins l'infini
- Vers plus l'infini
- Vers zéro
Les opérations arithmétiques et beaucoup de fonctions élémentaires (log, racines, trigonométrie, etc.) sont calculées avec des arrondis corrects.