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 par Double.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.

Était-ce utile?

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 NaNs à 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 xxxxx 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).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top