В JavaScript, почему ноль, деленный на нуль, возвращает NaN, но любой другой, деленный на нуль, возвращает бесконечность?
Мне кажется, что код
console.log(1 / 0)
должен возвращать NaN
, но вместо этого он возвращает Infinity
. Однако этот код:
console.log(0 / 0)
возвращает NaN
. Может ли кто-нибудь помочь мне понять аргументы в пользу этой функции? Не только это кажется непоследовательным, но также и неправильным, в случае x / 0
, где x !== 0
Ответы
Ответ 1
Потому что это то, что определяется с плавающей запятой (в общем, как Javascript). См. Например:
Грубо говоря, вы могли бы думать о 1/0 как о пределе 1/x, когда x стремится к нулю. И 0/0 не имеет никакой разумной интерпретации вообще, поэтому NaN.
Ответ 2
В дополнение к ответам, основанным на математической концепции нуля, особое внимание уделяется числам с плавающей запятой. Каждый результат нижнего потока, любое ненулевое число, абсолютная величина которого слишком мала для представления в качестве ненулевого числа, представляется как ноль.
0/0 действительно может быть 1e-500/1e-600, или 1e-600/1e-500, или многими другими отношениями очень малых значений.
Фактическое отношение может быть любым, поэтому нет значимого числового ответа, и результат должен быть NaN.
Теперь рассмотрим 1/0. Не имеет значения, представляет ли 0 1е-500 или 1е-600. Несмотря на это, деление будет переполняться, а правильным результатом будет значение, используемое для представления переполнений, Infinity.
Ответ 3
Я понимаю, что это старо, но я считаю важным отметить, что в JS есть также -0
, который отличается от 0
или +0
, что делает эту функцию JS намного логичнее, чем на первый взгляд.
1 / 0 -> Infinity
1 / -0 -> -Infinity
что логически имеет смысл, поскольку в исчислении причина, делящаяся на 0, равна undefined, заключается только в том, что левый предел переходит в отрицательную бесконечность и правый предел к положительной бесконечности. Поскольку -0
и 0
- разные объекты в JS, имеет смысл применить положительный 0 для оценки к положительному Infinity
, а отрицательный 0 - к отрицательному Infinity
Эта логика не относится к 0/0
, которая является неопределенной. В отличие от 1/0
, мы можем получить два результата, ограничивающих этот метод с помощью 0/0
lim h->0(0/h) = 0
lim h->0(h/0) = Infinity
что, конечно, противоречиво, поэтому оно приводит к NaN