Представление двойных чисел - PullRequest
0 голосов
/ 18 апреля 2019

В 8-битном представлении мы знаем, что число 4 хранится как 00000100, а число -4 сохраняется как 11111100. Но как число 4.6 сохраняется в double?

1 Ответ

0 голосов
/ 18 апреля 2019

Примечание: вопрос может быть более конкретным о том, хотите ли вы знать, какой формат использует конкретный язык программирования или система для представления значений типа double.Это поможет мне сузить мой ответ и отбросить нерелевантные сегменты.

При этом, вот мой ответ:

Формат, который вы описываете для представления 4 и -4называется два дополнения.Это позволяет биту высшего порядка представлять знак, что означает, что отрицательные и положительные числа могут быть представлены битами, которые составляют представление числа.

Числа с плавающей запятой обычно хранятся в IEEE-Формат 754, отдельный от формата целых чисел и других «целых» чисел.

Формат по существу разделяет двоичное представление на три сегмента: знак, экспонента и дробь.

Знак - бит, представляющий либо положительный (0), либо отрицательный (1).Два других различаются по размеру, но это очень похоже на научную запись, если вы знакомы с этой системой.

Давайте предположим, что мы решили использовать 32 бита для представления дробного числа.Один бит зарезервирован для знака, поэтому у нас есть 31 бит для хранения фактического значения числа.

0 00000000 00000000000000000000000 Sign Exponent Fraction

Для показателя степени нам нужны как положительные, так и отрицательные показателипредставлять действительно большие и действительно маленькие числа.Стандарт IEEE-754 мог бы использовать знакомую систему, которую вы описываете, для хранения этих показателей, но они выбрали другую систему.Вместо этого мы определяем смещение , которое составляет 2 (количество битов в сегменте экспоненты - 1) -1.Если мы используем 8 бит для сегмента экспоненты, как в моем примере, смещение составляет 2 7 -1 или 127.

Показатели всех 1 и всех 0 равныоба защищены.Поэтому самые высокие и самые низкие показатели, которые мы можем представить с помощью этой системы, равны -126 и 127 соответственно.

Допустим, вы хотите представить 1,4 ^ 2.2. Ваш показатель степени.
Наше смещение равно 127, поэтому вы сохраняете показатель степени как 2 + 127 или 129.

Теперь для дроби.Дробная составляющая числа должна быть строго больше или равна 0 и меньше 1. Придерживайтесь меня здесь, но рассмотрим десятичные числа и то, как они работают.

1.2 = 1 + 2 /10 = 1 * 10 0 + 2 * 10 -1
0,0147 = 0/10 + 1/100 + 4/1000 + 7/10000 = 0 * 10 -1 + 1 * 10 -2 + 4 * 10 -3 + 7 * 10 -4

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

Теперь рассмотрим это число:
0.01101
Оно записано в представлении, называемом «двоичная дробь».Во многом так же, как и раньше, это число можно записать в виде суммы, в которой знаменатель имеет последовательно более высокие степени 2, основание, когда мы удаляемся от точки:

0.01101 = 0 /2 + 1/4 + 1/8 + 0/16 + 1/32 = 0 * 2 -1 + 1 * 2 -2 + 1 * 2 -3 + 0 * 2 -4 + 1 * 2 -5

Теперь, когда я описал, как работают двоичные числа точек, давайте использовать ихв нашем представлении чисел с плавающей точкой.

Дробный сегмент представления будет любым значением, которое вы хотите представить, в виде двоичной дроби, сдвинутой в диапазон [0,1).

Пример:
34,25 (= 3 * 10 1 + 4 * 10 0 + 2 * 10 -1 + 5 *10 -2 = 3 * 10 + 4 * 1 + 2/10 + 5/100 = 137/4)
Преобразовать в двоичную точку:
100010.01 (= 1 * 2 5 + 0 * 2 4 + 0 * 2 3 + 0 * 2 2 + 1 * 2 1 + 0* 2 0 + 0 * 2 -1 + 1 * 2 -2 =32 + 4 + 1/4 = 137/4)
Смещение в диапазон [0,1):
1.0001001 * 2 5
Это число, которое будет храниться в нашемФормат с плавающей запятой.

знак: 0 (для положительного)
Экспонента: 5 + смещение, 127 = 132 = 10000100
Фракция: 1.0001001 - 1 = .0001001 (удалить точку, добавить конечные нули для заполнения сегмента) = 00010010000000000000000

Итак, наше полное представление с плавающей запятой для 34.25 выглядит следующим образом:
0 10000100 00010010000000000000000
без пробелов:
01000010000010010000000000000000

Итак, чтобы извлечь наше значение,выполните следующую операцию:
(-1) знак * (1 + дробь) * 2 показатель степени - смещение

Преимущество этого представлениязаключается в том, что такие вещи, как бесконечность и NaN («не число»), могут быть представлены также через эти зарезервированные показатели.

Более подробную информацию можно найти, изучив стандарт IEEE-754.

Реальность такова, что вы можете хранить ее так, как вам нравится, потому что биты означают только то, что вы решили для них значить для ваших программ.Но стандартным способом их хранения является стандарт IEEE-754.

Недостатками стандартного представления являются:1. Представление с потерями2. Арифметическая неточность3. Эффективно делит представимый экспоненциальный диапазон пополам со знаковым битом, другие типы избегают этого, имея версии со знаком и без знака)

Так что не всегда желательно использовать стандартные двоичные представления.

...