Quelles sont les autres valeurs NAN?
-
23-09-2019 - |
Question
La documentation pour java.lang.Double.NaN
dit que c'est
Une constante tenant une valeur de type non-un nombre (NAN)
double
. Il équivaut à la valeur renvoyée parDouble.longBitsToDouble(0x7ff8000000000000L)
.
Cela semble impliquer qu'il y en a d'autres. Si oui, comment puis-je les saisir, et cela peut-il être fait portable?
Pour être clair, je voudrais trouver le double
valeurs x
tel que
Double.doubleToRawLongBits(x) != Double.doubleToRawLongBits(Double.NaN)
et
Double.isNaN(x)
sont tous les deux vrais.
La solution
Vous avez besoin doubleToRawLongBits
plutôt que doubleToLongBits
.
doubleToRawLongBits
extrait la représentation binaire réelle. doubleToLongBits
ne le fait pas, il convertit tout NaN
s à la valeur par défaut NaN
première.
double n = Double.longBitsToDouble(0x7ff8000000000000L); // default NaN
double n2 = Double.longBitsToDouble(0x7ff8000000000100L); // also a NaN, but M != 0
System.out.printf("%X\n", Double.doubleToLongBits(n));
System.out.printf("%X\n", Double.doubleToRawLongBits(n));
System.out.printf("%X\n", Double.doubleToLongBits(n2));
System.out.printf("%X\n", Double.doubleToRawLongBits(n2));
production:
7FF8000000000000
7FF8000000000000
7FF8000000000000
7FF8000000000100
Autres conseils
Java utilise IEEE 754 pour ses numéros de points flottants et suit donc leurs règles.
Selon le Page wikipedia sur nan Il est défini comme ceci:
Exemple un peu-sage d'une seule précision standard IEEE Floating Point Nan:
x111 1111 1axx xxxx xxxx xxxx xxxx xxxx
oùx
moyens Je m'en fiche.
Il y a donc pas mal de bits qui sont tous NaN
valeurs.
IEEE 754 définit un NAN comme un nombre avec tous les bits d'exposants qui sont 1
et un nombre non nul dans la mantissa.
Donc, pour un numéro de précision unique que vous recherchez:
S E M
x 11111111 xxxxxx....xxx (with M != 0)
Java gère cela comme ça:
Double n = Double.longBitsToDouble(0x7ff8000000000000L); // default NaN
Double n2 = Double.longBitsToDouble(0x7ff8000000000100L); // also a NaN, but M != 0
System.out.println(n.isNaN()); // true
System.out.println(n2.isNaN()); // true
System.out.println(n2 != Double.doubleToLongBits(Double.NaN)); // true
Pour résumer, vous pouvez utiliser n'importe quel nan que vous souhaitez conforme aux règles susmentionnées (tous les bits 1 dans l'exposant et mantissa! = 0).