L'ensemble des nombres réels est non seulement infini, mais dense.
Choisir une borne supérieure et un nombre de bits n'est donc pas suffisant
pour extraire un sous-ensemble fini.
Parmi les nombreuses possibilités, Java a retenu le codage IEEE-754.
Deux précisions sont disponibles :
- Type primitif float (32 bits)
- Les valeurs sélectionnées sont toutes celles qui peuvent s'écrire sous la forme
(-1)S*2E-127*(1,M)2, où
S est un signe (0 ou 1), E est un exposant entier de valeur comprise dans l'intervalle ]0,255[,
et M est la mantisse codée sur 23 bits.
- Type primitif double (64 bits)
- Les valeurs sélectionnées sont toutes celles qui peuvent s'écrire sous la forme
(-1)S*2E-1023*(1,M)2, où
S est un signe (0 ou 1), E est un exposant entier de valeur comprise dans l'intervalle ]0,2047[,
et M est la mantisse codée sur 52 bits.
En plus de ces valeurs, les deux types permettent de coder des valeurs spéciales :
+∞, -∞, +0, -0, NaN (Not a Number). NaN regroupe tous les nombres qui ne sont pas codables
comme, par exemple, les racines carrés de nombres négatifs.
Attention, cette sélection ne permet pas de représenter tous les nombres réels, c'est pour cela
que l'on préférera le terme nombre approché au terme nombre réel.
De plus, ces codages demandent des précautions d'emploi sur lesquelles nous reviendrons plus tard,
en particulier pour la comparaison des nombres approchés.
Exercice : Pour se convaincre des problèmes qui peuvent apparaître avec ces types, le lecteur essaiera de coder
le nombre 0.1 en binaire.