См. также лекцию 4
Восьмибитное представление с плавающей запятой
Для простоты, введем восьмибитное представление с плавающей запятой. Отведем под порядок 4 бита, под дробную часть мантиссы 3 бита и один бит под знак
\[\underbrace{0}_s\underbrace{0111}_q\underbrace{000}_{m}\]
Сдвиг порядка \(b = 2^{4-1}-1 = 7\).
Тогда, верны следующие сопоставления:
Код | Число |
---|---|
01111000 | +∞ |
11111000 | -∞ |
01111001 | NaN |
11111001 | NaN |
11111011 | NaN |
00000000 | +0 |
10000000 | -0 |
00111000 | 1 |
10111000 | -1 |
Пример:
Дано представление \(10101001\). Что это за число?
\(s=1\), следовательно, это отрицательное число.
\(q' = 0101\), не равно \(000\) или \(111\), следовательно, нормализованное число с порядком \(0101_2 - 7_{10} = 5-7 = -2\).
Поскольку это нормализованное число, мантисса имеет целую часть \(1\) и дробную часть \(m\).
Итого, \[- 1.001_2 \cdot 2^{-2} = - \left(1+\frac{1}{8}\right)\frac{1}{4}= -0.28125\]
Умножение/деление
При умножении, знаки складываются без переноса (по модулю 2), порядки складываются, а мантиссы перемножаются.
Важно заметить, что складываются истинные значения порядков, а не их беззнаковые представления со сдвигом.
Можно переводить беззнаковые представления со сдвигом в знаковые представления, прибавляя 1 и инвертируя старший разряд (так обычно и работают арифметические устройства компьютеров).
Например:
Умножим два числа:
s | q₃ | q₂ | q₁ | q₀ | m₂ | m₁ | m₀ | |
---|---|---|---|---|---|---|---|---|
a | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 0 |
b | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 1 |
Несложно заметить, что \(a = \frac{3}{4}\), \(b = \frac{13}{128}\)
Надо найти \(r=a\cdot b\).
Знаки складываются, \(s_r = 0\)
Преобразуем порядки к знаковому представлению и сложим их:
\(\tilde q_a\) | 1 | 1 | 1 | 1 |
\(\tilde q_b\) | 1 | 1 | 0 | 0 |
\(\tilde q_r\) | 1 | 0 | 1 | 1 |
Преобразуем результат обратно к беззнаковому представлению со сдвигом:
\(q_r\) | 0 | 0 | 1 | 0 |
Теперь умножаем мантиссы, учитывая “неявный” бит целой части:
(m₃) | m₂ | m₁ | m₀ | |
---|---|---|---|---|
(1) | 1 | 0 | 0 | |
× | (1) | 1 | 0 | 1 |
(m₃) | m₂ | m₁ | m₀ | ||||
---|---|---|---|---|---|---|---|
(1) | 1 | 0 | 1 | ||||
+ | (1) | 1 | 0 | 1 | |||
+ | (0) | 0 | 0 | 0 | |||
+ | (0) | 0 | 0 | 0 |
(m₃) | m₂ | m₁ | m₀ | ||||
---|---|---|---|---|---|---|---|
1 | 0 | 0 | 1 | 1 | 1 |
Поскольку целая часть получается больше 1, нормализуем. Для этого, смещаем всю конструкцию вправо, при этом увеличивая порядок результата на 1 за разряд:
\(q_r\) | 0 | 0 | 1 | 1 |
(m₃) | m₂ | m₁ | m₀ | ||||
---|---|---|---|---|---|---|---|
1 | 0 | 0 | 1 | 1 | 1 |
Округляем:
(m₃) | m₂ | m₁ | m₀ | |
---|---|---|---|---|
1 | 0 | 1 | 0 |
Собираем все вместе:
s | q₃ | q₂ | q₁ | q₀ | m₂ | m₁ | m₀ | |
---|---|---|---|---|---|---|---|---|
r | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 0 |
\(r = 2^{-4} (1+1/4) = \frac{5}{64} = 0.078125\)
Точное значение \(a\cdot b = \frac{39}{512} = 0.076171875\)
Другой способ. Явно запишем \(a\), \(b\) в нормализованном виде:
s | q₃ | q₂ | q₁ | q₀ | m₂ | m₁ | m₀ | |
---|---|---|---|---|---|---|---|---|
a | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 0 |
b | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 1 |
\[ a = 1,100_2 \cdot 2^{0110_2 - 7} = 1,100_2 \cdot 2^{-1}\] \[ b = 1,101_2 \cdot 2^{0011_2 - 7} = 1,101_2 \cdot 2^{-4} \]
\[ a \cdot b = 1,100_2 \cdot 2^{-1} \cdot 1,101_2 \cdot 2^{-4}\] \[ a \cdot b = 1,100_2 \cdot 1,101_2 \cdot 2^{-4-1}\]
Умножаем мантиссы: \[ 1,101_2 \cdot 1,100_2 = 1,101_2 + 0,1101_2 = 10,0111_2 \]
\[ a \cdot b = 10,0111_2 \cdot 2^{-5}\]
Нормализуем:
\[ a \cdot b = 1,00111_2 \cdot 2^{-4}\]
Округляем:
\[ a \cdot b = 1,010_2 \cdot 2^{-4}\]
Записываем в виде двоичного кода:
\[s=0,\, q'=-4+7=3,\]
s | q₃ | q₂ | q₁ | q₀ | m₂ | m₁ | m₀ | |
---|---|---|---|---|---|---|---|---|
r | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 0 |
Разделим два числа:
s | q₃ | q₂ | q₁ | q₀ | m₂ | m₁ | m₀ | |
---|---|---|---|---|---|---|---|---|
a | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 0 |
b | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 |
Несложно заметить, что \(a = \frac{3}{4}\), \(b = \frac{1}{16}\)
Надо найти \(r=\frac{a}{b}\).
Знаки складываются, \(s_r = 0\)
Преобразуем порядки к знаковому представлению и вычтем их:
\(\tilde q_a\) | 1 | 1 | 1 | 1 |
\(\tilde q_b\) | 1 | 1 | 0 | 0 |
\(-\tilde q_b\) | 0 | 1 | 0 | 0 |
\(\tilde q_r\) | 0 | 0 | 1 | 1 |
Преобразуем результат обратно к беззнаковому представлению со сдвигом:
\(q_r\) | 1 | 0 | 1 | 0 |
Теперь делим мантиссы, учитывая “неявный” бит целой части:
(m₃) | m₂ | m₁ | m₀ | |
---|---|---|---|---|
(1) | 1 | 0 | 0 | |
÷ | (1) | 0 | 0 | 0 |
r | (1) | 1 | 0 | 0 |
Собираем все вместе:
s | q₃ | q₂ | q₁ | q₀ | m₂ | m₁ | m₀ | |
---|---|---|---|---|---|---|---|---|
r | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 0 |
\(r = 2^{3} (1+1/2) = 12\)
Точное значение \(\frac{a}{b} = \frac{3\cdot 16}{4} = 3\cdot 4 = 12\)