web-dev-qa-db-fra.com

qu'est-ce que NaN signifie pour les doubles?

Quelle est la différence entre NaN et Infinity? Quand NaN apparaît-il? Qu'Est-ce que c'est?

24
Levi H

De Wikipedia :

En informatique, NaN (Not a Number) est une valeur de type numérique représentant une valeur indéfinie ou non représentable, en particulier dans les calculs à virgule flottante. L'utilisation systématique des NaN a été introduite par la norme à virgule flottante IEEE 754 en 1985, ainsi que la représentation d'autres quantités non finies comme les infinis.

Et à partir de MSDN :

  • Représente une valeur qui n'est pas un nombre (NaN). Ce champ est constant.

  • La valeur de cette constante est le résultat de la division de zéro par zéro.

  • Cette constante est renvoyée lorsque le résultat d'une opération n'est pas défini.

  • Utilisez IsNaN pour déterminer si une valeur n'est pas un nombre. Il n'est pas possible de déterminer si une valeur n'est pas un nombre en la comparant à une autre valeur égale à NaN.

Où comme Infinity ( infini positif et infini négatif ) est le résultat d'une opération en virgule flottante qui provoque un débordement (par exemple 3.0 / 0).

27
Nasreddine
  • Infinity est une construction mathématique:

    Par exemple, dans l'espace euclidien, la division à travers l'élément nul (zéro dans ce cas) devrait produire Infinity:

    1 / 0 = Infinity
    
  • Not a Number ou NaN est une construction de calcul, accompagnée d'analyseurs et de limitations programmatiques, et sa sortie peut recevoir une signification différente selon la fonction Dans la question.

    Par exemple, un résultat ne peut être traité mathématiquement qu'en utilisant un système numérique différent , ce qui est facile à faire pour un mathématicien, mais dans votre fonction, vous pouvez être laissé comme seule option pragmatique pour renvoyer NaN. Considérez, la racine carrée de -1:

    sqrt(-1) = NaN
    

    ... une opération facilement traitable dans complex et phase space.

Expérience:

Ouvrez la JavaScript.Console (CTRL + SHIFT + J) dans votre navigateur et tapez

>>> Math.sqrt(-1)
NaN

>>> 1/0
Infinity

>>> Number.MAX_VALUE
1.7976931348623157e+308

>>> Number.MAX_VALUE *2
Infinity

>>> parseFloat("I am not a Number")
NaN

En C #, les "situations NaN" typiques sont principalement gérées par le biais d'exceptions:

csharp> Int64.MaxValue;
9223372036854775807
csharp> Int64 i_64 = Int64.MaxValue;
//the number will overflow into the sign-bit
csharp> i_64 +=1;
//...or similarly with Doubles...
csharp> Double.MaxValue;
1.79769313486232E+308

//following, an exception is thrown before overflowing
csharp> Int64 i_64 = Int64.MaxValue+1;
{interactive}(1,29): error CS0220: The operation overflows at compile time in ch
ecked mode

Langages typés dynamiques:

Dans l'ensemble, l'utilisation de NaN est attribuée de manière quelque peu flexible dans différents langages de programmation. L'utilisation de NaN à la perte de certaines "informations contextuelles", est pratique dans les langages de script à typage dynamique, où les programmeurs ne veulent généralement pas se soucier des types d'exceptions complexes et leur manipulation.

12
Lorenz Lo Sauer

Cela se produit généralement lorsque vous divisez 0 par 0. Pour en savoir plus, cliquez ici: http://msdn.Microsoft.com/en-us/library/system.double.nan.aspx

4
misha

vérifier si le double a une valeur, sinon retourner 0

if (double.Equals(double.NaN, myValue))
    myValue= 0;
1
Jack

NaN signifie "Pas une valeur numérique". Pour éviter les exceptions, vous pouvez utiliser IsNaN pour déterminer si une valeur n'est pas un nombre.

1
Kolt

NaN signifie "Pas un nombre" et vous indique que cette variable de type double n'a aucune valeur.

1
Fischermaen