Flotteur.NaN == Float.NaN
Pourquoi cette comparaison me donner de "faux"? J'ai regardé la source et le Flotteur.NaN est défini comme
/**
* A constant holding a Not-a-Number (NaN) value of type
* <code>float</code>. It is equivalent to the value returned by
* <code>Float.intBitsToFloat(0x7fc00000)</code>.
*/
public static final float NaN = 0.0f / 0.0f;
EDIT: étonnamment, si je fais ceci:
System.out.println("FC " + (Float.compare(Float.NaN, Float.NaN)));
il me donne 0
. Donc Float.compare()
, ne pense qu'à NaN est égal à lui-même!
Vous devez vous connecter pour publier un commentaire.
Parce que Java implémente la norme IEEE-754 virgule flottante standard qui garantit que toute comparaison contre
NaN
retourne false (sauf!=
qui renvoie true)Cela signifie que vous ne pouvez pas vérifier dans vos façons habituelles de savoir si un nombre à virgule flottante est NaN, de sorte que vous pourrait réinterpréter les deux numéros de services de renseignements et de les comparer ou de les utiliser beaucoup plus sage solution:
!=
comparaisons, de retourtrue
.x==x
est fausse, alors x est NaN.Float.isNaN(float)
(et le Double a sa version, trop).x==y
serait "x est indiscernable de y", et si x et y se trouvent être NaN que l'énoncé est vrai. Je pense que personne n'sensible "question", qui aurait répondu à l'égalité des règles spécifiées par la norme IEEE.3.0/0
n'est pas NaN mais l'infini (et oui, cela permettra de comparer égal à d'autres infinis). Mathématiquement parlant, il est parfaitement logique:0/0
est ni infini, ni 0, le résultat est indéterminé (sinon il serait en violation d'une propriété existante de numéros de indépendant ce résultat nous les ramasser). Et des résultats indéterminés ont des règles spéciales sinon, vous courez dans des paradoxes.someLong==someDouble
serait autorisé que dans les cas où la langue s'assurer de l'équivalence de comportement (en vérifiant que les deux(double)someLong==someDouble
etsomeLong==(long)someDouble
sont vraies). L'égalité des opérateurs qui ne représentent pas des relations d'équivalence entraîner confuse de la sémantique.Utilisation
Float.isNaN
pour vérifier les valeurs NaN.Tout ce que j'ai à dire est: Wikipédia À Propos De NaN.
Il est écrit très clairement. La partie intéressante est que la virgule flottante NaN de la norme commune exprime un NaN de cette façon:
Le s est le signe (positif ou négatif), le 1, sont de l'exposant et le x est considéré comme une charge.
À la recherche à la charge de NaN n'est pas égal à tout NaN et il existe de rares chances que ces informations de la charge utile sont intéressants pour vous en tant que développeur (par exemple des nombres complexes).
Une autre chose est que, dans la ils ont de signalisation et tout à fait NaN. Une signalisation NaN (sNaN) signifie un NaN qui devrait soulève une réaction comme une exception. Il devrait être utilisé pour dire à haute voix que vous avez un problème dans votre équation. Un calme NaN (qNaN) est un NaN c'est en silence passa.
Un sNaN qui a créé un signal est converti en un qNaN à ne plus produire des signaux dans les opérations ultérieures. Rappelez-vous certains système de définir i^0 = 1 comme une constante que NaN^0 = 1 est vraie. Il y a donc des cas où les gens de calculer avec NaN.
Donc à la fin je voudrais aller avec ceci: qNaN != sNaN, mais c'est interne et n'est pas observable pour l'utilisateur (vous ne pouvez pas vérifier). Mélanger le long du paiement et le signe (oui, vous pouvez avoir le négatif et le positif NaN) et il me semble que toujours revenir NaN != NaN ressemble à un choix plus intelligent que j'ai enfin appris à apprécier -> je vais jamais, jamais, jamais se plaindre ou de se demander au sujet de l'inégalité de NaN à nouveau. Louange les gens qui sont que des gestes de générosité de nous une bonne qualité!
Par la route: Java utilise un positif NaN avec une charge de 0 (tous les x sont des zéros).