Зачем плавать.НаN! = Double.NaN в C #? - PullRequest
29 голосов
/ 06 марта 2011

Почему float.NaN != double.NaN?

в то время как float.PositiveInfinity == double.PositiveInfinity и float.NegativeInfinity == double.NegativeInfinity равны равны .

Пример:

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

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

Ответы [ 3 ]

44 голосов
/ 06 марта 2011

NaN никогда не равно NaN (даже в пределах одного типа). Следовательно, почему существует функция IsNaN :

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.");
}

Вы также должны знать, что ни одно из показанных вами сравнений на самом деле не происходит "как есть". Когда вы пишете floatValue == doubleValue, плавающие неявно преобразуются в удвоенные значения перед выполнением сравнения.

29 голосов
/ 06 марта 2011

Возможно, потому что NaN != NaN

10 голосов
/ 06 марта 2011

Цитировать Википедия :

Сравнение с NaN всегда возвращает неупорядоченный результат даже при сравнении с самим собой.

...