Данная статья является продолжением предыдущей статьи на тему детального разбора числового типа данных float и посвящена детальному разбору числового типа данных double.
Что такое тип данных в программировании?
Тип данных это метод хранения блока битов в определённом порядке и по определённым алгоритмам (правилам), чтобы при декодировании битов можно было получить достоверные данные.
Существует две группы типов данных:
Примитивные
Структурированные
Примитивные типы данных делятся на целочисленные, вещественные, символьные, строковые, логические.
Структурированные типы данных устроены гораздо сложнее, они основаны на применении примитивных или других структурированных типов данных, делятся на массивы, классы, словари, структуры.
Числовой тип данных с плавающей точкой
Числовой тип данных с плавающей точкой это метод хранения чисел, содержащих дробь. Поскольку числовые типы используют ограниченное количество бит, то это является и ограничением для всевозможного количества вариантов хранения бит — невозможность хранения всех вещественных (действительных) чисел, существующих в математике. Количество вариантов хранения измеряется, как , где
— занимаемый размер в битах.
Числовые типы данных с плавающей точкой состоят из трёх частей:
Знак (направление)
Порядок (экспонента)
Мантисса (дробная часть)
Знак показывает направление числа (вектора) на оси.
Экспонента регулирует положение числа на логарифмической шкале с одинаковыми единичными делениями, равными отношению 2:1, другими словами, это масштаб числа.
Мантисса выполняет роль бинарного приближения дроби от числа. Без неё вещественное число будет представляться, как округлённое к числу, выраженному степени двойки с целым показателем (правильное масштабирование), что довольно приблизительно и неточно.
Тип данных double
Рассмотрим тип данных double стандарта IEEE 754.
Он занимает 64 бита (8 байт), из которых на знак уходит 1 бит, на порядок 11 бит, а на мантиссу 52 бита.
У этого типа данных довольно широкий экспоненциальный диапазон и неплохая точность, позволяющая хранить до 15 точных десятичных знаков после запятой, что можно вычислить таким образом:.
Вручную переводим в формат double
Чтобы записать числовое значение в тип данных double, нужно провести некоторые манипуляции. Например, пусть число равно 381,5625 — нам нужно сохранить его в формате float. Поэтапно распишу действия.
Число -381,5625 можно бинарно со знаком минус разложить на слагаемые, а именно на 256, 64, 32, 16, 8, 4, 1, 1/2, 1/16, то есть
После этого мы выносим за скобки значение наибольшего члена бинарного разложения, а именно число 256:
После этого нужно представить каждое слагаемое бинарного разложения, кроме единицы, как дробь, где знаменатель это степень двойки, а числитель равен единице, получается следующее:
Вынесенное число 256 за скобки это бинарная экспонента с показателем, равным восьми (
), а следовательно
, но в битовой записи экспонента записывается по формуле: N+1023 или
, где N это значение экспоненты в битовой записи. Получается, что экспонента в битовой записи равна десятичному числу 1031 (
), а записывается, как
10000000111.Для записи мантиссы нужно взять значения показателей степеней двоек в знаменателях дробей слагаемых бинарного разложения и использовать их в качестве тех битов, на месте которых должны быть единицы, а на остальных нули, и получается такая запись:
0111110110010000000000000000000000000000000000000000(ноль-пять единиц-ноль-две единицы-два нуля-единица-сорок нулей = 52 знака).Поскольку число отрицательное, то значение знакового бита равно единице. Следовательно полная битовая запись числа -381,5625 в формате double такая:
1 10000000111 0111110110010000000000000000000000000000000000000000, и обычно запись не разделяется пробелами.
В принципе на объяснение этих манипуля��ий можно было привести несколько формул, но я специально привёл в пример поэтапный процесс кодирования, чтобы было понятно.
Нюансы хранения данных
Формула для получения десятичной формы бинарной записи экспоненты в типе double: или
, где число
это искомая десятичная форма бинарной записи, которую нужно перевести в двоичную форму, а число
есть изначальное значение экспоненты, которое должно быть не больше 1023 и не меньше -1022.
Помимо всего прочего числовые типы данных с плавающей точкой имеют преимущества над целочисленными типами данных, они могут хранить бесконечность или минус бесконечность, а также неопределённость.
Состояние числа "бесконечность" достигается в том случае, если запись экспоненты состоит строго из единиц, а запись мантиссы строго из нулей. Аналогично и с состоянием числа "минус бесконечность", только здесь знаковый бит равен единице.
Состояние числа "неопределённость" достигается в том случае, если запись экспоненты состоит строго из единиц, а запись мантиссы включает хотя бы одну единицу, и также, неважно чему равен знаковый бит.
Число 0 может быть в двух вариантах, а именно: положительный и отрицательный. На практике это почти одно и то же число, но в битовой записи отличаются состоянием знакового бита.
Крайности числового типа данных double
Наибольшее неравное бесконечности положительное значение я обозначу буквой T от слова top (высь, верхний край). Чтобы получить такое числовое значение, нужно набрать предпоследнее бинарное значение, чья запись это 11111111110, что в два раза меньше условной бесконечности, а также нужно заполнить всю мантиссу единицами 1111111111111111111111111111111111111111111111111111, и тогда получается такое число:
Наименьшее неравное нулю положительное значение я обозначу буквой B от слова bottom (дно, низ). Для получения такого числового значения, нужно заполнить экспоненту нулями, а в мантисса записать только одну единицу и к тому же в самом конце. Наименьшее по модулю число записывается, как 0/1 00000000000 0000000000000000000000000000000000000000000000000000, равно
.
Также есть ньюанс, что если значение экспоненты равно -1022, то её битовая запись может быть в двух состояниях: 00000000001 и 00000000000, но сравнивая два этих состояния, мантисса в них также отличается своим поведением.
Скрытый бит
В числовом типе данных double, как и в float, есть скрытый бит, отвечающий за целую часть мантиссы. Он равен единице в том случае, если экспонента в бинарной записи не представляется строго нулями. Скрытый бит представляется нулём тогда, когда бинарно экспонента записывается в виде череды нулей, но формально экспонента равна -1022, как и в случае, когда в её битовой записи записываются нули и только одна единица в конце. Когда экспонента становится строго нулями в своей бинарной записи, в мантиссе скрытый бит становится нулём, а знак до запятой переносится в видимую часть. Мантисса в этом случае становится числом, выраженным 52-знаковой бинарной дробью, делённой на , или наоборот, мантисса это целое 52-разрядное бинарное число, которое делится на
.
Числовой тип данных double в звуке
Этот тип данных может применяться в качестве метода хранения аудиоданных, как формат кодирования сэмплов аудиофайлов. За счёт чрезвычайно большого числового диапазона сэмпл, чей тип данных это double, может иметь экстремальные значения амплитуды и следовательно громкости, в чём заключается преимущество над целочисленными типами данных, которые также могут использоваться для кодирования аудиофайлов, но у них есть резкий амплитудный пол и потолок на уровнях -1 и ~+1.
Чтобы вычислить динамический диапазон чисел типа данных double в децибелах, нужно найти 20-кратную величину десятичного логарифма отношения наибольшего значения к наименьшему, а где наибольшее значение или наибольший величиннный предел это T (top), а наименьшее значение или же наименьший величиннный предел это B (bottom). Значит динамический диапазон типа данных double равен
В общем
Тип данных double (float и другие варианты кодирования с плавающей точкой) это по истине крутое изобретение в мире информационных технологий, позволяющее хранить что-то грандиозное при незначительных затратах памяти.
Мой вопрос для читателей
Существует ли такой метод типа данных с плавающей точкой, который занимает не очень много памяти, но способен хранить числа, равные башням из степеней (тетрации)?
