ru.javascript.info icon indicating copy to clipboard operation
ru.javascript.info copied to clipboard

Several fixes for number type

Open chilipenko opened this issue 3 years ago • 0 comments

Комментарии к существующему на данный момент тексту статей и предлагаемым изменениям.

В главе "Типы данных":

В JavaScript тип "number" не может содержать числа больше, чем (2^53 - 1) (т. е. 9007199254740991), или меньше, чем -(2^53 - 1) для отрицательных чисел.

Number в JS может хранить значения вплоть до Number.MAX_VALUE (1.7976931348623157 * 10^308). Но за пределами безопасного диапазона ±(2^53 - 1) (то есть от Number.MIN_SAFE_INTEGER до Number.MAX_SAFE_INTEGER) многие (но далеко не все) из чисел уже не могут быть представлены средствами этого типа. Например, 2^53 + 2 и 2^53 + 4 с помощью типа Number хранятся без проблем, а вот 2^53 + 1 и 2^53 + 3 уже хранить не получится. Поэтому вместо "не может содержать" лучше сказать "не может безопасно содержать" с соответствующим пояснением.

В главе "Числа":

BigInt числа дают возможность работать с целыми числами произвольной длины. Они нужны достаточно редко и используются в случаях, когда необходимо работать со значениями более чем 2^53 или менее чем -2^53.

Согласно спецификации (https://tc39.es/ecma262/#sec-number.issafeinteger) безопасный диапазон для типа Number находится в пределах ±(2^53 - 1). Технически значения 2^53 и -2^53 тоже существуют в Number, но они уже не считаются безопасными, так как для них не выполняется условие однозначно представления как самого числа, так и следующего за ним (это опять же прописано в спецификации: https://tc39.es/ecma262/#sec-number.max_safe_integer). У типа Number условие 2^53 === 2^53 + 1 будет истинным, а значит 2^53 безопасным не является. Поэтому лучше говорить, что BigInt нужен для тех случаев, когда приходится работать за пределами диапазона ±(2^53 - 1), а не ±2^53 .

Внутри JavaScript число представлено в виде 64-битного формата IEEE-754. Для хранения числа используется 64 бита: 52 из них используется для хранения цифр, 11 из них для хранения положения десятичной точки (если число целое, то хранится 0), и один бит отведён на хранение знака.

Если речь идет о внутреннем представлении, то в экспоненте (порядке) хранится 0 только лишь для двух чисел: +0 и -0. Для всех остальных случаев там хранится значение отличное от нуля. Это происходит по двум причинам: так как числа хранятся в нормализованной форме и так как экспонента хранится в формате со смещением экспоненты (biased exponent). В итоге даже для тех чисел, для которых экспонента равна нулю, в соответствующих 11 битах будет храниться не 0, а 1023 (0 плюс смещение 1023). Поэтому лучше фразу "если число целое, то хранится 0" убрать.

chilipenko avatar Jul 05 '22 10:07 chilipenko