Добавление к Number.MAX_VALUE

Ответ на этот вопрос может быть до боли очевиден, но я не могу найти его ни в документах Mozilla, ни в Google из беглого поиска.

Если у вас есть такой код

Number.MAX_VALUE + 1; // Infinity, right?
Number.MIN_VALUE - 1; // -Infinity, right?

Тогда я бы ожидал добавленияanything на Number.MAX_VALUE подтолкнет его кInfinity, Результат простоNumber.MAX_VALUE плюнул прямо на меня.

Однако, играя в консоли Chrome JS, я заметил, что она на самом деле не сталаInfinity пока я не добавил / не вычитал достаточно:

Number.MAX_VALUE + Math.pow(100,1000); // now we hit Infinity
Number.MIN_VALUE - Math.pow(100,1000); // -Infinity at last

Каково объяснение этого «буфера»? междуNumber.MAX_VALUE а такжеInfinity?

 kennebec31 мая 2012 г., 18:51
Есть несколько не интуитивных поведений с большими и маленькими числами - попробуйте вычесть Number.MIN_VALUE из Number.MAX_VALUE, для одного.
 Johann Echavarria26 апр. 2014 г., 21:26
Number.MIN_VALUE & quot; - это число, наиболее близкое к 0, а не самое отрицательное число, которое JavaScript может представлять & quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MIN_VALUE

Ответы на вопрос(2)

Решение Вопроса

Standardwise ...

В ECMAScript добавление двух ненулевых конечных чисел реализовано как(ECMA-262 §11.6.3 "Applying the Additive Operators to Numbers"):

the sum is computed and rounded to the nearest representable value using IEEE 754 round-to-nearest mode. If the magnitude is too large to represent, the operation overflows and the result is then an infinity of appropriate sign.

Режим округления до ближайшего стандарта IEEE-754 указывает, что(IEEE-754 2008 §4.3.1 "Rounding-direction attributes to nearest")

In the following two rounding-direction attributes, an infinitely precise result with magnitude at least bemax ( b − ½ b1-p ) shall round to ∞ with no change in sign; here emax and p are determined by the destination format (see 3.3). With:

roundTiesToEven, the floating-point number nearest to the infinitely precise result shall be delivered; if the two nearest floating-point numbers bracketing an unrepresentable infinitely precise result are equally near, the one with an even least significant digit shall be delivered roundTiesToAway, the floating-point number nearest to the infinitely precise result shall be delivered; if the two nearest floating-point numbers bracketing an unrepresentable infinitely precise result are equally near, the one with larger magnitude shall be delivered.

ECMAScript не указывает, какой из округлений до ближайшего, но здесь это не имеет значения, поскольку оба дают одинаковый результат. Число в ECMAScript равно «double», в котором

b = 2 emax = 1023 p = 53,

поэтому результат должен быть не менее 21024 - 2970 ~ 1.7976931348623158 & # XD7; 10308 чтобы округлить до бесконечности. В противном случае он просто округляется до MAX_VALUE, потому что этоis ближе, чем бесконечность.

Обратите внимание, что MAX_VALUE = 21024 - 2971так что нужно добавить как минимум 2971 - 2970 = 2970 ~ 9.979202 & # xD7; 10291 чтобы получить бесконечность. Мы могли бы проверить:

>>> Number.MAX_VALUE + 9.979201e291
1.7976931348623157e+308
>>> Number.MAX_VALUE + 9.979202e291
Infinity

Между тем, вашMath.pow(100,1000) ~ 26643.9 далеко за 21024 - 2970, Этоis уже бесконечность.

 31 мая 2012 г., 22:48
Так что до ближайшегоdoes войти в это? Я чувствую себя глупо, удаляя мой ответ сейчас. ;-)
 01 июн. 2012 г., 07:37
 Mark31 мая 2012 г., 20:55
Отличное объяснение прямо из IEEE-754! Мне нужно найти время для чтения этой спецификации ... может быть, когда у меня проблемы с засыпанием.
 31 мая 2012 г., 21:13
@Mark: я считаю, что стандарт IEEE 754 короткий и дружелюбный, поскольку стандарты идут. Для борьбы с серьезной бессонницей я рекомендую вместо этого прочитать стандарт Unicode. :-)
 31 мая 2012 г., 22:47
Что с вещью sub / sup? Ухудшает читаемость

Если вы посмотрите наNumber.MAX_VALUE.toString(2)вы увидите, что двоичное представлениеMAX_VALUE 53 единицы, за которыми следуют 971 ноль. Это потому, что IEEE 754 с плавающей запятой сделаны изmantissa коэффициент умножается на степень 2 (так что другая половина числа с плавающей запятой являетсяexponent). СMAX_VALUEи мантисса, и показатель степени максимальны, так что вы видите множество из них, сдвинутых немного вверх.

Короче нужно увеличитьMAX_VALUE достаточно, чтобы действительно повлиять на мантиссу, иначе ваша дополнительная ценность будет потеряна и округлена.

Math.pow(2, 969) самая низкая степень 2, которая не будет опрокидыватьсяMAX_VALUE вInfinity.

 31 мая 2012 г., 19:16
Спасибо! (Чтобы уточнить для будущих зрителей, @ T.J. Сравнивал его собственный (теперь удаленный) ответ, а не новый ответ Кенни, что весьма неплохо.)
 31 мая 2012 г., 18:54
+1, просто указывал на это и в моей. На самом деле, я думаю, что это лучший ответ на сегодняшний день.
 Mark31 мая 2012 г., 20:49
+1 за точную оценку, которая "подсказывает"MAX_VALUE вInfinity.

Ваш ответ на вопрос