Почему double.NaN не равно себе? - программирование

Почему double.NaN не равно себе?

Может кто-нибудь объяснить это мне? В С# double.NaN не равно double.NaN

bool huh = double.NaN == double.NaN; // huh = false
bool huh2 = double.NaN >= 0; // huh2 = false
bool huh3 = double.NaN <= 0; // huh3 = false

Какую константу я могу сравнить с double.NaN и получить правду?

4b9b3361

Ответ 1

Если вам интересно, вот что выглядит Double.IsNaN:

public static bool IsNaN(double d)
{
    return (d != d);
}

Веселый, да?

Ответ 3

bool isNaN = Double.IsNaN(yourNumber)

Ответ 4

Поведение преднамеренно. Причина, заключающаяся в том, что NaN представляет собой нечто, что не является числом, и поэтому это нечто вроде уловки для многих вещей.

Правильный способ сравнить что-то с NaN заключается в использовании функции IsNaN.

Ответ 5

Используйте Double.IsNan() для проверки равенства здесь. Причина в том, что NaN не является числом.

Ответ 6

Для этого существует специализированная функция:

double.IsNan(huh);

Ответ 7

Используйте метод "Double.IsNaN(значение)", чтобы проверить это условие.

Ответ 8

На самом деле вы уже нашли способ проверить, является ли число с плавающей запятой IEEE-754 NaN: это единственный плавающий (или диапазон значений, так как существует несколько NaN), который оценивается до False по сравнению с самим собой, то есть:

bool isNaN(double v) {
    return v != v;
}

Под капотом метод Double.IsNaN может фактически сделать то же самое. Вы все равно должны использовать его, потому что поведение совершенно неожиданно для любого, кто не знает о стандарте FP.

Ответ 9

Единственное, что мы знаем о NaN, это то, что это "не номер". Это не означает, что у него есть значение, которое связано с его состоянием. Например:

& INFIN; + (- & infin;) = NaN

0/0 = NaN

(& infin; + (- & infin;)) < > (0/0)

Здесь некоторые С# для демонстрации

var infinity = 100d / 0;
var negInfinity = -100d / 0;

var notANumber = infinity + negInfinity;
Console.WriteLine("Negative Infinity plus Infinity is NaN: {0}", double.IsNaN(notANumber));

var notANumber2 = 0d / 0d;
Console.WriteLine("Zero divided by Zero is NaN: {0}", double.IsNaN(notANumber2));

Console.WriteLine("These two are not equal: {0}", notANumber == notANumber2);

Ответ 10

Причина Double.NaN != Double.NaN проста:

Ожидаете ли вы, что 0/0 будет таким же, как Math.Sqrt(-3)? И так же, как Math.Sqrt(-7)?

В С# есть ошибка, на мой взгляд, где Equals() не переопределяется для NaN.

Assert.IsTrue(Double.NaN != Double.NaN);
Assert.IsTrue(Double.NaN.Equals(Double.NaN));

В то же время

Assert.IsTrue(Double.PositiveInfinity == Double.NegativeInfinity);
Assert.IsTrue(Double.PositiveInfinity.Equals(Double.PositiveInfinity));
// same for Double.NegativeInfinity and Single

Используйте статические функции для Double и Single, например

Double.IsNaN(value) && Double.IsInfinity(value);

Или более конкретно:

Double.IsPositiveInfinity(value);
Double.IsNegativeInfinity(value);

Ответ 11

Оператор Equality считает, что два значения NaN неравны друг другу. В общем случае двойные операторы не могут использоваться для сравнения Double.NaN с другими значениями Double, хотя методы сравнения (такие как Equals и CompareTo) могут. см. ниже примеры

Ссылка на msdn

class Program
{
    static void Main(string[] args)
    {
        Double i = Double.NaN;
        while (!i.Equals(i)) //this would be result in false
        //while(i != i) // this would result in true.
        {
            Console.WriteLine("Hello");
        }
    }
}

здесь является скриптом .net для того же самого.