Почему float.NaN!= Double.NaN в С#?
Почему 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?
Ответы
Ответ 1
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
, поплавки фактически будут неявно преобразованы в двойные до того, как произойдет сравнение.
Ответ 2
Возможно, потому что NaN != NaN
Ответ 3
Чтобы процитировать wikipedia:
Сравнение с NaN всегда возвращает неупорядоченный результат даже при сравнении с самим собой.