Арифметические операции над числами, представленными с плавающей запятой

В основе арифметических операций над числами с плавающей запятой лежат принципы, на которых базируются операции над числами с фиксированной запятой. При этом есть и некоторые особенности.

Будем условно считать, что порядки заданы в обратном коде, а мантиссы – в прямом.

Умножение:

X = 2mx * sign X. x1x2...xn

Y = 2my * sign Y. y1y2...yn

Z = X*Y = 2mx+my * sign Z. z1z2...zn

Порядок выполнения операции следующий:

1.  Знак произведения находится так же, как и при умножении чисел с фиксированной запятой:

Порядок произведения находится алгебраическим суммированием порядков мно­жимого и множителя.

3.  Мантисса находится по правилам умножения чисел с фиксированной запятой.

При этом возможны следующие случаи:

o  Мантисса произведения – ненормализованное число, так как

o  ½ |Mx| < 1,

o  ½ |My| < 1, то

o  ¼ |Mx*My| < 1, при ¼ |Mx*My| < ½

o  имеем ненормализованное число.

Поэтому необходима нормализация влево максимум только на один разряд.

С этой целью нужно сдвинуть мантиссу влево на один разряд. Это соответствует умножению числа на 21. Для того чтобы число не увеличилось в два раза, нужно из порядка вычесть единицу.

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

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

НЕ нашли? Не то? Что вы ищете?

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

Деление

В основном аналогично умножению:

X = 2mx * sign X. x1x2...xn

Y = 2my * sign Y. y1y2...yn

Z = X/Y = 2mx–my * sign Z. z1z2...zn

Порядок выполнения операции следующий:

Находится по известным правилам знак частного. Порядок частного находится как разность порядков делимого и делителя.

3.  Цифры частного находятся так:

вначале находится целая часть мантиссы, то есть |Mx| - |My| = 0

Если 0 0, то z0 = 1, если 0 < 0, то z0 = 0.

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

½ |Mx| < 1,

½ |My| < 1,

2-1 < |Mx / My| < 2

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

При делении, так же, как и при умножении, возможно получение кода машинного нуля и кода бесконечности.

Сложение и вычитание

Обе операции выполняются по сходным алгоритмам.

X = 2mx * sign X. x1x2...xn

Y = 2my * sign Y. y1y2...yn

Z = X ± Y = 2max(mx, my).sign Z. z1z2...zn

Операция выполняется следующим образом:

Находится разность порядков: mx – my = Δ Производится выравнивание порядков, при этом если разность порядков положительна, то в качестве порядка результата берётся mx, а мантисса My сдвигается вправо на |mx– my| разрядов; еcли разрядность порядков отрицательна, то денормализуется мантисса Mx. Производится алгебраическое суммирование мантисс слагаемых. Выполняется нормализация влево или вправо на соответствующее число разрядов с необходимым исправлением порядка.

Пример:

порядок мантисса

[mx]пк = 0.11 [Mx]пк = 0.1010

[my]пк = 0.10 [My]пк = 0.1110

Находим разность порядков:

+00.11 = [mx]мок

11.01 = [-my]мок

1| 00.00

|_ _1

00.01 = [Δ]мок - разность порядков

Так как m x > my, то:

+00.1010 = [Mx]мок

00.0111 = [My]мок * 2-1

[Z]мок = 01.0001 – переполнение

2-1 * [Z]мок = 00.1000 – нормализация

max(mx, my) = [mx]мок = +00.11

[1]мок = 00.01

[mx]мок = 01.00 – переполнение порядка

Z = ∞

При выполнении операции сложения возможны следующие специфические случаи, называемые блокировками:

а) При определении разности порядков может оказаться, что необходимо мантиссу одного из чисел сдвигать на величину, большую, чем число разрядов в разрядной сетке. В этом случае, естественно, такое число может быть воспринято как нуль, а операция дальнейшего сложения может блокироваться, то есть не выполняться.

В качестве результата берётся максимальное число.

Пример:

[mx]ок = 0.101 [Mx]ок = 0.10111101

[my]ок = 1.001 [My]ок = 0.10000001

Разность порядков:

+00.101 = [mx]мок

00.110 = [-my]мок

[Δ]мок = 01.011 – то есть это число 11 10 , а в разрядной сетке мантиссы только 8 разрядов.

Поэтому операция блокируется, а результатом является число:

[mx] = 0.101 [Mx] = 0.10111101

Аналогичный случай может быть, когда разность порядков – отрицательна (отрицательное переполнение). В этом случае операция также блокируется, а результатом будет число с максимальным порядком.

Пример:

[mx]ок = 1.010 [Mx]ок = 1.10101011

[my]ок = 0.110 [My]ок = 1.11111111

Разность порядков:

+ 11.010 = [mx]мок

11.001 = [-my]мок

_______

+1| 10.011

1

_______

10.100 = [Δ]мок

То есть разность порядков меньше (-8).

Операция блокируется, а результатом будет число:

[my]ок = 0.110 [My]ок = 1.11111111

Десятичные двоично-кодированные системы.

Иногда в ЭВМ используются десятичные системы счисления. Их выгодно использовать тогда, когда объем исходных данных для обработки на ЭВМ – велик, сама обработка производится по относительно несложным программам. На этом происходит значительная экономия времени, которая вытекает из того, что не нужно делать перевод из десятичной в двоичную систему и обратно.

Как правило, в состав оборудования таких ЭВМ вводится АУ, работающее с числами в десятичной системе счисления. Поскольку в качестве основного запоминающего элемента используется триггер-ячейка с двумя устойчивыми состояниями, то каждая десятичная цифра кодируется совокупностью двоичных символов.

Перевод чисел из десятичной системы в десятичную двоично-кодированную выполняется исключительно просто, поразрядно и одновременно по всей сетке:

879,65 10 1000 0111 1001, 0110 010110-2

Аналогично, выполняется и обратный перевод:

0110 1001, 0101 0011 10-2 69, 53 10

Существует большое разнообразие десятичных двоично-кодированных систем. Это многообразие вытекает из избыточности двоичного кода, при котором из 16 возможных комбинаций в каждом разряде используется по прямому информационному назначению лишь 10.

Наиболее широкое применение находят системы кодирования 8421 и 8421+3 (код Штибитца).

Система 8421 – неудобна тем, что при выполнении операции вычитания нет прямого перехода от цифры каждого разряда к дополнительному коду.

0000 - 0

0001 - 1

0010 - 2

0011 - 3

0100 - 4

0101 - 5

0110 - 6

0111 - 7

1000 - 8

1001 - 9

В то же время эта система обладает свойством аддитивности, поскольку результаты операции сложения над числами в десятичной системе и над их изображением в системе 8421 – совпадают.

Система 8421+3 - более интересна, т. к. она обладает свойством самодополнения. Видно, что дополнение до 9 можно получить, применяя операцию поразрядного инвертирования кода.

0011 – 0

0100 – 1

0101 – 2

0110 – 3

0111 – 4

1000 – 5

1001 – 6

1010 – 7

1011 – 8

1100 – 9

Всего существует А1610 = 2,9•1010 вариантов 10-ых двоично-кодированных систем.