Что означает NaN для удвоений?
В чем разница между NaN
и Infinity
? Когда появляется NaN
? Что это?
Ответы
Ответ 1
От Wikipedia:
При вычислении NaN (Not a Number) является значением числового типа данных, представляющим undefined или непредставимое значение, особенно в вычислениях с плавающей запятой. Систематическое использование NaN было введено стандартом IEEE 754 с плавающей точкой в 1985 году наряду с представлением других не конечных величин, таких как бесконечности.
И из MSDN:
-
Представляет значение, которое не является числом (NaN). Это поле является постоянным.
-
Значение этой константы является результатом деления нуля на ноль.
-
Эта константа возвращается, когда результатом операции является undefined.
-
Используйте IsNaN, чтобы определить, не является ли значение числом. Невозможно определить, является ли значение не числом, сравнивая его с другим значением, равным NaN.
Где Infinity
(положительная бесконечность и отрицательная бесконечность) является результатом операции с плавающей запятой, которая вызывает переполнение (например, 3.0 / 0
).
Ответ 2
-
Infinity
- математическая конструкция:
Например, в евклидовом пространстве деление через нулевой элемент (ноль в этом случае) должно приводить к бесконечности:
1 / 0 = Infinity
-
Not a Number
или NaN
- это вычислительная конструкция, которая сочеталась с синтаксическими анализаторами и программными ограничениями, а ее выход может быть присвоен различный смысл в зависимости от рассматриваемой функции.
Например, результат может быть доступен только математически с помощью другой системы счисления, что легко для математика, но в вашей функции вы можете оставаться единственным прагматичным вариантом возврата NaN
. Рассмотрим квадратный корень из -1
:
sqrt(-1) = NaN
... операция, которая легко обрабатывается в complex
и phase space
.
Эксперимент
Откройте JavaScript.Console(CTRL + SHIFT + J) в своем браузере и введите
>>> Math.sqrt(-1)
NaN
>>> 1/0
Infinity
>>> Number.MAX_VALUE
1.7976931348623157e+308
>>> Number.MAX_VALUE *2
Infinity
>>> parseFloat("I am not a Number")
NaN
В С# типичные "NaN-ситуации" в основном обрабатываются через Исключения:
csharp> Int64.MaxValue;
9223372036854775807
csharp> Int64 i_64 = Int64.MaxValue;
//the number will overflow into the sign-bit
csharp> i_64 +=1;
//...or similarly with Doubles...
csharp> Double.MaxValue;
1.79769313486232E+308
//following, an exception is thrown before overflowing
csharp> Int64 i_64 = Int64.MaxValue+1;
{interactive}(1,29): error CS0220: The operation overflows at compile time in ch
ecked mode
Динамические типизированные языки:
В целом, использование NaN
несколько гибко назначается на разных языках программирования. Использование NaN
при потере некоторой "контекстной информации" удобно в динамически типизированных языках сценариев, где программисты обычно не хотят беспокоиться о сложных типах исключений и их обработке.
Ответ 3
Обычно происходит, когда вы делите 0 на 0. Подробнее читайте здесь: http://msdn.microsoft.com/en-us/library/system.double.nan.aspx
Ответ 4
NaN означает "Не целое число". Чтобы избежать исключений, вы можете использовать IsNaN для определения того, что значение не является числом.
Ответ 5
NaN означает "Не число" и сообщает, что эта переменная типа double не имеет значения.
Ответ 6
проверьте, имеет ли значение double, если нет, то верните 0
if (double.Equals(double.NaN, myValue))
myValue= 0;