2014-02-19 5 views
1

В JavaScript, если вы разделите 0 вы получаете InfinityInfinite от деления на ноль

typeof Infinity; //number 
isNaN(Infinity); //false 

Это инсинуирует, что Бесконечность число (конечно, не аргумент там).

Что я узнал, что все, что делится на ноль, находится в неопределенной форме и не имеет значения, не является числом.

Это определение, однако, для арифметики, и я знаю, что при программировании он может либо дать бесконечность, ни число, либо просто выбросить исключение.

Так зачем бросать бесконечность? У кого-нибудь есть объяснение?

+0

Я понимаю, близкий голос, но, по крайней мере, близко к правильной причине .. это не «вообще вычислительное или программное обеспечение» это конкретный вопрос о JavaScript;) И это не в первую очередь мнение основанный ... LOL бесконечность - это не мнение xD –

+0

'Бесконечность/Бесконечность = 0/0 = NaN',' Бесконечность/x = Бесконечность' и 'x/Бесконечность = 0' кажутся вполне разумными. – Vikram

+2

Это совершенно правильный вопрос в соответствии с FAQ - он имеет правильный и детерминированный ответ (как вы можете видеть ниже) в рамках SO (речь идет о языке программирования!) – SomeKittens

ответ

4

Прежде всего, результат Infinity не обусловлен какой-то сумасшедшей математикой за кулисами. The spec states that:

Деление ненулевого конечного значения на нуль приводит к знаковой бесконечности. Знак определяется вышеизложенным правилом.

Логика спецификации авторов идет по этим линиям:

2/1 = 2. Достаточно просто.

2/0.5 = 4. Поглощение знаменателя удваивает результат.

... и так далее:

2/0.0000000000000005 = 4e+1. Когда знаменатель стремится к нулю, результат растет. Таким образом, авторы спектакля решили делить на ноль по умолчанию на Infinity, а также на любую другую операцию, которая приводит к слишком большому числу для JavaScript для представления [0]. (вместо некоторого квазичислового состояния или деления на нулевое исключение).

Вы можете увидеть это в действии в коде двигателя V8 Google: https://github.com/v8/v8/blob/bd8c70f5fc9c57eeee478ed36f933d3139ee221a/src/hydrogen-instructions.cc#L4063

[0] «Если значение слишком велико, чтобы представлять, операция переполняется, то результатом является бесконечность соответствующего знака. "

+0

Это математически неверно. Деление на ноль не приводит к * наибольшему числу, которое можно вообразить, оно просто * стремится к *, что при приближении к нему с положительной стороны. – Joeytje50

+5

Правда, но мы говорим о * JavaScript *, а не математике. Существуют различия, навязываемые реальностью. – SomeKittens

+0

Чтобы добавить к тому, что сказал @ Joeytje50 (с которым я согласен), даже понятие «стремление к бесконечности» не всегда справедливо.Я могу построить f (x) так, чтобы предел f (x)/x при x → 0 + = z для любого желаемого постоянного действительного числа * z *. – TypeIA

0

Когда x стремится к 0 в формуле y=1/x, y стремится к бесконечности. Таким образом, было бы разумно, если бы что-то, что могло бы стать действительно большим числом (после этой логики), было бы представлено бесконечностью. Где-то около 10^320, JavaScript возвращает Infinity вместо фактического результата, поэтому, если вычисление в противном случае окажется выше этого порога, оно просто возвращает бесконечность.

+1

Собственно, нет. Деление на 0 возвращает 'Бесконечность' без какой-либо арифметики. http://es5.github.io/#x11.5.2 –

+0

Fabrício правильно, это совсем не то, что на самом деле происходит. – TypeIA

+0

Ответ был бы правильным, если бы речь шла о делении очень большого числа на очень небольшое число, однако деление на 0 математически невозможно - из ссылки моего предыдущего комментария: «Разделение ненулевого конечного значения на нулевые результаты в подписанной бесконечности ». Возможно, значение деления на нулевое значение повлияло на переполнение, которое может произойти на определенных делениях, которое также возвращает Infinity, как вы описали, но фактическая причина деления на 0 для возврата Infinity - это предложение в спецификации. –

0

Javascript - это свободно типизированный язык, что означает, что он не должен возвращать тип, который вы ожидали от функции.

бесконечность не на самом деле целое

В сильно типизированных языках, если ваша функция должна была вернуть Int это означает, что единственное, что вы можете сделать, когда вы получаете значение, которое не ИНТ в сгенерирует исключение

в слабо типизированном языке у вас есть еще один вариант, который должен вернуть новый тип, который представляет собой результат лучше (например, как в этом случае бесконечности)

+0

typeof Infinity === "number" –

0

бесконечности очень отличается от неопределённости.

Если вы вычисляете x/0 +, вы получаете + бесконечность и для x/o- вы получаете -infinity (x> 0 в этом примере).

Javascript использует его, чтобы отметить, что вы превысили емкость хранилища с плавающей запятой, лежащего в основе.

После этого вы можете обработать его, чтобы направить свой sw к исключительным случаям или большому числу версий ваших вычислений.

Бесконечность на самом деле соответствует формулам. Без этого вам нужно разбить формулы на мелкие кусочки, и вы получите более сложный код.

Попробуйте это, и вы получите J в бесконечность:

var i = Infinity; 
var j = 2*i/5; 
console.log("result = "+j); 
0

Как определяется ECMAScript language specification:

Знак результата положителен, если оба операнда имеют один и тот же знак, отрицательный если операнды имеют разные знаки.

Разделение бесконечности на нуль приводит к бесконечности. Знак равен , определяемый по правилу, уже указанному выше.

Деление ненулевого конечного значения на нуль приводит к знаковой бесконечности. Знак определяется вышеизложенным правилом.

В знаменателе арифметической дроби стремится к 0 (для конечного ненулевого числителе) результат стремится к +Infinity или -Infinity в зависимости от знаков операндов.Это можно увидеть:

  • 1/0.1 = 10
  • 1/0.01 = 100
  • 1/0.001 = 1000
  • 1/0.0000000001 = 10000000000
  • 1/1e-308 = 1e308

Принимая это дальше, то при выполнении деления на ноль, то двигатель JavaScript дает результат (как определено spe с цитированной выше):

  • 1/0 = Number.POSITIVE_INFINITY
  • -1/0 = Number.NEGATIVE_INFINITY
  • -1/-0 = Number.POSITIVE_INFINITY
  • 1/-0 = Number.NEGATIVE_INFINITY

Это то же самое, если вы разделите на достаточно большое значение:

  • 1/1e309 = Number.POSITIVE_INFINITY
0

Это связано с тем, что Javascript использует арифметику с плавающей точкой и исключение для обработки деления на ноль.

Деление на ноль (операция по конечным операндам дает точный бесконечный результат, например, 1/0 или log (0)) (по умолчанию возвращает ± бесконечность).

wikipedia source

Смежные вопросы