Почему двойной.НАН не равна себе?



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



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


какую константу я могу сравнить с двойником.Нэн и получить правду?

453   11  

11 ответов:

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

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

Фанки, да?

использовать двойной.IsNaN.

bool isNaN = Double.IsNaN(yourNumber)

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

правильный способ сравнить что-то с NaN-это использовать IsNaN

использовать двойной.IsNan() чтобы проверить равенство здесь. Причина в том, что NaN не число.

для этого есть специальная функция:

double.IsNan(huh);

используйте метод " Double.IsNaN (value) " для проверки этого условия.

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

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

под капотом, двойной.Метод IsNaN может на самом деле сделать то же самое. Вы все равно должны использовать его, потому что поведение довольно удивительно для тех, кто не знает о стандартных ФП.

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

∞ + (-∞) = Нэн

0/0 = NaN

(∞ + (-∞)) (0/0)

вот некоторые C#, чтобы продемонстрировать

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);

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

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

есть ошибка в C# на мой взгляд, где 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);

оператор равенства считает два значения NaN неравными друг другу. В общем случае операторы Double не могут использоваться для сравнения Double.NaN с другими двойными значениями, хотя методы сравнения (например,равна и 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 скрипка для того же.

Comments

    Ничего не найдено.