Que signifient ces trois valeurs spéciales en virgule flottante: l'infini positif, l'infini négatif, NaN?

StackOverflow https://stackoverflow.com/questions/1007586

Question

Comment pouvons-nous les utiliser dans nos codes et quelle sera la cause de NaN (pas un nombre)?

Était-ce utile?

La solution

Ceci peut être une bonne référence si vous souhaitez en savoir plus sur le flottant. numéros de points en Java.

L'infini positif est un nombre positif si grand qu'il ne peut pas être représenté normalement. L'infini négatif est un nombre négatif si grand qu'il ne peut pas être représenté normalement. NaN signifie "Pas un nombre". et résulte d'une opération mathématique qui ne donne pas un nombre comme la division de 0 par 0.

En Java, les classes Double et Float ont toutes les deux des constantes pour représenter les trois cas. Ils sont POSITIVE_INFINITY, NEGATIVE_INFINITY et NaN.

De plus, considérez ceci:

double a = Math.pow(10, 600) - Math.pow(10, 600); //==NaN

Mathématiquement, tout le monde peut voir que c’est 0. Mais pour la machine, c’est un "Infinity". - " Infinity " (de même rang), qui est bien NaN.

Autres conseils

  • L’infini positif signifie aller à l’infini dans le sens positif - entrer dans les valeurs les plus grandes et les plus grandes dans le sens positif.
  • L’infini négatif signifie aller à l’infini dans le sens négatif - entrer dans les valeurs les plus grandes et les plus grandes dans le sens négatif.
  • Not-a-number (NaN) est quelque chose d'indéfini, tel que le résultat de 0/0 .

Et les constantes de la spécification du Float :

Vous trouverez plus d'informations dans la page IEEE-754 de Wikipedia .

Voici un petit programme pour illustrer les trois constantes:

System.out.println(0f / 0f);
System.out.println(1f / 0f);
System.out.println(-1f / 0f);

Sortie:

NaN
Infinity
-Infinity
  • 1/0 donnera un infini positif.
  • 0/0 donnera Nan. Vous pouvez utiliser NaN comme tout autre nombre, par exemple: NaN + NaN = NaN, NaN + 2.0 = NaN
  • -1/0 donnera un infini négatif.

Infini (en java) signifie que le résultat d’une opération sera un nombre extrêmement grand, positif ou négatif, qui ne pourra pas être représenté normalement.

L’idée est de représenter des nombres spéciaux qui peuvent résulter naturellement d’opérations effectuées sur "normal". Nombres. Vous pouvez voir l'infini (à la fois positif et négatif) comme "débordement". de la représentation en virgule flottante, l’idée étant que dans au moins certaines conditions, le fait de renvoyer une telle valeur par une fonction donne toujours un résultat significatif. Ils ont toujours certaines propriétés de classement, par exemple (pour ne pas écraser les opérations de tri, par exemple).

Nan est très particulier: si x est Nan, x == x est faux (c’est en fait un moyen de tester nan, au moins dans C, encore une fois). Cela peut être assez déroutant si vous n’êtes pas habitué aux particularités de la virgule flottante. À moins que vous ne fassiez des calculs scientifiques, je dirais que le retour de Nan après une opération est un bug, du moins dans la plupart des cas. Nan peut venir pour diverses opérations: 0/0, inf - inf, inf / inf, 0 * inf. Nan n'a pas non plus de propriété de commande.

Vous pouvez les utiliser comme n'importe quel autre nombre:

exemple:

float min = Float.NEGATIVE_INFINITY;
float max = Float.POSITIVE_INFINITY;
float nan = Float.NaN;
  

L'infini positif est un nombre positif si grand qu'il ne peut pas être   représenté normalement. L'infini négatif est un nombre négatif si grand   qu'il ne peut pas être représenté normalement. NaN signifie "Pas un nombre". et   résulte d'une opération mathématique qui ne produit pas de nombre -   comme divisant 0 par 0.

Ce n'est pas une réponse complète (ou pas assez clarifiée) - considérez ceci:

double a = Math.pow(10,600) - Math.pow(10,600); //==NaN

mathématiquement, tout le monde peut voir qu'il s'agit de 0. mais pour la machine, il s'agit d'un "Infinity". - "Infinity" (du même ordre) qui est bien NaN ...

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