Арифметические операции с вещественными числами.

См. также лекцию 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\)