Опубликован: 05.06.2018 | Доступ: свободный | Студентов: 536 / 106 | Длительность: 07:59:00

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

< Лекция 9 || Лекция 10: 123

Деление чисел с плавающей запятой

Сначала рассмотрим случай деления двух чисел с плавающей запятой в десятичной системе счисления.

(0,6*105) * (0,2*102) = 3 * 105-2 = 0,3 * 104

Последний шаг выполнен для нормализации мантиссы результата.

Таким образом, если представить операнды в двоичной системе счисления как

X = M_x \cdot 2^{П{_х}}
Y = M_y \cdot 2^{П_{y}},

а частное мы хотим тоже получить в виде числа с плавающей запятой, то есть

Z = X \cdot Y = M_z \cdot 2^{П_{z}}

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

Пz = Пx - Пy

Mz = Mx / My

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

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

1 > |Mx,y| ≥ 2-1,

мы получим

2 > |Mz| = |Mx| / |My| ≥ 2 -1

Таким образом, если в результате деления мантисс и потребуется нормализация (в случая, если 2 > |Mz| ≥ 2-1), то она может быть выполнена сдвигом вправо не более чем на один разряд. При этом к порядку должна быть добавлена единица. Обычно такая ситуация проверяется на первом шаге деления мантисс. Для чисел с фиксированной запятой ситуация, когда |Mx| ≥ |My| приводит к приостановке деления и выработке сигнала особого случая, который обрабатывается системным программным обеспечением ЭВМ. В случае чисел с плавающей запятой такая ситуация ведёт к коррекции мантиссы делимого (Mx' = Mx / 2) и соответствующему изменению порядка (Пx' = Пx + 1) с последующим делением мантиссы Mx' на Y.

Рассмотрим особые случаи при делении чисел с плавающей запятой

  1. Пz = Пx - Пy
    1. Если Пz = +∞, то Z = ∞
    2. Если Пz = -∞, то продолжить деление, так как в последующем возможно увеличение порядка за счет того, что мантисса X окажется больше или равной мантиссе Y.
  2. Mz = Mx / My

Т.к. |Mx| ≥ 2-1, |My| ≥ 2-1, то 2 > |Mz| ≥ 2-1

Возможная область ненормализованной мантиссы:

2 > |Mz| ≥ 1

Если |Mz| ≥ 1, то выполнить нормализацию мантиссы с одновременной коррекцией порядка:

|Mz| = |Mz| * 2-1; Пz = Пz + 1.

Если в результате получим Пz = +∞, то Z = ∞.

Если в ходе деления мантисс получили Пz = -∞, и Пz = Пz +1 = -∞, то Z = 0.

Если в ходе деления мантисс получили |Mz| < 1, и при обработке порядков получили Пz = -∞, то Z = 0.

Сложение/вычитание чисел с плавающей запятой

X=M_{x}\cdot 2^{П{_x }}
Y=M_{y}\cdot 2^{П{_y }}
Z=X\pm Y=M_{z}\cdot 2^{П{_z }}

Рассмотрим несколько примеров сложения/вычитания чисел с плавающей запятой в десятичной системе счисления.

Пример 1.

(0,3*103) + (0,98*104) = (0,03 *104)+(0,98*104) = 1,01 * 104 = 0,101* 105

Пример 2.

(0,3333*103) - (0,331*103) = 0,002*103 = 0,2* 101

Порядок выполнения и особые случаи при сложении/вычитании чисел с плавающей запятой

  1. Определение разности порядков:

    ΔП = Пx – Пy

    Если ΔП = +∞, то Пx >> Пy, и Z = X.

    Если ΔП = -∞, то Пy >> Пx, и Z = Y.

  2. Денормализация мантиссы числа с меньшим порядком:

    Если ΔП > 0, то Пx > Пy, Пz = Пx, M'y = My*2 - ΔП, M'x = Mx.

    Если ΔП < 0, то Пy > Пx, Пz = Пy, M'x = Mx*2 - |ΔП|, M'y = My .

    Если ΔП = 0, то Пz = Пx = Пy. Денормализации мантисс не происходит: M'x = Mx, M'y = My.

  3. Алгебраическое суммирование чисел с равными порядками:

    Mz = M'x ± M'y

    Если |Мz| ≥ 1, то |M'z| =|Мz| * 2-1, П'z = Пz+1.

    Если П'z = +∞, то Z = ∞.


    Если П'z = -∞, то Z = 0.

Приведем в качестве примера некоторые мантиссы (Табл. 10.1), представленные в различных кодах, и укажем, нормализованы ли они (+ означает нормализованную мантиссу, - ненормализованную).

Таблица 10.1.
Двоичный код мантиссы числа ПК ОК ДК
0.101 + + +
1.101 + - -
0.010 - - -
1.010 - + +
0.100 + + +
1.100 + - +

Из анализа таблицы можно сделать вывод, что

  • нормализованная мантисса, представленная в прямом коде, имеет первый знак после запятой, равный единице;
  • нормализованная мантисса, представленная в обратном или дополнительном кодах, должна иметь первый знак после запятой, не совпадающий со знаковым разрядом. Исключение составляет число 1.10...0 для мантиссы в дополнительном коде.
< Лекция 9 || Лекция 10: 123