Il existe une bonne description de NaN et des pièges courants lors de l'utilisation de NaN en Java: ppkwok.blogspot.co.uk/2012/11/…
Phil
Si vous demandez "à quoi sert NaN?" en Java (ou dans tout autre langage), je peux vous donner un cas d'utilisation où c'est très pratique: quand j'ai un tableau 2D de flottants, mais que mon calcul n'a pas de valeur significative pour une partie de ce tableau 2D, Je vais remplir cette valeur avec "NaN". Cela peut être utilisé pour signaler aux utilisateurs en aval de mon calcul (comme quand il est transformé en une image raster) "ne faites pas attention à la valeur à ce stade". Très utile!
Dan H
BTW, que signifie - exactement - «rétrécir» un double? Curious ...
"NaN" signifie "pas un nombre". "Nan" est produit si une opération en virgule flottante a des paramètres d'entrée qui amènent l'opération à produire un résultat non défini. Par exemple, 0,0 divisé par 0,0 est arithmétiquement indéfini. Prendre la racine carrée d'un nombre négatif est également indéfini.
De plus, NaN est défini de manière assez explicite par la norme IEEE pour l'arithmétique à virgule flottante (IEEE 754) que Java suit aveuglément. La lecture de la norme vous ouvre les yeux sur beaucoup de choses, les multiples valeurs de zéro étant l'une des choses.
Esko
37
En outre, NaNa la propriété intéressante d'être le seul "nombre" qui n'est pas le même que lui-même une fois comparé. Par conséquent , une commune (et dans de nombreuses langues le seul) test si un nombre xest NaNle suivant:boolean isNaN(x){return x != x;}
quazgar
3
Le lien en réponse est mort?
Pang
3
... "Prendre la racine carrée d'un nombre négatif n'est pas défini (en arithmétique)" ... Ce n'est pas le cas! c'est en fait iet certains langages comme python le traitent très bien ... Ce n'est peut-être pas le cas chez javatoi
Rafael T
5
@RafaelT Je dirais qu'il n'est pas défini en arithmétique non complexe. Il n'y a aucun moyen d'attribuer un nombre complexe à un flottant ou un double en Java. Python est typé dynamiquement, il peut donc être possible de simplement renvoyer un nombre complexe dans ce cas.
sstn
19
NaNsignifie «Pas un nombre» et est essentiellement une représentation d'une valeur à virgule flottante spéciale dans la norme à virgule flottante IEE 754 . NaN signifie généralement que la valeur est quelque chose qui ne peut pas être exprimé avec un nombre à virgule flottante valide.
Une conversion aboutira à cette valeur, lorsque la valeur à convertir est autre chose, par exemple lors de la conversion d'une chaîne qui ne représente pas un nombre.
Comment convertir? Avec parseFloat()ou parseDouble? Ou autre chose?
Alonso del Arte
14
NaNsignifie "Pas un nombre" et est le résultat d'opérations non définies sur les nombres à virgule flottante comme par exemple la division de zéro par zéro. (Notez que si la division d'un nombre non nul par zéro est également généralement indéfinie en mathématiques, cela ne se traduit pas par NaN mais par l'infini positif ou négatif).
NaNsignifie «Pas un nombre». C'est une valeur à virgule flottante spéciale qui signifie que le résultat d'une opération n'a pas été défini ou ne peut pas être représenté en tant que nombre réel.
Voir ici pour plus d'explications sur cette valeur.
La première chose que vous devez savoir, c'est que le concept de NaN est implémenté directement sur le matériel du CPU.
Tous les principaux processeurs modernes semblent suivre IEEE 754 qui spécifie les formats à virgule flottante, et les NaN, qui ne sont que des valeurs flottantes spéciales, font partie de cette norme.
Par conséquent, le concept sera très similaire dans tous les langages, y compris Java qui émet simplement du code en virgule flottante directement vers le processeur.
Avant de continuer, vous voudrez peut-être lire d'abord les réponses suivantes que j'ai écrites:
les opérations étranges qui sont à la limite de l'infini plus ou moins donnent cependant + - infini au lieu de NaN
1.0f / 0.0f
log(0.0f)
0.0 tombe presque dans cette catégorie, mais le problème est probablement qu'il pourrait aller à plus ou moins l'infini, donc il a été laissé comme NaN.
si NaN est l'entrée d'une opération flottante, la sortie a également tendance à être NaN
il y a plusieurs valeurs possibles pour NaN 0x7fc00000, 0x7fc00001, 0x7fc00002, bien que x86_64 semble générer seulement 0x7fc00000.
NaN et l'infini ont une représentation binaire similaire.
Pas un gars de Java, mais dans JS et d'autres langages, j'utilise "Pas un nombre", ce qui signifie qu'une opération a fait en sorte qu'il ne devienne pas un nombre valide.
Je chipote avec cette réponse. Premièrement: "NaN" EST une valeur valide pour un float IEEE! (Après tout, il est défini dans la spécification ... donc c'est "valide", non?). Deuxièmement: la "division par zéro" peut être représentée par IEEE "Positive Infinity" ou "Negative Infinity"; un meilleur exemple de "NaN" est "zéro divisé par zéro", comme certaines autres réponses l'ont correctement souligné.
Dan H
"Valeur valide" et "définie dans la spécification" n'est pas la même chose. Accepté 0/0.
Réponses:
Tiré de cette page :
la source
NaN
a la propriété intéressante d'être le seul "nombre" qui n'est pas le même que lui-même une fois comparé. Par conséquent , une commune (et dans de nombreuses langues le seul) test si un nombrex
estNaN
le suivant:boolean isNaN(x){return x != x;}
i
et certains langages comme python le traitent très bien ... Ce n'est peut-être pas le cas chezjava
toiNaN
signifie «Pas un nombre» et est essentiellement une représentation d'une valeur à virgule flottante spéciale dans la norme à virgule flottante IEE 754 . NaN signifie généralement que la valeur est quelque chose qui ne peut pas être exprimé avec un nombre à virgule flottante valide.Une conversion aboutira à cette valeur, lorsque la valeur à convertir est autre chose, par exemple lors de la conversion d'une chaîne qui ne représente pas un nombre.
la source
parseFloat()
ouparseDouble
? Ou autre chose?NaN
signifie "Pas un nombre" et est le résultat d'opérations non définies sur les nombres à virgule flottante comme par exemple la division de zéro par zéro. (Notez que si la division d'un nombre non nul par zéro est également généralement indéfinie en mathématiques, cela ne se traduit pas par NaN mais par l'infini positif ou négatif).la source
NaN
signifie «Pas un nombre». C'est une valeur à virgule flottante spéciale qui signifie que le résultat d'une opération n'a pas été défini ou ne peut pas être représenté en tant que nombre réel.Voir ici pour plus d'explications sur cette valeur.
la source
NaN signifie Pas un nombre. Il est utilisé pour signifier toute valeur non définie mathématiquement. Comme diviser 0,0 par 0,0. Vous pouvez chercher ici pour plus d'informations: https://web.archive.org/web/20120819091816/http://www.concentric.net/~ttwang/tech/javafloat.htm
Publiez votre programme ici si vous avez besoin d'aide supplémentaire.
la source
NaN = pas un nombre.
la source
Cela ne signifie pas un nombre. C'est une représentation courante d'une valeur numérique impossible dans de nombreux langages de programmation.
la source
Exemple exécutable minimal
La première chose que vous devez savoir, c'est que le concept de NaN est implémenté directement sur le matériel du CPU.
Tous les principaux processeurs modernes semblent suivre IEEE 754 qui spécifie les formats à virgule flottante, et les NaN, qui ne sont que des valeurs flottantes spéciales, font partie de cette norme.
Par conséquent, le concept sera très similaire dans tous les langages, y compris Java qui émet simplement du code en virgule flottante directement vers le processeur.
Avant de continuer, vous voudrez peut-être lire d'abord les réponses suivantes que j'ai écrites:
Maintenant, pour une action Java. La plupart des fonctions d'intérêt qui ne sont pas dans le langage de base vivent à l'intérieur
java.lang.Float
.Nan.java
GitHub en amont .
Courir avec:
Production:
Nous apprenons donc quelques choses:
des opérations flottantes étranges qui n'ont aucun résultat raisonnable donnent NaN:
0.0f / 0.0f
sqrt(-1.0f)
log(-1.0f)
générer un
NaN
.En C, il est en fait possible de demander des signaux à lever sur de telles opérations avec
feenableexcept
pour les détecter, mais je ne pense pas que cela soit exposé en Java: Pourquoi la division entière par zéro 1/0 donne-t-elle une erreur mais une virgule flottante 1 / 0,0 renvoie "Inf"?les opérations étranges qui sont à la limite de l'infini plus ou moins donnent cependant + - infini au lieu de NaN
1.0f / 0.0f
log(0.0f)
0.0
tombe presque dans cette catégorie, mais le problème est probablement qu'il pourrait aller à plus ou moins l'infini, donc il a été laissé comme NaN.si NaN est l'entrée d'une opération flottante, la sortie a également tendance à être NaN
il y a plusieurs valeurs possibles pour NaN
0x7fc00000
,0x7fc00001
,0x7fc00002
, bien que x86_64 semble générer seulement0x7fc00000
.NaN et l'infini ont une représentation binaire similaire.
Décomposons-en quelques-uns:
À partir de là, nous confirmons ce que IEEE754 spécifie:
Les NaN peuvent être positifs ou négatifs (bit du haut), bien que cela n'ait aucun effet sur les opérations normales
Testé dans Ubuntu 18.10 amd64, OpenJDK 1.8.0_191.
la source
Pas un gars de Java, mais dans JS et d'autres langages, j'utilise "Pas un nombre", ce qui signifie qu'une opération a fait en sorte qu'il ne devienne pas un nombre valide.
la source
Cela signifie littéralement «Pas un nombre». Je soupçonne que quelque chose ne va pas avec votre processus de conversion.
Consultez la section Not A Number à cette référence
la source
Pas une valeur à virgule flottante valide (par exemple, le résultat de la division par zéro)
http://en.wikipedia.org/wiki/NaN
la source