В чем разница между JS Number.MAX_SAFE_INTEGER и MAX_VALUE?

Number.MAX_SAFE_INTEGER 9007199254740991

Number.MAX_VALUE 1.7976931348623157e + 308

Я понимаю, как MAX_SAFE_INTEGER вычисляется на основе арифметики с двойной точностью с двойной точностью, но откуда это огромное значение max? Это число, которое возникает, если вы используете все 63 бита для экспоненты вместо безопасных 11 бит?

Ответы

Ответ 1

Number.MAX_SAFE_INTEGER - наибольшее целое число, которое можно безопасно использовать в вычислениях.

Например, Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2 - true - любое целое число, большее, чем MAX_SAFE_INTEGER, не всегда может быть представлено в памяти точно. Все биты используются для представления цифр номера.

Number.MAX_VALUE, с другой стороны, является наибольшим числом, которое можно представить с использованием представления с плавающей запятой двойной точности. Вообще говоря, чем больше число, тем менее точным оно будет.

Дополнительная информация числа с плавающей запятой с двойной точностью в Википедии

Ответ 2

Номера JS являются внутренними 64-битными поплавками (IEEE 754-2008).

MAX_SAFE_INTEGER - это максимальное целое число, которое можно безопасно представить в этом формате, что означает, что все числа ниже этого значения (и выше MIN_SAFE_INTEGER) могут быть представлены как целые числа.

MAX_VALUE происходит от 2 ^ 1023 (11 бит мантиссы минус знак мантиссы), то есть около 10 ^ 308.

Это число, которое возникает, если вы используете все 63 бита для экспонента вместо безопасных 11 бит?

Мантисса (экспонента) всегда имеет 11 бит (не так), что достаточно до 10 ^ 308.

Ответ 3

Как вы знаете, у javascript есть тип Number, но не целое число. Целое число появляется с помощью функции ducktyping в javascript. Таким образом, Number.MAX_SAFE_INTEGER < Number.MAX_VALUE.

Они вместе с MIN_VALUE и MIN_SAFE_INTEGER устанавливают диапазон возможного значения Number для double и int, когда вы используете parseFloat(X) && & parseInt(X).

Ответ 4

MAX_VALUE находится в двойном (64 бит)
MAX_SAFE_INTEGER может использовать первый 53 бит двойной (64 бит)
в основном javascript не поддерживает долго. поэтому для int number его использование 32-битный целочисленный контейнер. и для чисел, больших 32 бит, сохраняется номер в двойном контейнере, в котором целая часть равна 53 бит, а остальные 11 бит - мантисса (сохраняйте информацию о числе с плавающей запятой).

Ответ 5

В основном числа с плавающей точкой представлены как:

digits * 2 ** movement
У

цифр 52 бита, у движения 11 битов, и оба вместе образуют 64-битное число (с 1 знаковым битом). Благодаря этому вы можете представлять все виды различных чисел, поскольку вы можете хранить очень большие числа (большое положительное движение), очень маленькие числа (большое отрицательное движение) и целые числа (цифры).

What is Number.MAX_SAFE_INTEGER?

Целые числа можно просто представить с движением, равным 0, тогда цифры содержат 52-битное число, которое может содержать до 2 ** 53 - 1 чисел (то есть Number.MAX_SAFE_INTEGER).

Теперь для больших чисел вы должны использовать перемещение, что в основном означает, что вы перемещаете цифры влево или вправо, и поэтому вы теряете точность.

(Представьте, что digits просто займет 8 бит)

  number     >     digits | movement > result
  // savely represented
  11111111   >  11111111  | 0        > 11111111
  // lost the last 1
  111111111  >  11111111  | 1        > 111111110
  // lost the two last 1s
  1111111111 >  11111111  | 10       > 1111111100

What is Number.MAX_VALUE?

Если вы установите все биты digits и все биты movement, вы получите число (2 ** 53 - 1), которое сдвигается на 2 ** 11 влево, и это самое большое число, которое можно сохранить в 64 немного, все, что больше, - Infinity.

Ответ 6

MAX_SAFE_INTEGER имеет значение 9007199254740991. Причина этого числа заключается в том, что JavaScript использует числа в формате с плавающей запятой двойной точности, как указано в IEEE 754. Он возвращает максимальное безопасное целочисленное значение, которое может быть представлено как 2 ^ 53 - 1.

Safe относится к способности точно представлять целые числа и правильно их сравнивать.

Например: Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2 будет оцениваться как true

MAX_VALUE, с другой стороны, имеет значение приблизительно 1.79E+308 или 2 ^ 1024. Значения, превышающие MAX_VALUE, представлены как бесконечность.