Standards IEEE 754 et 854
Un article de Haypo.
Retour aux articles de relatif aux mathématiques
Sommaire |
[modifier] Les types réels en informatique
Dans les calculs courants, on utilise régulièrement des nombres réels : prix d'un produit en supermarché, calcul d'une vitesse en physique, moyenne d'une note à l'école, ... Quand on fait le calcul "à la main", on ne se pose pas trop la question du stockage des nombres : on écrit une, deux, trois, ou plusieurs décimales, selon nos besoins. En informatique, tout doit être clairement défini selon des standards.
Pour les nombres réels, le standard choisit fut le "IEEE 754", puis le IEEE 854. En gros, on stocke les nombres sous la forme : (signe, mantisse, exposant) ce qui donne x = signe * mantisse * (2 ^ exposant). Le signe vaut +1 ou -1, la mantisse est un nombre réel tel que 1.0 <= mantisse < 2.0, et l'exposant est une valeur entière. Bien sûr, l'ensemble est codé en binaire !
Exemples :
- Le nombre 2 est stocké (+1, 1, 1), c'est-à-dire : 2 = (+1) * 1 * (2 ^ 1).
- Le nombre 3 est stocké (+1, 1.5, 1) : 3 = (+1) * 1.5 * (2 ^ 1).
- Le nombre 10 est stocké (+1, 1.25, 3) : 10 = (+1) * 1.25 * 2^3.
[modifier] Comment coder un nombre dans le format IEEE 754/854
Voyons comment décomposer un nombre réel en trois parties : signe, mantisse, exposant. Pour le signe, ce n'est pas difficile : il est égal à (+1) si le nombre est positif, -1 sinon. On prend maintenant la valeur absolue du nombre. Pour la mantisse : si le nombre est supérieur à 1.5, il faut le diviser successivement par deux, jusqu'à ce que sa valeur soit inférieure ou égale à 1.5 (l'exposant sera le nombre de division); si le nombre est inférieur à 1, il faut le multiplier successivement par deux, jusqu'à ce que sa valeur soit supérieure ou égale à 1 (l'exposant sera le nombre opposé de divisions).
Exemple : x=-10. Le signe est égal à -1, car le nombre est négatif. On prend la valeur absolue : x=10. Comme sa valeur est supérieur à 1, on divise par 2 : x=5, exposant=1. On continue : x=2.5 et exposant=2, x=1.25 et exposant=3 : STOP ! Donc finalement, x=(-1) * 1.25 * (2^3).
[modifier] Taille des différents types
| Nom (en langage C) | Taille | Signe | Mantisse | Exposant |
|---|---|---|---|---|
| float | 32 bits | 1 bit | 23 bits | 8 bits |
| double | 64 bits | 1 bit | 52 bits | 11 bits |
| long double | 80 bits | 1 bit | 53 bits (*) | 15 bits |
(*) : Dans le format long double, la partie entière de la mantisse est stockée, alors que dans les autres formats, elle ne l'est pas.
[modifier] Liens externes
- IEEE standard 754 for binary floating-point arithmetic
- Script Javascript permettant de décomposer un nombre en mantisse, exposant et signe (et inversement)
- RFC: Rounding in PHP
- SCSLib (Software Carry-Save Multiple-Precision Library), licence LGPL
- crlibm (Correctly Rounded Math Library)
- MPFR
- MPFI : arithmétique par intervalles multi-précision basée sur les bibliothèques MPFR et GMP
- LinBox : Exact computational linear algebra
- IBM libultim

