
Вопросы на экзамен - Ответы на экзамен - .doc + .pdf / 15. Методика выполнения операций сложения, вычитания, умножения, деления чисел с п.з. Нормализация результата, блокировки
..doc-
Методика выполнения операций сложения, вычитания, умножения, деления чисел с п.з. Нормализация результата, блокировки.
В основе арифметических операций над числами с плавающей запятой лежат принципы, на которых базируются операции над числами с фиксированной запятой. При этом есть и некоторые особенности.
Будем условно считать, что порядки заданы в обратном коде, а мантиссы – в прямом.
Умножение:
X = 2mx * X.x1x2...xn
Y = 2my * Y.y1y2...yn
Z = X*Y = 2mx+my * Z.z1z2...zn
Порядок выполнения операции следующий:
-
Знак произведения находится так же, как и при умножении чисел с фиксированной запятой.
-
Порядок произведения находится алгебраическим суммированием порядков множимого и множителя.
-
Мантисса находится по правилам умножения чисел с фиксированной запятой. При этом возможны следующие случаи:
-
Мантисса произведения – ненормализованное число, так как ½ ≤ |Mx| < 1, ½ ≤ |My| < 1, то ¼ ≤ |Mx*My| < 1, при ¼ ≤ |Mx*My| < ½ имеем ненормализованное число. Поэтому необходима нормализация влево максимум только на один разряд. С этой целью нужно сдвинуть мантиссу влево на один разряд. Это соответствует умножению числа на 21. Для того чтобы число не увеличилось в два раза, нужно из порядка вычесть единицу.
-
При умножении двух чисел в силу ограниченности разрядной сетки можно получить число, которое не может быть в ней представлено. Это соответствует получению машинной бесконечности. В данном случае вырабатывается специальный признак, по которому дальнейшие вычисления прекращаются.
-
При умножении двух чисел можно получить минимальное число, которое также не может быть представлено в разрядной сетке. Это соответствует случаю, когда получаемое число должно быть интерпретировано как нуль.
Деление
В основном аналогично умножению:
X = 2mx * X.x1x2...xn
Y = 2my * Y.y1y2...yn
Z = X/Y = 2mx–my * Z.z1z2...zn
Порядок выполнения операции следующий:
-
Находится по известным правилам знак частного.
-
Порядок частного находится как разность порядков делимого и делителя.
-
Цифры частного находятся так: вначале находится целая часть мантиссы, то есть |Mx| - |My| = α0 Если α0 ≥ 0, то Z0 = 1, если α0 < 0, то Z0 = 0.
Дробная часть мантиссы находится так же, как при операциях над числами с фиксированной запятой. Такой порядок действий вытекает из того, что:
½ ≤ |Mx| < 1,
½ ≤ |My| < 1,
2-1 < |Mx / My| < 2
То есть, возможно получение ненормализованной мантиссы. Для нормализации мантиссу необходимо сдвинуть вправо на один разряд и, чтобы не уменьшать при этом результат в два раза, нужно прибавить к порядку одну единицу.
При делении, так же, как и при умножении, возможно получение кода машинного нуля и кода бесконечности.
Сложение и вычитание
Обе операции выполняются по сходным алгоритмам.
X = 2mx * X.x1x2...xn
Y = 2my * Y.y1y2...yn
Z = X ± Y = 2max(mx,my) *Z.z1z2...zn
Операция выполняется следующим образом:
-
Находится разность порядков: mx – my = Δ
-
Производится выравнивание порядков, при этом если разность порядков положительна, то в качестве порядка результата берётся mx, а мантисса My сдвигается вправо на |mx– my| разрядов; еcли разрядность порядков отрицательна, то денормализуется мантисса Mx.
-
Производится алгебраическое суммирование мантисс слагаемых.
-
Выполняется нормализация влево или вправо на соответствующее число разрядов с необходимым исправлением порядка.
При выполнении операции сложения возможны следующие специфические случаи, называемые блокировками:
а) При определении разности порядков может оказаться, что необходимо мантиссу одного из чисел сдвигать на величину, большую, чем число разрядов в разрядной сетке. В этом случае, естественно, такое число может быть воспринято как нуль, а операция дальнейшего сложения может блокироваться, то есть не выполняться. В качестве результата берётся максимальное число.
Пример:
[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