Может ли число в JavaScript достигать бесконечности во время выполнения?
Возможно во время выполнения получить число, которое является результатом вычисления и имеет значение Infinity
.У Нины Шольц есть показанный один такой случай: если вы сделаете x = 1 / 0
, x
будет иметь значение Infinity
.
Что бы на самом деле произошло, если число выходит за пределыэтот диапазон [т.е. вне диапазона, который может обрабатывать JavaScript]?Будет ли JavaScript ссылаться на него как на новое Infinity
число?
Мы можем попробовать.Number.MAX_VALUE
- максимальное число с плавающей запятой, которое может представлять JavaScript.Если вы запустите это:
Number.MAX_VALUE + 1
Вы получите большое число, но не Infinity
.Что там происходит?Хмм, давай попробуем вот что:
Number.MAX_VALUE + 1 === Number.MAX_VALUE
Результат равен true
.Скажи, что?Проблема в том, что числа с плавающей запятой имеют ограниченную точность, когда я добавляю 1 к Number.MAX_VALUE
, не хватает точности для регистрации приращения.
Если вы попробуете это:
Number.MAX_VALUE * 2
Тогда вы получите Infinity
.
Каковы все сценарии в JavaScript, где значение Infinity может быть присвоено переменной во время выполнения?
"все сценарии" ... хм ... Есть несколько проблем с составлением перечня всех сценариев.С одной стороны, не ясно, по каким критериям следует отличать один сценарий от другого.-Math.log(0)
отличается от 1 / 0
.Если так, то почему?Кроме того, существует проблема, заключающаяся в том, что движки JavaScript имеют достаточно возможностей для реализации математических функций.Например, Math.tan
определяется следующим образом в текущем наброске :
Math.tan(x)
Возвращает зависящее от реализации приближение к тангенсу x
.Аргумент выражается в радианах.
Если x
равно NaN
, результат равен NaN
.
Если x
равно +0
, результат равен +0
.
Если x
равно -0
, результат равен -0
.
Если x
равен +∞
или -∞
, результат равен NaN
.
Он не требует значения для Math.tan(Math.PI / 2)
Если вы помните свои классы тригонометрии, pi / 2
составляет 90 градусов, а под этим углом касательная бесконечна.Различные версии v8 вернули Infinity
или очень большое положительное число.(См. этот вопрос .) Спецификация не обязывает один результат перед другим: реализации свободны в выборе.
Таким образом, практически, если вы начинаете с набора случаев, которые, как вы знаете, математически должныпроизводить Infinity
, вы не знаете, будут ли они на самом деле производить это, пока вы не попробуете их.
Часть вашего вопроса с функцией incrementNumToInfinity
не полностьюясно для меня.Вы, кажется, спрашиваете, можете ли вы достичь бесконечности, просто увеличив число.Смотря что ты имеешь в виду.Если вы имеете в виду это:
let x = 0;
while (x !== Infinity) {
x++;
}
Это никогда не закончится .x
никогда не выйдет за пределы Number.MAX_SAFE_INTEGER + 1
.Так что оно не достигнет Infinity
.Попробуйте это:
let x = Number.MAX_SAFE_INTEGER + 1;
x === x + 1;
Вы получите результат true
.Это снова сталкивается с проблемами точности. Приращение в 1 недостаточно велико, чтобы изменить разницу в точности, доступной для вас.
Изменение приращения на 2, 5, 10 или 10000000 на самом деле не решает проблему, онопросто меняется, как далеко вы можете пройти, прежде чем ваш прирост больше не будет иметь значения.