Alterna · учебный материал
10.1 Как записать число конечным числом битов
У компьютера нет бесконечного количества цифр. Число записывается знаком, масштабом и значащими разрядами; некоторые значения придётся округлить.
Что в этом материале
- Конечные биты вместо произвольной точности
Содержание и основные понятия
Сеть состоит из массивов чисел и сумм произведений.
У компьютера нет бесконечного количества цифр. Число записывается знаком, масштабом и значащими разрядами; некоторые значения придётся округлить.
Числа имеют конечную точность; их нужно хранить и переносить. Матричные блоки дают много независимой работы, но память и организация групп также влияют на результат.
Для изменения рисунка включитеJavaScript; расчёт и теория доступны далее.
Конечные биты вместо произвольной точности
Вещественное число из формулы и его машинное представление — разные объекты. В двоичном floating point хранятся sign s, поле exponent E и целая fraction F. Для нормального числа с f дробными битами и смещением bias:
x
=
(
−
1
)
s
(
1
+
F
2
f
)
2
E
−
b
i
a
s
.
x=(-1)^s\left(1+\frac{F}{2^f}\right)2^{E-\mathrm{bias}}.
x
=
(
−
1
)
s
(
1
+
2
f
F
)
2
E
−
bias
.
У FP32 поля имеют размеры1/8/23, bias127. В −192=−1.5×2⁷ получаем s=1,E=134,F=2²². Начальная единица нормальной significand не хранится отдельно. Источник H01 описывает поля и правила округления.
При E=0 правила другие: subnormal равен (−1)^s(F/2^f)2^(1−bias), без скрытой единицы. При F=0 это signed zero. Максимальное E зарезервировано для infinity и NaN: у infinity fraction0, у NaN она ненулевая. Поэтому «все битовые строки — обычные числа» неверно.
Эксперимент.
Введите−192, затем−0, затем переключите формат. Отдельный редактор битов позволяет изменить sign/exponent/fraction и увидеть декодирование. Special values отображаются с объяснением; NaN не выдаётся за корректный результат последующего вычисления.
Граница.
Вход сначала становится JavaScript Number (binary64). Codec округляет именно это значение в выбранный формат, а не точное произвольное десятичное рациональное число. Например,.1 уже не точно представимо вbinary64. Подпись формата не превращает все вычисления страницы вFP16.
import struct
bits=struct.unpack('>I',struct.pack('>f',-192.0))[0]
assert bits>>31==1
assert (bits>>23)&255==134
assert bits&((1<<23)-1)==1<<22
Код повторяет только что разобранные операции.
Полный проверяемыйPython-пример главы
доступен отдельным файлом; показанный короткий фрагмент не заменяет его реализацию.
При encoded exponent0 используется другое правило без скрытой1.
Размер записи и точность. Как этот вопрос продолжает полученный результат?
Python-примеры главы 10
Академическая база →