Количество бит в Javascript-номерах

Я работаю в Javascript только с целыми числами (в основном добавляя числа и меняя их). Интересно, насколько велики они могут быть без потери каких-либо бит.

Например, насколько велика X может быть такой, что 1 << X будет представлять 2^X?

Ответы

Ответ 1

Все числа в JavaScript на самом деле соответствуют стандарту IEEE-754 с плавающей запятой. Они имеют 53-битную мантиссу, что должно означать, что любое целочисленное значение с величиной приблизительно 9 квадриллионов или менее, а именно 9 007 199 254 740 991, будет представлено точно.


ВНИМАНИЕ: в 2018 году основные браузеры и NodeJS также работают с новым примитивным типом Javascript, BigInt, решая проблемы с целочисленным значением.

Ответ 2

Все числа в JavaScript являются 64-битными (с двойной точностью) числами с плавающей запятой.

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

Ответ 3

Все ответы частично неверны - возможно, из-за новых спецификаций ES6/ES7 - и готовы, почему:

Прежде всего, в JavaScript представление числа равно 2 ^ 53 - 1, что верно для ответа @Luke, мы можем доказать это, запустив Number.MAX_SAFE_INTEGER, который покажет большое число, затем мы выполняем log2 чтобы подтвердить, что количество бит одинаково:

Number.MAX_SAFE_INTEGER
9007199254740991

Math.log2(9007199254740991)
53

enter image description here

Однако побитовая операция рассчитана на 32 бита (4 байта), а это означает, что если вы превысите 32-битные смены, вы начнете терять биты.

Добро пожаловать в Javascript!