La norme IEEE 754 est le standard de représentation des nombres à virgule flottante dans tous les processeurs modernes. Convertir un nombre décimal vers cette représentation suit un protocole précis.
Format IEEE 754 simple précision (32 bits)
Valeur représentée : $(-1)^s \cdot 1.m \cdot 2^{e - 127}$.
- 1 bit de signe (s)
- 8 bits d'exposant biaisé (e, biais = 127)
- 23 bits de mantisse (m, implicite 1 devant)
Méthode de conversion
- 1. Déterminer le signe (0 positif, 1 négatif)
- 2. Convertir la partie entière en binaire
- 3. Convertir la partie fractionnaire en binaire (multiplications successives par 2)
- 4. Normaliser en écrivant sous la forme $1.xxx \cdot 2^n$
- 5. Calculer l'exposant biaisé : $n + 127$
- 6. La mantisse est $xxx$ complétée à 23 bits
Exemple : convertir 6.75
Signe : 0 (positif).
6 en binaire : 110. 0.75 en binaire : 0.11 (car $0.5 + 0.25$).
Donc 6.75 = 110.11 en binaire.
Normalisation : $1.1011 \cdot 2^2$.
Exposant biaisé : $2 + 127 = 129 = 10000001$.
Mantisse (partie après la virgule, 23 bits) : $10110000000000000000000$.
Résultat : 0 10000001 10110000000000000000000.
Particularités à connaître
- Zéro : $s = 0$ ou $1$, $e = 0$, $m = 0$ (deux zéros : +0 et -0)
- Infini : $e = 255$, $m = 0$
- NaN : $e = 255$, $m \neq 0$
- Nombres dénormalisés : $e = 0$, $m \neq 0$ (pour représenter des nombres très petits)
À retenir
La représentation IEEE 754 explique pourquoi $0.1 + 0.2 \neq 0.3$ en pratique : 0.1 n'a pas de représentation binaire finie, d'où une erreur d'arrondi.
IEEE 754 double précision
La double précision (64 bits, type double en C/Java, float64 en NumPy) suit la même structure que la simple, mais avec des champs plus larges :
Précision : environ 15-17 chiffres décimaux significatifs. Plage : environ $\pm 10^{\pm 308}$.
- 1 bit de signe
- 11 bits d'exposant biaisé (biais = 1023)
- 52 bits de mantisse
Erreurs de représentation classiques
Certains nombres décimaux simples n'ont pas de représentation binaire finie, d'où des erreurs d'arrondi :
- $0{,}1$ → $0.000110011\overline{0011}\dots$ en binaire (périodique)
- $0{,}2$ → même problème
- $0{,}1 + 0{,}2 \neq 0{,}3$ en IEEE 754 (résultat : $0{,}30000000000000004$)
- $0{,}5$ → $0{,}1$ en binaire (exact, car $1/2$)
- $0{,}25$ → $0{,}01$ en binaire (exact)
À retenir
Règle d'or : ne jamais tester l'égalité stricte entre flottants calculés. Toujours utiliser une tolérance : abs(a - b) < epsilon.
Une question ou une suggestion ? Écrivez-nous.