Данная статья является продолжением предыдущей статьи на тему детального разбора числового типа данных float и посвящена детальному разбору числового типа данных double.

Что такое тип данных в программировании?

Тип данных это метод хранения блока битов в определённом порядке и по определённым алгоритмам (правилам), чтобы при декодировании битов можно было получить достоверные данные.

Существует две группы типов данных:

  1. Примитивные

  2. Структурированные

Примитивные типы данных делятся на целочисленные, вещественные, символьный, строковый, логический.

Структурированные типы данных устроены гораздо сложнее, они основаны на применении примитивных или других структурированных типов данных, делятся на массивы, классы, словари, структуры.

Вещественный тип данных это тип данных с плавающей точкой, способный хранить вещественное числовое значение, то есть содержащее дробь (в данном контексте). Поскольку числовые типы используют ограниченное количество бит, то это является и ограничением для всевозможного количества вариантов хранения бит — невозможность хранения всех вещественных (действительных) чисел, существующих в математике. Количество состояний измеряется, как бинарная экспонента с показателем, равным размеру в битах.

Числовые типы данных с плавающей точкой состоят из трёх частей:

  1. Знак (направление)

  2. Порядок (мантисса)

  3. Мантисса (дробная часть)

Благодаря экспоненте число может быть чрезмерно большим или наоборот микроскопическим, что действительно подтверждается в типе данных double. Мантисса играет роль бинарного аппроксимирования дроби, без неё вещественное число будет представляться, как округлённое к бинарной экспоненте с каким-нибудь целым показателем, что очень грубо. Знак показывает направление числа (вектора) на оси. Помимо всего прочего числовые типы данных с плавающей точкой имеют преимущества над целочисленными типами данных, они могут хранить бесконечность или минус бесконечность, а также неопределённость.

Рассмотрим тип данных double стандарта IEEE 754, который весит 64 бита. На знак уходит 1 бит, на порядок 11 бит, а на мантиссу аж 52. У такого типа данных довольно широкий экспоненциальный диапазон и неплохая точность, позволяющая хранить до 15 точных десятичных знаков после запятой, что можно вычислить таким образом:15 = \text{floor}(52\log_{10}2). Чтобы записать числовое значение в тип данных double, нужно провести некоторые манипуляции.

Например, пусть число равно 381,5625 — нам нужно сохранить его в формате float. Поэтапно распишу действия.

Число -381,5625 можно бинарно со знаком минус разложить на слагаемые, а именно на 256, 64, 32, 16, 8, 4, 1, 1/2, 1/16, то есть

-381.5625 = -(256+64+32+16+8+4+1+\frac{1}{2}+\frac{1}{16})

После этого мы выносим за скобки значение наибольшего члена бинарного разложения, а именно число 256:

-381.5625 = -256(1+\frac{1}{4}+\frac{1}{8}+\frac{1}{16}+\frac{1}{32}+\frac{1}{64}+\frac{1}{256}+\frac{1}{512}+\frac{1}{4096})

После этого нужно представить каждое слагаемое бинарного разложения, кроме единицы, как дробь, где знаменатель это степень двойки, а числитель равен единице, получается следующее

-381.5625 = -256(1+\frac{1}{2^{2}}+\frac{1}{2^{3}}+\frac{1}{2^{4}}+\frac{1}{2^{5}}+\frac{1}{2^{6}}+\frac{1}{2^{8}}+\frac{1}{2^{9}}+\frac{1}{2^{12}})

Вынесенное число 256 за скобки это бинарная экспонента с показателем, равным восьми (256=2^{8}), но в битовой записи экспонента записывается по формуле: N+1023 или N+2^{11-1}-1, где N это значение экспоненты в битовой записи; получается, что экспонента в битовой записи равна десятичному числу 1031 (1031 = 8+1023), а записывается, как 10000000111.

Для записи мантиссы нужно взять значения показателей степеней двоек в знаменателях дробей слагаемых бинарного разложения и использовать их в качестве тех битов, на месте которых должны быть единицы, а на остальных нули, и получается такая запись: 0111110110010000000000000000000000000000000000000000 (ноль-пять единиц-ноль-две единицы-два нуля-единица-сорок нулей = 52 знака).

Поскольку число отрицательное, то значение знакового бита равно единице. Следовательно полная битовая запись числа -381,5625 в формате double такая: 1 10000000111 0111110110010000000000000000000000000000000000000000, и обычно запись не разделяется пробелами.

В принципе на объяснение этих манипуляций можно было привести несколько формул, но я специально привёл в пример поэтапный процесс кодирования, чтобы было понятно.

Формула для получения десятичной формы бинарной записи экспоненты в типе double: D = B+1023 или D=B+2^{11-1}-1, где число D это искомая десятичная форма бинарной записи, которую нужно перевести в двоичную форму, а число B есть изначальное значение экспоненты, которое должно быть не больше 1023 и не меньше -1022.

Расскажу про нюансы хранения чисел подробнее.

