web-dev-qa-db-fra.com

Le moyen le plus court de vérifier si Double est "NaN"

Lors de l'appel de Double.IsNaN() avec Double.PositiveInfinity comme argument, le résultat est faux. C'est contre mon intuition puisque l'infini n'est pas un nombre. Apparemment, "NaN" n'existe qu'en termes de constante dans .NET, est-ce décrit par la norme IEEE ou s'agit-il d'un détail d'implémentation personnalisé? Existe-t-il un moyen plus court de vérifier si un Double est "NaN" que:

(Double.IsNaN(d) || Double.IsPositiveInfinity(d) || Double.IsNegativeInfinity(d))

ou

(Double.IsNaN(d) || Double.IsInfinity(d))
34
Leopold Asperger

Comme le dit MSDN, NaN signifie que le résultat n'est pas défini. Avec des infinis le résultat est défini:

Une méthode ou un opérateur renvoie NaN lorsque le résultat d'une opération n'est pas défini. Par exemple, le résultat de la division de zéro par zéro est NaN, comme le montre l'exemple suivant. (Mais notez que la division d'un nombre non nul par zéro renvoie soit PositiveInfinity ou NegativeInfinity, selon le signe du diviseur.)

Donc, ce n'est pas une bonne idée de suivre les infinis comme NaN. Vous pouvez écrire une méthode d'extension pour vérifier si la valeur n'est pas NaN ou infini:

// Or IsNanOrInfinity
public static bool HasValue(this double value)
{
    return !Double.IsNaN(value) && !Double.IsInfinity(value);
}
52
Sergey Berezovskiy

Il existe trois valeurs spéciales dans le type Double, qui est basé sur norme IEEE 754 . L'un est l'infini positif, un autre est l'infini négatif et le dernier est le Not-a-Number (NaN). La méthode Double.IsNaN Ne fait que vérifier si la valeur de la variable est cette valeur NaN spéciale.

2
Tony Vitabile