Показать сообщение отдельно
  #7 (permalink)  
Старый 23.02.2011, 15:19
Аватар для Amphiluke
   ☽
Отправить личное сообщение для Amphiluke Посмотреть профиль Найти все сообщения от Amphiluke
 
Регистрация: 07.01.2011
Сообщений: 254

Вообще-то, зная формат представления вещественных чисел в памяти, можно получить максимальное и минимальное значения типа Number без привлечения Javascript-программы.
Например, мы знаем, что в памяти под число вещественного типа комп отводит 8 байт, из которых 52 бита занимает мантисса, 11 бит — экспонента и один знаковый бит. В этом случае максимальное значение вещественного числа в двоичной нотации должно выглядеть так:

01111111 11101111 11111111 11111111 11111111 11111111 11111111 11111111

Последний, старший разряд (выделен голубым) равен 0, т.е. число положительное. 11 бит экспоненты выделены красным, а мантисса — зеленым. Взять все единицы в экспоненте нельзя, т.к. такое значение экспоненты зарезервировано под значения Infinity или NaN. Поэтому младший разряд оставлен нулевым. Чтобы получить истинное значение мантиссы, к ней нужно добавить единицу с разделительной точкой, т.е. в этом примере мантисса реально равна числу в двоичной записи

1.1111 11111111 11111111 11111111 11111111 11111111 11111111

В десятичной записи это число практически равно двойке, а точнее можно вычислить при помощи формулы для суммы n=52 членов геометрической прогрессии со знаменателем 0.5. Наше двоичное число в переводе в десятичную систему равно

1 + 1/2 + 1/4 + 1/8 + 1/16 + ... + 1/2^52 = 1 + 0.5 · (0.5^52 - 1)/(0.5 - 1) = 1.99999999999999977795539507496869...

Мантиссу нашли, теперь ее надо умножить на экспоненту. При расчете экспоненты за ноль принимается число 1023. Наша экспонента в двоичной записи равна 11111111110, что в десятичной эквивалентно числу 2046. Поскольку за ноль принято 1023, то реально экспонента равна 2046-1023=1023. Тогда значение, на которое нужно умножить мантиссу равно 2^1023 = 8.9884656743115795386465259539451e+307. В результате максимальное допустимое типом Number число равно

1.99999999999999977795539507496869 · 8.9884656743115795386465259539451e+307 = 1.7976931348623157081452742373164e+308

Далее в спецификации или опытным путем находим, какое максимально возможное количество значащих цифр поддерживает язык при выводе на экран. Пусть это будет 21. Соответственно урезаем найденное максимально возможное число до 22-23 значащих цифр, дописываем в конец оставшиеся нолики и говорим, что получена запись максимального значения с максимально допустимой языком точностью.

17976931348623157081450000000000000000000000000000 00000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000 000000000

Поправьте, если ошибся.
Ответить с цитированием