В чем разница между NaN
и Infinity
? Когда появляется NaN
? Что это?
Что означает 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;