В чем разница между 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, представлены как бесконечность.