Norme IEEE 754

Les flottants sont des représentations en mémoire d'une partie des nombres rationnels ; il est évidemment impossible de représenter des nombres réels quelconques, pour des raisons de cardinalité. Seuls les rationnels dont la forme irréductible est , n/2q , peuvent avoir une représentation exacte ; les autres ont nécessairement une représentation approchée (par exemple, le nombre décimal  1/10 a 0,00011 0011 ..... comme représentation en base 2, la partie soulignée étant la période répétée indéfiniment). Cette représentation fait l'objet de la norme IEEE 754, proposée par William Kahan (Turing Award 1989), publiée en 1985 et adoptée par la plupart des fabricants d'ordinateurs. Cette norme distingue deux niveaux de précision : simple (sur 4 octets) et double (sur 8 octets).

Prenons l'exemple des flottants en simple précision ; les 32 bits (bi )  sont répartis en :

La valeur d'un flottant ' normalisé' est  (-1)s × f × 2e , où

Voici une comparaison entre la représentation simple précision et la représentation double précision.

Signe Exposant Mantisse
Simple Précision 1 [31] 8 [30-23] 23 [22-00]
Double Précision 1 [63] 11 [62-52] 52 [51-00]

Exceptions

Le bit de poids fort de la mantisse est déterminé par la valeur de l'exposant. Si l'exposant est différent de 0 et de 2 e − 1 , le bit de poids fort de la mantisse est 1, et le nombre est dit 'normalisé' . Si l'exposant est nul, le bit de poids fort de la mantisse est nul, et le nombre est 'dénormalisé' . Il y a quatre cas particuliers :

  1. si l'exposant et la mantisse sont tous deux nuls, le nombre est ±0 (selon le bit de signe)
  2. si l'exposant est nul et la mantisse non nulle dans ce cas l'exposant est supposé égal à -126 pour la simple précision, et la mantisse n'est pas supposée précédée de la partie entière 1. Il s'agit de la représentation des petits nombres.
  3. si l'exposant est égal à 2 e − 1 , et si la mantisse est nulle, le nombre est ± ∞ (selon le bit de signe)
  4. si l'exposant est égal à 2 e − 1 , mais que la mantisse n'est pas nulle, le nombre est NaN (Not a Number: pas un nombre)

Nous pouvons résumer les exceptions ainsi:

Type Exposant Mantisse
Zeros 0 0
Nombres dénormalisés 0 différente de 0
Nombres normalisés 1 à 2 e − 2 quelconque
Infinis 2 e − 1 0
NaNs 2 e − 1 différente de 0

Le coin du C

Ce programme illustre la représentation en machine des flottants simple précision normalisés.

Café Python

A l'instar des entiers long, Python propose un type pour représenter les flottants grande précision, il s'agit du type décimal. L'utilisation de ce type permet de s'affranchir de la mauvaise représentation des réels par le type flottant standard, qu'il soit sur 4 ou 8 octets. Voici un exemple pour illustrer cela:

Le résultat de l'exécution:

0.66666666666666663000
0.6666666666666666666666666667