Java spécifie que les nombres à virgule flottante suivre la norme IEEE 754 la norme.
C'est comment il est stocké:
- bit 0 : bit de signe
- les bits 1 à 11 : exposant
- les bits 12 à 63 : fraction
Maintenant, j'ai exécuté ci-dessous la méthode avec différentes valeurs doubles:
public static void print(double d){
System.out.println(Long.toBinaryString(Double.doubleToRawLongBits(d)));
}
J'ai exécuté avec ces valeurs:
print(Double.NaN);
print(Double.NEGATIVE_INFINITY);
print(Double.POSITIVE_INFINITY);
print(-Double.MAX_VALUE);
print(Double.MAX_VALUE);
Et a obtenu le résultat suivant pour les valeurs ci-dessus (formaté pour des raisons de lisibilité):
NaN: 0111111111111000000000000000000000000000000000000000000000000000
-Inf: 1111111111110000000000000000000000000000000000000000000000000000
+Inf: 0111111111110000000000000000000000000000000000000000000000000000
-Max: 1111111111101111111111111111111111111111111111111111111111111111
+Max: 0111111111101111111111111111111111111111111111111111111111111111
Wikipedia explique que lorsque l'exposant champ est tous les bits à 1, le nombre est soit Inf ou NaN. Inf a tous les bits de la mantisse zéro; NaN a au moins un bit de la mantisse la valeur 1. Le bit de signe conserve sa signification normale pour Inf, mais n'est pas significatif pour NaN. Java Double.NaN
est une valeur particulière qui sera interprété comme NaN, mais il y a 253-3 autres.