Pourquoi ne Double.NaN==Double.NaN return false?

Je viens de l'étude de OCPJP questions et j'ai trouvé cet étrange code:

public static void main(String a[]) {
    System.out.println(Double.NaN==Double.NaN);
    System.out.println(Double.NaN!=Double.NaN);
}

Quand j'ai couru le code, je l'ai eu:

false
true

Comment est la sortie false lorsque nous comparons deux choses qui se ressemblent les uns que les autres? Ce n' NaN veux dire?

  • C'est vraiment bizarre. Parce Que Double.NaN est statique final, la comparaison avec == doit retourner true. +1 pour la question.
  • La même chose est vraie en python: In [1]: NaN==NaN Out[1]: False
  • La même chose est vraie dans toutes les langues de suivre correctement la norme IEEE 754.
  • L'Intuition: "Bonjour" n'est pas un nombre, vrai (boolean) n'est pas un nombre. NaN != NaN, pour la même raison "Bonjour" != vrai
  • Mais quand je fais Double.comparer(Double.NaN, Double.NaN), je suis 0 en sortie je.e les deux sont égaux
  • La comparaison avec Double.NaN==Double.NaN convient en effet de retourner vrai si Double.NaN étaient de type java.lang.Double. Cependant, son type est la primitive double, et l'opérateur règles de double appliquer (ce qui demande cette inégalité pour assurer la conformité avec la norme IEEE 754, comme expliqué dans les réponses).
  • Oui, c'est en effet un peu incohérent. Cependant, il est explicitement décrite dans la documentation Javadoc: "Double.NaN est considéré par cette méthode pour être égal à lui-même " (voir file:///C:/Users/sle/Downloads/Docs/jdk-6u25-fcs-bin-b04-apidocs-04_Apr_2011/docs/api/java/lang/Double.html#compareTo%28java.lang.Double%29 )
  • Voir aussi Pourquoi est indéfini == undefined, mais NaN != NaN? et en fait NaN est égal à NaN (ce sont des propos de JS, mais comme noté au-dessus et au-dessous, c'est indépendant de la langue).
  • mais: String h = "Hello"; // not a number assertFalse(h != h); // is false Double.NaN comportement certainement n'est pas intuitif...

InformationsquelleAutor Maverick | 2012-01-11