Почему двойной.НАН не равна себе?
может кто-нибудь объяснить это мне? В 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
какую константу я могу сравнить с двойником.Нэн и получить правду?
11 ответов:
Если вам интересно, это
Double.IsNaNвыглядит так:public static bool IsNaN(double d) { return (d != d); }Фанки, да?
использовать двойной.IsNaN.
поведение нарочно. Причина в том, что NaN представляет собой что-то, что Не и так что это своего рода уловка для многих вещей.
правильный способ сравнить что-то с NaN-это использовать IsNaN
использовать двойной.IsNan() чтобы проверить равенство здесь. Причина в том, что NaN не число.
На самом деле, вы уже нашли способ проверить, является ли число с плавающей запятой 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