29 votes

Pourquoi float.NaN! = Double.NaN en C #?

Pourquoi float.NaN != double.NaN ?

tandis que float.PositiveInfinity == double.PositiveInfinity et float.NegativeInfinity == double.NegativeInfinity sont égaux .

EXEMPLE:

 bool PosInfinity = (float.PositiveInfinity == double.PositiveInfinity); //true
bool NegInfinity = (float.NegativeInfinity == double.NegativeInfinity); //true

bool isNanEqual = (float.NaN == double.NaN);  //false, WHY?
 

44voto

Damien_The_Unbeliever Points 102139

NaN n'est jamais égal à NaN (même dans le même type). D'où la raison pour laquelle la fonction IsNaN existe:

 Double zero = 0;
// This will return true.
if (Double.IsNaN(0 / zero)) 
{
    Console.WriteLine("Double.IsNan() can determine whether a value is not-a-number.");
}
 

Vous devez également savoir qu'aucune des comparaisons que vous avez montrées ne se produit réellement "en l'état". Lorsque vous écrivez floatValue == doubleValue , les flottants seront en fait implicitement convertis en doubles avant la comparaison.

29voto

Devin Jeanpierre Points 23162

Probablement parce que NaN != NaN

10voto

Conrad Meyer Points 2063

Pour citer wikipedia :

Une comparaison avec un NaN renvoie toujours un résultat non ordonné même lors d'une comparaison avec lui-même.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X