Состояние числа "бесконечность" достигается в том случае, если запись экспоненты состоит строго из единиц, а запись мантиссы строго из нулей. Аналогично и с состоянием числа "минус бесконечность", только здесь знаковый бит равен единице.

Состояние числа "неопределённость" достигается в том случае, если запись экспоненты состоит строго из единиц, а запись мантиссы включает хотя бы одну единицу, и также, неважно чему равен знаковый бит.

Число 0 может быть в двух вариантах, а именно: положительный и отрицательный. На практике это почти одно и то же число, но в битовой записи отличаются состоянием знакового бита.

Также расскажу про диапазон значений типа данных double.

Если использовать предельную (не доходящую до бесконечности) экспоненту 1023, то её битовая запись это 11111111110, что в два раза меньше условной бесконечности, где само число равно 2^{1023}, а чтобы достигнуть максимального по модулю числового значения, нужно заполнить всю мантиссу единицами 0/1 11111111110 1111111111111111111111111111111111111111111111111111, и тогда получается такое число:

\pm2^{2^{11}-1}(2-2^{-52}) = \pm2^{1023}(2-2^{-52}) = \pm2^{1023}\sum_{n=0}^{52}{\frac{1}{2^{n}}\approx\pm2^{1024}}

Для получения наименьшего по модулю числового значения, нужно заполнить экспоненту нулями, а в мантисса записать только одну единицу и к тому же в самом конце. Наименьшее по модулю число записывается, как 0/1 00000000000 0000000000000000000000000000000000000000000000000000, равно

\pm\frac{2^{-2^{11-1}+2}}{2^{52}}=\pm\frac{2^{-1022}}{2^{52}} = \pm2^{-1074}.

Почему экспонента равна числу -1022, если её битовая запись равна нулю, возможно скажете вы, потому что по формуле 0-1023 = -1023, а не -1022. Ньюанс в том, что если значение экспоненты равно -1022, то её битовая запись может быть в двух состояниях: 00000000001 и 00000000000. А поскольку в мантиссе целая часть не записывается, она включена в неё изначально при условии, если битовая запись экспоненты не равна нулю. Но если битовая запись представляет из себя строго нули, то целая часть отбрасывается, становясь нулём, и заносится в мантиссу, при этом экспонента всё же равна -1022, а мантисса играет роль целого 52-битного числа, поделённого на 2^{1074}, или наоборот, мантисса играет роль бинарной 52-знаковой дроби без целой части, умноженной на число 2^{-1022}.

Также ситуация, когда экспонента равна 00000000010, в мантиссе целая часть ещё равна единице, но этого не видно, а когда экспонента равна 00000000001, то мантисса идущая после неё уже явно показывает, что эта единица, записанная в конце экспоненты, и является той самой целой частью мантиссы, похожа на то, что мантисса становится 53-битной, в то время как экспонента укорачивается до 10-битного блока.

Этот тип данных может применяться в музыке, как формат кодирования сэмплов аудиофайлов. За счёт чрезвычайно большого числового диапазона сэмпл может иметь экстремальные значения амплитуды и следовательно громкости, в чём заключается преимущество над целочисленными типами данных, которые также могут использоваться для кодирования аудиофайлов.

В общем

Тип данных double (float и другие варианты кодирования с плавающей точкой) это по истине крутое изобретение в мире информационных технологий, позволяющее хранить что-то грандиозное при незначительных затратах памяти.

Чтобы вычислить динамический диапазон чисел типа данных double в децибелах, нужно найти 20-кратную величину десятичного логарифма отношения наибольшего значения к наименьшему, а где наибольшее значение или наибольший величиннный предел это T (top), а наименьшее значение или же наименьший величиннный предел это B (bottom). Значит динамический диапазон типа данных double равен 20\cdot\log_{10}\left(\frac{T}{B}\right) = 20\cdot\log_{10}\left( \frac{ (2 - 2^{-52}) \cdot 2^{1023} }{ 2^{-1074} } \right) \approx 12631\text{ dB}

Мой вопрос для читателей

Существует ли такой метод типа данных с плавающей точкой, который занимает не очень много памяти, но способен хранить числа, равные башням из степеней (тетрации)?

Комментарии (5)


  1. foxweb
    18.11.2025 17:58

    Поистине крутое изобретение — это формат SVG, позволяющий без танцев с бубном вставлять любые формулы прямо в текст!


  1. Zenitchik
    18.11.2025 17:58

    Это клон предыдущей статьи, с изменёнными значениями пределов?


    1. Pentalogue Автор
      18.11.2025 17:58

      Да, я, основываясь на предыдущей статье, создал новую и проделал в ней небольшие исправления


  1. Olegun
    18.11.2025 17:58

    Мантисса склоняется.


  1. haqreu
    18.11.2025 17:58

    Количество состояний измеряется, как бинарная экспонента с показателем, равным размеру в битах.

    Количество комбинаций битов - это не количество представимых чисел.