Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Архит_ч1_А4.pdf
Скачиваний:
42
Добавлен:
20.03.2015
Размер:
1.2 Mб
Скачать

Умножение двоичных чисел производится путем образования промежуточных произведений и последующего их суммирования.

Помимо арифметических операций в компьютерах реализуются также логические операции, см. раздел 4.

В компьютерах выполняется еще одна операция над двоичными числами - это сдвиг числа по разрядной сетке влево или вправо. В случае сдвига влево фактически осуществляется умножение двоичного числа на 2, а при сдвиге вправо - деление на 2, где - количество разрядов, на которое сдвигается двоичное число. Например: 0000112 = 310 сдвинем влево на 2 разряда,

получим 0011002 = 1210, т.е. 3х4(22) = 1210, а теперь 0010002 = 810 сдвинем на 2 разряда вправо,

получим 0000102 = 210, т.е. 8:4(22) = 210.

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

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

3.2. Арифметические основы ЭВМ

Формой представления чисел в цифровых автоматах называется совокупность правил,

позволяющих установить взаимное соответствие между записью числа и его количественным эквивалентом.

Машинное (автоматное) изображение числа - это представление числа в разрядной сетке цифрового автомата. Условное обозначение машинного изображения числа, например, A будем представлять как [A].

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

В повседневной практике наиболее распространенной является форма представления чисел в виде последовательности цифр, разделенной запятой на целую и дробную части. Числа, представленные в такой форме, называются числами с естественной запятой или числами в естественной форме. В естественной форме число записывается в естественном натуральном виде, например 2360 - целое число, 0,0065 - правильная дробь, 64,89760 - неправильная дробь.

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

3.2.1 Форма представление чисел с фиксированной запятой

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

n

31

Знак

1

0

0

1

0

1

1

0

1

1

1

1

0

1 .

r

n-r

Рис. 3.1. Представление числа с фиксированной запятой

Вформе представления с фиксированной запятой все числа изображаются в виде последовательности цифр с постоянной для всех чисел положением запятой, отделяющей целую часть от дробной. Например, в десятичной системе счисления имеется пять разрядов в целой части числа и пять разрядов в дробной части, Числа, записанные в такую разрядную сетку, будут иметь следующий вид: +00567,22100; +00000,00044; -23501,20450.

Предположим, что в разрядной сетке необходимо разместить двоичное число, содержащее целую и дробную части. Если для размещения целой части отводиться r ячеек n – разрядной сетки, то (без учета знака) для размещения дробной части останется n-r свободных ячеек. Если количество разрядов в дробной части размещаемого числа превышает n-r, то некоторые младшие разряды окажутся за пределами разрядной сетки. Следовательно, любое двоичное число, меньшее чем 0. 0…1 (n-r нулей) воспринимается как нулевое и называется

машинным нулем.

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

Взнаковую часть записывается информация о знаке числа. Принято, что знак положительного числа "+" изображается символом 0, а знак отрицательного числа "-" изображается символом 1.

Например, в двоичном коде, используя 6-разрядную сетку, число 7 в форме с

фиксированной запятой можно представить в виде - 0.001112. Цифра левее точки это знак числа, а пять цифр правее точки - мантисса числа в прямом коде. Здесь подразумевается, что

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

Можно использовать и другую форму представления числа в машинной форме -

[0]001112. Знаковый разряд выделяется квадратными скобками.

Количество разрядов в разрядной сетке, отведенное для изображения мантиссы числа, определяет диапазон и точность представления числа с фиксированной запятой. Максимальное по абсолютной величине двоичное число изображается единицами во всех разрядах, исключая знаковый, т.е. для целого числа [2, 8, 9]:

| A | (2(n-1)

- 1),

(3.2)

max

 

 

где n - полная длина разрядной сетки.

В случае 16-разрядной сетки | A | max (2 (16 -1) - 1)

3276710, т.е. диапазон

представления целых чисел в этом случае будет от +3276710 до

-3276710.

Для случая, когда запятая фиксируется правее младшего разряда мантиссы, т.е. для

целых чисел, числа, у которых модуль больше, чем (2(n-1) -1) и меньше единицы не

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

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

32

Вкомпьютерах в целях упрощения выполнения арифметических операций применяются специальные двоичные коды для представления отрицательных чисел: обратный

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

Одним из способов вычитания является замена знака вычитаемого числа на противоположный и прибавление его к уменьшаемому числу А–В =А + (-В).

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

Для машинного представления отрицательных чисел используют прямой,

дополнительный и обратный коды.

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

прямом коде. Например, +6=0.110, -6=1.110.

Обратный двоичный код отрицательного числа получается из прямого кода равного ему по модулю положительного числа инвертированием значений всех его разрядов. Например, обратный код числа -6 равен 1.001.

Дополнительный код отрицательного числа получается из его обратного кода прибавлением единицы к младшему разряду. Например, дополнительный код числа -6 равен

1.010.

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

Вобще случае справедливы следующие выражения:

Прямой код числа А-[A]пр. Пусть А=а1, а2,…аm;

Если А>0, то [A]пр =0, а1, а2,…аm; Если А<0, то [A]пр =1, а1, а2,…аm;

Если А=0, то имеется неоднозначность: [0]пр =0,0 или =1,0… Обобщая результаты, получим:

A, если А≥0,

[A]пр=

1-А, если А<0.

33

 

 

 

 

 

Примеры представления цифр со знаком

 

 

Таблица 3.4

 

 

 

 

 

 

 

 

 

 

 

 

 

 

в четырехразрядных двоичных кодах

 

 

 

 

Десятичная цифра со знаком

 

 

 

 

Код

 

 

Десятичная цифра со знаком

 

 

 

Код

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Прямой

Обратный

 

Дополнительный

 

Прямой

Обратный

 

Дополнительный

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

+7

 

0.111

 

0.111

 

0.111

-0

1.000

 

1.111

 

0.000

 

 

 

 

 

 

 

 

 

 

 

+6

 

0.110

0.110

0.110

-1

1.001

 

1.110

1.111

 

 

 

 

 

 

 

 

 

 

 

+5

 

0.101

0.101

0.101

-2

1.010

 

1.101

1.110

+4

 

0.100

0.100

0.100

-3

1.011

 

1.100

1.101

+3

 

0.011

0.011

0.011

-4

1.100

 

1.011

1.100

+2

 

0.010

0.010

0.010

-5

1.101

 

1.010

1.011

+1

 

0.001

0.001

0.001

-6

1.110

 

1.001

1.010

+0

 

0.000

0.000

0.000

-7

1.111

 

1.000

1.001

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Обратный код числа А-[A]обр. Обозначение a означает величину, обратную а (инверсию

а), т.е. если а=1, то a =0, и наоборот:

 

 

 

 

 

 

 

 

 

Если А>0, то [A]обр =[A]пр =0, а1, а2,…аm;

 

 

 

 

 

 

 

Если А<0, то [A]обр =1, a 1, a 2,… a m;

 

 

 

 

 

 

 

 

 

Если А=0,

то имеется неоднозначность: [0]обр =0,0..0 или =1,11…1.

 

 

Обобщая результаты, получим:

A, если А≥0,

[A]обр=

10-1·10-n+А, если А≤0.

Дополнительный код числа А-[A]доп:

Если А≥0, то [A]доп =[A]пр = 0, а1, а2,…аm;

Если А<0, то [A]доп=1, a 1, a 2,… a m +0,000…1;

Обобщая результаты, получим:

A, если А≥0,

[A]доп=

10+А, если А<0.

Представим, что мы имеем только два разряда для представления чисел в десятичной системе счисления. Тогда максимальное число, которое можно изобразить будет 99, а вес третьего несуществующего старшего разряда будет 102, т.е. 100. В таком случае для числа 20 дополнительным будет число 80, которое дополняет 20 до 100 (100 - 20 = 80). Рассмотрим похожий пример для чисел, представленных 4-х разрядным двоичным кодом. Найдем дополнительное число для 00102 = 210. Надо из [1]0000 вычесть [0]0010, получим число [0]1110, которое и является дополнительным кодом 2. Разряд, изображенный в квадратных скобках на самом деле не существует. Но так как у нас 4-х разрядная сетка, то выполнить такое вычитание в принципе невозможно, а тем более мы стараемся избавиться от вычитания. Поэтому дополнительный код числа получают способом, описанным ранее, т.е. сначала получают

34

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

Рассмотрим несколько примеров алгебраического сложения в обратном коде. Очевидно, что при отсутствии переполнения возможны четыре случая сочетания

знаков и модулей слагаемых.

Случай 1. А>0, В>0, А + В< 1 . Этот случай соответствует обычному сложению прямых кодов чисел: [A 0]i [B 0]i A B.

Случай 2. А>0, В<0, А + В>0. [A 0]i [B 0]i A 2 B 2 n. Назовем этот

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

путем вычитания 2 и добавления 2 n .

Случай 3. А>0, В<0, А + В<0. [A 0]i [B 0]i A 2 B 2 n. Этот результат соответствует правильному, поскольку рассматривается случай отрицательной суммы.

Случай 4. А<0,

В< 0 , | A + B | < 1 . [A 0]i [B 0]i 2 A 2 n 2 B 2 n.

Здесь предварительный

результат нуждается в коррекции путем вычитания 2 и

добавления 2 n , как и в случае 2, поскольку истинное значение отрицательной суммы, представленной в обратном коде, A B 2 2 n.

В случаях 2 и 4 требуется одинаковая коррекция: 2 2 n , причем только в этих двух случаях возникает перенос из знакового разряда. Действительно, в случае 4 оба знаковых разряда равны 1, а в случае 2 знак результата – 0, что при разных знаках слагаемых может получиться только при появлении переноса из первого разряда в нулевой (знаковый), а следовательно, обязательно будет перенос и из знакового разряда. Вес знакового разряда соответствует 20, а вес переноса из него – 21. Таким образом, игнорируя перенос из знакового разряда, мы вычитаем из результата 2, что соответствует первому члену корректирующего выражения. Для учета второго члена следует добавить 1 к младшему разряду суммы, вес

которого составляет 2 n .

В случаях 1 и 3 переноса из знакового разряда не возникает и коррекция результата не требуется.

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

Пример1.

 

 

 

 

Сложить два числа в обратном коде.

 

 

 

A = + 0,1101

[A]d =0,1101

[A]i =0,1101

В = - 0,0011

[B]d = 1,0011

[B]i =1,1100

 

 

1←0,1001

 

 

1

 

С = 0,1010 <=

[C]d = 0,1010 <=

[C]i

=0,1010

 

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

Пример2.

Сложить два числа в обратном коде (случай 3).

А= - 0,1101

[A]d =1,1101

[A]i =1,0010

В= + 0,0011

[B]d = 0,0011

[B]i = 0,0011

С = - 0,1010

<= [C]d = 1,1010 <=

[C]i = 1,0101

Пример3.

35

Сложить два числа в обратном коде (случай 4).

A = - 0,0101

[A]d =1,0101

[A]i = 1,1010

В = -0,0110

[B]d = 1,0110

[B]i = 1,1001

 

 

1← 1,0011

С = -0,1011<=

[C]d =1,1011 <=

 

1

[C]i = 1,0100

Пример4.

Сложитьдвачиславобратномкоде(одинаковыемодули, норазныезнаки).

А= -0,0101

[A]d = 1,0101

[A]i =1,1010

В= +0,0101

[B]d = 0,0101

[B]i = 0,0101

С = -0,0000

<= [C]d = 1,0000 <=

[C]i = 1,1111

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

Пример5.

 

 

 

Сложитьдвачиславобратномкоде: 3 + (-0).

 

 

A = + 0,0011

[A]d =0,0011

[A]i = 0,0011

В = -0,0000

[B]d = 1,0000

[B]i = 1,1111

 

 

1← 0,0010

 

 

1

С = +0,0011 <=

[C]d =0,0011 <=

[C]i

=0,0011

Теперь рассмотрим случаи, когда |A+B|>=1|, что соответствует переполнению разрядной сетки. Очевидно, учитывая, что |A|<1 и |B|<1, переполнение возможно только при сложении чисел с одинаковыми знаками. Рассмотрим примеры.

Пример6.

Сложить два числа в обратном коде: 13/16 + 5/16 = 18/16.

А= +0,1101

[A]d =0,1101

[A]i =

0,1101

В= +0,0101

[B]d = 0,0101

[B]i =

0,0101

С = -0,1101 <=

[C]d = 1,1101

<= [C]i = 1,0010

Пример7.

Сложить два числа в обратном коде: (-11/16)+ (-8/16) = (-19/16).

A = - 0,1011

[A]d =1,1011

[A]i =

1,0100

В = -0,1000

[B]d = 1,1000

[B]i =

1,0111

 

 

1← 0,1011

 

 

 

 

1

С = +0,1100

<= [C]d =0,1100 <=

[C]i

=0,1100

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

OV a 0 b 0 c 0 a 0 b 0 c 0 .

Пример8.

Сложить два числа в обратном коде: (A>B, B>0, |A+B|=1).

A = + 0,0111

[A]d =0,0111

[A]i =0,0111

В = +0,1001

[B]d = 0,1001

[B]i = 0,1001

С = +0,1111 <=

[C]d =0,1111 <=

[C]i = 1,0000

36

Пример9.

Сложить числа в обратном коде (A<0, B<0, |A+B|=1).

A = - 0,0111

[A]d =1,0111

[A]i =

1,1000

В = -0,1001

[B]d = 1,1001

[B]i =

1,0110

 

 

1← 0,1110

 

 

 

 

1

С = +0,1111 <=

[C]d =0,1111 <=

[C]i

= 0,1111

Итак, использование обратного кода в операциях алгебраического сложения/вычитания позволяет:

использовать только действие арифметического сложения двоичных кодов;

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

обнаруживать переполнение разрядной сетки.

Еще одним достоинством применения обратного кода можно считать простоту взаимного преобразования прямого и обратного кода.

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

Рассмотрим несколько примеров алгебраического сложения в дополнительном коде.

Случай 1.

А>0, В>0, А+В< 1 . Этот случай соответствует обычному сложению прямых кодов чисел: [A 0]c [B 0]c A B.

Случай 2.

А>0, В<0, А+В>0. [A 0]i [B 0]i A 2 B.

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

Случай3.

А>0, В<0, А+В<0. [A 0]c [B 0]c A 2 B. Этот результат соответствует правильному, поскольку рассматривается случай отрицательной суммы.

Случай4.

А<0,В< 0 , | A + B | < 1 . [A 0]c [B 0]c 2 A 2 B. Здесь предварительный

результат нуждается в коррекции, поскольку истинное значение отрицательной суммы, представленной в обратном коде, A B 2.

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

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

Число

Прямой код

Обратный код

Дополнительный код

-0,0111

[A]d=1,0111

[A]i=1,1000

[A]c=1,1001

-0,1000

[A]d=1,1000

[A]i=1,0111

[A]c=1,1000

-0,0101

[A]d=1,0101

[A]i=1,1010

[A]c=1,1011

37

Пример 1.

Сложить два числа в дополнительном коде: (+13/16) + +(-3/16) = (+10/16).

A = + 0,1101

[A]d =0,1101

[A]с= 0,1101

В = - 0,001

[B]d = 1,0011

[B]с = 1,1101

С = +0,1010 <=

[C]d =0,1010 <=

[C]c =11,1010

Пример 2.

Сложить два числа в дополнительном коде (случай 3).

A = - 0,1101

[A]d =1,1101

[A]с= 1,0011

В = + 0,0011

[B]d = 0,0011

[B]с = 0,0011

С = -0,1010 <=

[C]d =1,1010 <=

[C]c = 1,0110

Пример 3.

Сложить два числа в дополнительном коде (случай 4).

A = - 0,0101

[A]d =1,0101

[A]с= 1,1011

В = - 0,0110

[B]d = 1,0110

[B]с = 1,1010

С = -0,1011 <=

[C]d =1,1011 <=

[C]c =11,0101

Пример 4.

Сложить два числа в дополнительном коде (одинаковые модули, но разные знаки).

A = - 0,0101

[A]d =1,0101

[A]с= 1,1011

В = + 0,0101

[B]d = 0,0101

[B]с = 0,0101

С = +0,0000 <=

[C]d =0,0000 <=

[C]c =10,0000

Очевидно, для дополнительного кода, как и для обратного,

справедливо выражение

OV

 

 

 

 

 

a 0 b 0 c 0 a 0 b 0

c 0 .

 

Пример 7.

Сложить два числа в дополнительном коде числа для случая А<0, B<0, |A+B|=1. (- 11/16)+(-5/16) = (-16/16).

A = - 0,1011

[A]d =1,1011

В = - 0,0101

[B]d = 1,0101

С = -0,0000 <=

[C]d =1,0000 <=

[A]с= 1,0101 [B]с = 1,1011 [C]c =10,0000

Переполнения по признакам выражения OV a 0 b 0 c 0 a 0 b 0 c 0 не

обнаружено. Однако результат операции – «отрицательный ноль», который не может использоваться в дополнительном коде. Т.е. для случая А<0, B<0, |A+B|=1 признаком переполнения результата служит код результата 1,00..0.

Значение признака переполнения в дополнительном коде можно получить в соответствии с выражением

OV a 0 b 0 c 0 a 0 b 0 c 0 c 0 c1 c 2 .. c n .

Резюме. Применение дополнительного кода, по сравнению с обратным, имеет одно существенное преимущество – коррекция результата сводиться просто к отбрасыванию переноса из знакового разряда и не требует дополнительных затрат времени. К недостаткам применения дополнительного кода, можно отнести:

-более сложную процедуру обратного преобразования ПК ←→ДК, требующую дополнительных затрат времени;

-проблемы с обнаружением переполнения.

Для устранения этих проблем данные в памяти ЦА часто хранят в дополнительном

коде.

На рис. 3.2-3.4 показаны алгоритмы выполнения операций сложения вычитания для чисел, представленных в дополнительном, прямом, и обратном коде, соответственно.

38

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

 

 

 

Начало

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

где

 

 

 

 

 

 

f

1

OV

- значение признака

0

 

 

 

 

 

 

 

 

переполнения;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

B - модуль числа;

 

 

 

 

 

 

 

 

 

B : B 1

 

 

 

 

 

 

 

 

с-1

– перенос из знакового

 

 

 

 

 

 

 

 

 

 

 

разряда;

 

 

 

 

 

 

 

 

 

 

 

* - переполнение в

 

 

C : A B

 

 

 

 

 

 

дополнительном коде;

 

 

 

 

 

 

 

 

 

 

 

f - тип выполняемой

 

 

 

OV : *

 

 

операции (f=0 – сложение,

 

 

 

 

 

 

 

 

 

 

 

f=1 – вычитание)

 

 

 

 

Конец

 

 

 

 

 

 

 

 

 

 

Рис. 3.2. Алгоритм сложения/вычитания в дополнительном коде

Начало

 

 

 

 

 

 

f

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

b0 :

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

b0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

a0=b0

 

0

 

 

где

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ao ,b0 ,co разряды

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

C : A B

C : A B

 

 

 

 

 

 

(знаковые);

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

OV

-

 

значение

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0

 

 

 

 

1

 

 

 

 

 

 

признака

 

 

 

 

c0

 

 

 

c0

 

переполнения;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

- модули

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

 

 

 

 

 

 

 

 

0

 

A ,

B ,C

 

 

 

 

 

 

 

 

 

 

 

 

чисел;

 

 

 

 

 

c0 : a0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

с-1

перенос из

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

знакового разряда;

 

 

 

 

 

 

 

 

 

 

 

C : B A

 

 

- переполнение в

 

OV : 1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

обратном коде;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

f - тип выполняемой

 

 

 

 

 

 

 

 

 

 

 

 

 

c0 : b0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

операции

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(f=0 –сложение,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

f=1 – вычитание)

OV : 0

Конец

A a0a1a2

....an, B b0b1b2

....bn, C A B c0c1c2....cn,

Рис. 3.3. Алгоритм сложения/вычитания в прямом коде

39

0

0

0

0

Начало

f

1

 

b0 : b0

a0 1

A : A

b0 1

B : B

C : A B

c-1

1

 

C : C 2 n

α 1 0

OV : 0

OV : 1

0 c0

1

C : C

Конец

где

ao ,b0 ,co разряды (знаковые);

OV - значение признака переполнения;

A , B ,C - модули

чисел; с-1 – перенос из знакового разряда;

- переполнение в

обратном коде;

f - тип выполняемой операции

(f=0 – сложение, f=1 – вычитание)

Рис. 3.4. Алгоритм сложения/вычитания в обратном коде

Умножение двоичных чисел обычно выполняется в прямом коде. Знак произведения определяют по знаковым разрядам множимого и множителя в соответствии со следующим правилом. Если знак операндов одинаков, то знак произведения – положителен. В

противном случае знак произведения отрицателен.

Знак произведения двух чисел не влияет на алгоритм операции умножения модулей этих чисел.

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

В таблице 3.6 показаны примеры операции умножения для двух чисел с фиксированной запятой.

40

Таблица 3.6.

Примеры операции умножения

 

Пример

 

 

Десятичные числа

 

 

Двоичные числа

 

 

1

A=510, B=310, A · B = 510 · 310 = 1510

 

A=0.0101, В= 0.0011

 

 

 

 

 

5

 

 

x

0.0101

 

 

 

 

х

 

 

0.0011

 

 

 

 

3

 

 

 

0101

 

 

 

 

 

15

 

+

0101

 

 

 

 

 

 

 

 

 

0.1111 = 1510

 

 

2

A=1310

, B=1110

 

 

 

A=1101, В=1011

 

 

 

A · B = 1310 · 1110 = 14310

 

 

1101

 

 

 

 

 

 

 

 

 

 

 

 

 

х

13

 

 

х 1011

 

 

 

 

11

 

1101

 

 

 

 

 

13

 

1101

 

 

 

 

13

 

0000

 

 

 

 

143

 

+1101

 

 

 

 

 

 

 

 

10001111

 

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

Деление двоичных чисел во многом аналогично делению десятичных чисел. Алгоритм деления заключается в том, что делитель на каждом шаге вычитается из делимого столько раз (начиная со старших разрядов), сколько это возможно для получения наименьшего положительного остатка. Тогда в очередной разряд частного записывается цифра, равная числу делителей, содержащихся в делимом на данном шаге. Следовательно, при делении операцию вычитания повторяют до тех пор, пока уменьшаемое не станет меньше вычитаемого. Число этих повторений показывает, сколько раз вычитаемое укладывается в уменьшаемом. В таблице 3.7 показаны примеры операции деления для двух чисел с фиксированной запятой.

Таблица 3.7.

 

 

 

 

 

 

 

 

 

 

 

 

Примеры операции деления

 

 

Пример

 

 

 

 

 

 

 

 

 

 

Делимое, делитель, результат

 

 

1

A=4510 =10011012, B=510=1012, A/B=4510/510 = 910

 

 

 

 

 

 

 

 

001101

 

 

 

 

 

/

 

 

 

101

 

 

 

 

 

 

 

 

 

01

 

 

 

 

 

 

 

 

 

010

 

 

 

 

 

 

 

 

 

0101

 

 

 

 

 

1001

 

 

 

2

A=20410

= 11001100(2),

B=1210=1100(2) , А / B = 20410 / 1210 = 1710

 

 

 

 

11001100

| 1100

 

 

 

 

1100

 

 

 

 

| 10001

 

 

 

остаток

00001

 

 

 

 

 

 

 

 

 

-

0

 

 

 

 

 

 

 

 

 

 

 

11

 

 

 

 

 

 

 

 

 

 

-

0

 

 

 

 

 

 

 

 

 

110

 

 

 

 

 

 

 

-

0

 

 

 

 

 

 

 

 

1100

 

 

 

 

 

 

- 1100

 

 

 

 

 

 

0000

 

 

 

Поясним пример 2, приведенный в таблице 3.7. Двоичное, как и десятичное деление, начинается с анализа делимого (А=11001100) и делителя (В=1100). Поскольку делитель укладывается в 1100, то единица записывается в старший разряд поля частного. Делитель умножается на 1 и вычитается из 1100. Разность равна 0. Объединяется 0 остатка со значением следующего разряда делимого, равным 1. Поскольку делитель (В=1100) 0 раз укладывается в 1, записываем 0 в следующий по старшинству разряд поля частного, а число 1 объединяется со следующим разрядом делимого и т.д. до тех пор, пока делимое не оказывается исчерпанным.

41

Например, разделим А=3510= 0.1000112 на В=510=1012 (5д = 1.011д). В в регистре С, как и в предыдущем примере, формируется частное.

0.100011

 

- делимое

+ 1.011000

 

- первое вычитание делителя

1.111011

 

- С= 0 восстанавливаем остаток до делимого

+ 0.101000

 

- сдвигаем влево остаток

0.10001

 

 

1.00011

 

 

 

+ 1.01100

 

 

- С = 01, сдвигаем влево остаток

0.01111

 

 

0.1111

 

 

 

 

+ 1.0110

 

 

 

- С = 011, сдвигаем остаток

0.0101

 

 

 

0.101

 

 

 

 

 

+ 1.011

 

 

 

 

Получаем ответ - С = 0111 = 710.

0.000

 

 

 

 

Разумеется,

компьютер не может строить догадок относительно того, сколько раз

делитель укладывается в том или ином числе, поэтому весь процесс деления сводится к операциям вычитания и сдвига, см. табл. 3.8. Такой метод деления называется делением с восстановлением остатка [11].

Продемонстрируем данный метод на том же примере, но сначала делитель В=(1100) представим в дополнительном коде, что позволит ограничиться сложением во всех случаях, когда нужно выполнять сложение или вычитание: В=1100пр=1.0100д. Частное формируется в некотором регистре С, незаполненные разряды которого будем обозначать через Х.

 

 

 

 

Таблица 3.8.

 

 

 

Пример операции деления с восстановлением остатка

Шаг

 

 

Операция

Комментарий

 

 

 

 

 

 

 

 

 

1

0. 11001100

 

Начинаем вычитать делитель из делимого.

 

 

+1. 01000000

 

Если остаток получается положительным, то в

 

 

0. 00001100 первый остаток

разряд частного записываем 1, в противном

 

 

 

 

случае - 0. Первый (старший) бит частного

 

 

 

 

равен 1, т.к. остаток получился положительным:

 

 

 

 

С = 1ХХХХ.

2

0. 00011000

 

Первый остаток сдвигаем на один разряд

 

 

+1. 01000000

 

влево и из него вычитаем делитель. Остаток

 

 

1. 01011000

второй остаток

отрицательный, поэтому в следующий разряд

 

 

 

 

частного записываем 0, С=10ХХХ.

3

1. 01011000

 

Биты делителя возвращаем обратно первому

 

 

+ 0. 11000000

 

остатку, т.е. складываем делитель (в прямом

 

 

0. 00011000

сдвинутый первый остаток

коде) и второй остаток.

4

0. 00110000

 

Сдвигаем сдвинутый первый остаток на один разряд влево

 

 

+ 1. 01000000

 

и вычитаем из него делитель. Третий остаток

 

 

1. 01110000

третий остаток

отрицательный, следовательно, следующий (третий) разряд

 

 

частного равен 0, С = 100ХХ.

 

 

 

 

5

1. 01110000

 

Возвращаем делитель третьему остатку.

 

 

+ 0. 11000000

 

 

 

 

0.00110000

дважды сдвинутый

 

 

 

 

первый остаток

 

6

0. 01100000

 

Сдвигаем дважды сдвинутый первый остаток

 

 

1. 01000000

 

на один разряд влево и вычитаем делитель.

 

 

1.10100000

четвертый остаток

Четвертый остаток опять отрицательный,

 

 

 

 

поэтому С=1000Х.

7

0.1100000

 

Прибавляем делитель к четвертому остатку,

 

 

+ 1. 0100000

 

результат сдвигаем на один разряд влево, а

 

 

0. 0000000

пятый остаток

затем вновь вычитаем делитель. Остаток

 

 

 

 

положительный, значит С = 10001 = 17(10).

 

 

 

 

42

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

Рассмотрим еще один пример. Разделим А=50610=0.111111010 на В=2310=0.10111. После каждого вычитания проверяем знак результата. При положительном знаке в

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

после запятой.

 

0.111111010

- делимое

+ 1.01001

 

- первое вычитание делителя

 

 

10.010001

 

1- результат положителен

+ 1.01001

 

- второе вычитание делителя

 

1.11010

 

0 - результат отрицателен

+ 0.10111

 

- прибавление делителя

 

10.100010

 

- восстановленный остаток

+ 1.01001

 

- третье вычитание делителя

10.010111

 

1 - результат положителен

+ 1.01001

 

- четвертой вычитание делителя

10.000000

 

1- остаток равен нулю.

Рассмотренный алгоритм деления с восстановлением остатка (прибавлением к отрицательному остатку делимого) предусматривает различную последовательность операций для положительного и отрицательного остатков. Рассмотрим на одном из наших примеров еще один метод, используемый в цифровых автоматах для операции деления двоичных чисел с фиксированной запятой – метод деления без восстановления остатка. Как уже отмечалось, основой выполнения деления является операция вычитания с целью получения остатка, знак которого определяет цифру частного. В данном случае знак остатка определяет не только очередную цифру частного, но и характер следующей процедуры: прибавления делителя к сдвинутому остатку, если этот остаток меньше 0, и вычитание делителя из сдвинутого остатка, если остаток больше или равен 0. Этот метод деления получил название деления без

восстановления остатка.

 

 

 

 

Рассмотрим пример. Разделим А=50610=0.111111010 на В=2310=0.10111.

0.111111010

 

 

- делимое положительно

+ 1.01001

 

 

 

- первое вычитание делителя

 

 

10.010001

 

 

 

1 - результат положителен

+

1.01001

 

 

 

- второе вычитание делителя

 

 

 

1.110100

 

 

 

0 - результат отрицателен

+

0.10111

 

 

 

- прибавление делителя

 

100.010111

 

 

 

1 - результат положителен

+

1.01001

 

 

 

- третье вычитание делителя

 

 

 

10.000000

 

 

 

1 - остаток равен нулю.

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

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

43

В общем случае число в форме с плавающей запятой представляется в виде:

 

A m q p ,

(3.3)

где m – мантисса числа;

q – основание системы счисления;

p – порядок числа, который для упрощения в примерах будем иногда изображать как ± р (не путайте с переносом в старший разряд).

Тогда очевидно, что p – это показатель степени порядка, который обычно называют просто порядком числа, т.к. в основном всегда q = 2. Следовательно, предыдущее выражение можно записать в следующем виде:

A m A p A ,

(3.4)

имея в виду, что в компьютерах обычно q = 2.

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

счисления можно записать следующим образом: 1964,0 100; 0,1964 104; 19,64 102; 196400 10-2 и т.д.

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

Число с плавающей запятой принято представлять в так называемом нормализованном виде для максимально точного представления числа. Если выполняется неравенство

q 1 | m | 1 ,

а в случае двоичной системы счисления:

 

0 . 5 | m

| 1 ,

то считается, что число представлено в нормализованном виде. Например, 0,1964·104 является нормализованным видом числа 1964 в форме с плавающей запятой в десятичной системе счисления. Аналогичные рассуждения применимы и к двоичным числам. Например, нормализованная форма записи двоичного числа 1110110,0112 имеет следующий вид

0,1110110011·10111.

Таким образом, у двоичного нормализованного числа в форме с плавающей запятой мантисса – правильная дробь и в старшем разряде мантиссы всегда стоит 1. Операция приведения числа к нормализованному виду называется нормализацией. Нормализация чисел в компьютере выполняется или автоматически или же по специальной программе.

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

Для представления двоичного числа в форме с плавающей запятой в разрядной сетке, следует выделить две группы разрядов. Первая группа (r – разрядов) предназначена для размещения мантиссы, вторая (n-rразрядов) – для размещения кода порядка (без учета знаковых разрядов мантиссы и порядка), см. рис. 3.5.

 

 

 

 

 

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Знак

 

1

1

1

0

1

1

0

0

1

1

1

 

1

0

1 .

Манн

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

-тисы

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

r

 

 

 

 

n-r

 

 

 

Рис. 3.5. Представление числа с плавающей запятой

Будем считать, что двоичные числа размещаются в разрядной сетке в нормализованном виде. Это означает, что числовые значения мантиссы всегда больше или равны 2-1, но не превышают 1. «Вес» младшего разряда мантиссы равен 2-r, а «вес» старшего разряда - 2-1.

44

Максимально представимое число будет при максимальных значениях мантиссы и порядка: A (1 2 r ) 2(2n r 1) , а минимально представимое число при минимальном значении

мантиссы и максимальном по модулю отрицательном значении порядка: A 2 1 2 ( 2 n r 1). Обычно в формате с плавающей запятой вместо показателя p используют так

называемую характеристику ("смещенный порядок") :

p l ,

где l - избыток (смещение), значение которого подбирается таким образом, чтобы при изменении значения показателя от некоторого минимального значения -|pmax| до максимального +|pmax|, характеристика r менялась от 0 до rmax. Следовательно, характеристика не меняет своего знака.

Рассмотрим несколько примеров представления чисел в форме с плавающей запятой. Предварительно напомним, что показатель степени двойки в разрядах разрядной сетки длиной n, отведенной для представления целых чисел, изменяется от 0 до n-1, а в случае правильных дробных чисел - от -1 до -n.

Если для представления показателя порядка выделены 4 разряда, то А 23 810 10002. Для этого случая в таблице 3.9 приведены значения показателя порядка

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

Таблица 3.9 Показатели порядка, характеристики и мантиссы чисел, представленных в форме с

плавающей запятой.

 

Число

Порядок числа

Мантисса

 

 

A10

p10

m2

 

 

0

0

0,0

 

 

1

1

0,1

 

 

2

2

0,1

 

 

3

2

0,11

 

 

0,5

0

0,1

 

 

0,25

-1

0,1

 

 

0,75

0

0,11

 

 

0,375

-1

0,11

 

Длина разрядной сетки, выделенной под характеристику, определяет диапазон представления чисел в формате с плавающей запятой.

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

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

Числа с фиксированной запятой чаще всего имеют формат слова (2 байта) или полуслова (1 байт). Числа с плавающей запятой – формат двойного (4 байта) и расширенного слова (8 байт) (математические сопроцессоры ПК могут работать с 10-байтными словами). Последовательность нескольких битов или байтов часто называют полем данных. Поля переменной длины могут иметь любой размер о 0 до 255 байтов, но обязательно равный целому числу байтов.

В качестве примера, рассмотрим запись десятичного числа 19310 (110000012) в разрядной сетке ПК, для числа с фиксированной запятой в формате слова со знаком, рис. 3.6 и для числа с плавающей запятой в формате двойного слова, рис. 3.7.

Разряд

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

15

14

13

12

11

10

9

8

7

6

5

 

4

3

2

1

0

 

Число

1

0

0

0

0

0

0

0

1

1

0

 

0

0

0

0

1

 

 

Знак

 

 

 

 

 

 

Абсолютная величина число

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 3.6. Число с фиксированной запятой в формате слова со знаком

45

Разряд

31

30

29

28

27

26

25

24

23

22

20

21

19

18

17

16

15

1

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Число

1

0

0

0

1

0

0

0

1

1

0

0

0

0

0

1

0

 

0

0

 

 

Знак

 

 

 

Порядок

 

 

 

 

 

 

 

 

Мантисса

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 3.7. Число с плавающей запятой в формате двойного слова

Двоично-кодированные десятичные числа могут быть представлены в ПК полями переменной длины в так называемом упакованном (рис. 3.8) и распакованном форматах (рис. 3.9). В упакованном формате для каждой десятичной цифры отводится по 4 двоичных разряда (полубайта), при этом знак числа кодируется в крайнем правом полубайте числа (1100 – знак

«+» и 1101 – знак – «-»).

На рис. 3.8 и 3.9 Цф – цифра, знак – знак числа. Упакованный формат используется в ПК при выполнении операций сложения и вычитания двоично-десятичных чисел. В распакованном формате для каждой десятичной цифры выделяется по целому байту, при этом старшие полубайты (зона) каждого байта, кроме младшего, в ПК заполняются кодом 0011, а в младших (левых) полубайтах обычным образом кодируются десятичные цифры. Старший полубайт (зона) самого младшего байта используется для кодирования знака числа, см. рис. 3.8.

Цф Цф … Цф

Знак

 

Зона Цф .. Цф .. Зона Цф Знак Цф

Байт

 

 

 

Рис. 3.8. Структура поля

 

Рис. 3.9. Структура поля

пакованного

 

распакованного

формата

 

 

формата

Например, десятичное число -19310 =-0001100100112-10 в ПК будет представлено, соответственно в упакованном и распакованном форматах, как это показано на рис. 3.10 и 3.11.

0001

1001

0011

1101

поля

0011

0001

0011

1001

1101

0011

 

 

 

 

 

 

 

Рис. 3.11. Структура поля

 

Рис. 3.10. Структура

 

 

 

 

упакованного

 

 

 

распакованного

 

 

формата

 

 

 

 

формата

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

Для более простого восптиятия материала, мы приводим примеры в сложения в десятичной системе.

А=0,315291·10-2, В=0,114082·10+2. Мантиссы чисел нормализованы (т.е. старший разряд модуля мантиссы не 0, например, для прямых кодов 0,2364·104≈0,0024·106).

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

1- й способ – Уменьшение большего порядка до меньшего. 2- й способ – Увеличение меньшего порядка до большего.

A=

 

0,315291·10-2

 

A=

0,000031

5291·10+2

B=

1140 0,820000·10-2

 

B=

 

0,114082

·10+2

C=

1,135291·10-2

 

C=

0,114114

·10+2

 

 

а)

 

 

 

 

б)

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

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

46

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

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

Следует помнить, что если в результате этого добавления произойдет переполнение разрядной сетки порядков, то результат окажется неверным – положительное переполнение

OV:=1.

Пример, положительного переполнения (OV:=1).

А=0,96502·10+2, В=0,73005·10+1.

A= 0,96503·10+2

B= 0,07300·10+2

C=

1,03803·10+2

- переполнение мантисс!

C=

1,0380·10+2

- правильный результат.

В

результате

алгебраического сложения мантисс результат может оказаться

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

A= 0,24512·10-8

B= -0,24392·10-2

C= 0,00120·10-8 =0,12000·10-10

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

Этапы процедуры алгебраического сложения чисел с плавающей запятой:

1.Выравнивание порядков.

2.Алгебраическое сложение мантисс как чисел с фиксированной запятой.

3.Нормализация результата.

На рис. 3.12 показан алгоритм сложения (вычитания) чисел с плавающей запятой.

47

Начало

 

 

q pa pb

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

q 1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0

 

 

 

 

 

 

 

1

 

 

 

 

 

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

q0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

q0

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

 

 

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

mb : 2 1 mb

 

 

 

 

 

ma : 2 1 ma

 

 

 

mb : 0

 

 

 

ma : 0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

порядка

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

pb : pb 1

 

 

 

 

 

 

pa : pa 1

 

 

 

 

 

 

 

 

 

 

pc : pb

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Выравнивание

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

q : q

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

 

 

 

 

 

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

q 0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Формируется mc и

 

 

 

 

 

 

 

 

 

 

 

pc : pa

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

OV →

 

 

 

 

 

 

 

 

 

 

 

 

 

Алгебраическое сложение/вычитание мантисс

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

как чисел с фиксированной запятой

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

мантисс

 

 

 

 

 

 

 

 

 

 

 

 

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

 

 

 

 

OVm 1

 

 

 

 

 

 

 

 

 

 

 

mc [1] 1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

переполнения

 

 

 

 

 

mc : 2 1

mc

 

 

 

 

 

 

 

 

 

 

 

 

 

 

mc : 2 mc

 

 

 

 

 

 

 

 

 

 

 

 

 

pc : pc

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

pc : pc 1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Устранение

 

 

 

 

 

 

pc max

 

 

 

 

 

 

 

 

 

 

 

| pc | max

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

OV : 1

 

 

 

 

 

OV :

0

 

 

 

 

 

 

 

mc : 0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Конец

 

 

 

 

Нормализация результата

 

 

 

 

 

Рис. 3.12. Алгоритм сложения чисел с плавающей запятой

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

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

A

A

m

1

2 p1

m

2

2 p2

( m

m

2

) 2 p1 p2 l

, (3.5)

1

2

 

 

 

 

1

 

 

 

где p1 p2 - l - характеристика результата.

Знак ответа определяется обычным образом. Если ответ получился ненормализованный, то выполняются процедуры нормализации и округления ответа.

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

Пример нахождения произведения двух чисел, представленных в показательной форме A=(+0,10101·10100)2, B=(-0,10001·10011)2 Мантисса произведения в денормализованной форме – 0,0101100101 имеет отрицательный знак, порядок результата равен 111. После нормализации значение порядка должно быть уменьшено на единицу. Окончательно получим – 0,101100101·101102, т.е. результат представлен в нормальной форме.

48

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

 

t умн

n

( t сдв

P i t сл ) ,

 

 

i 1

 

 

где tсдв – время выполнения сдвига числа на один разряд;

tсл

– время суммирования на сумматоре;

 

Рi

– вероятность появления единицы в разрядах множителя;

n – количество разрядов множителя.

Существуют несколько методов ускорения процедуры умножения: анализ двух разрядов множителя одновременно, анализ произвольного количества разрядов множителя,

умножение в системе счисления с основанием q 2k и матричные методы умножения.

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

При операции деления чисел, представленных в форме с плавающей запятой их мантиссы делятся, как числа с фиксированной запятой, а порядки вычитываются. В обоих случаях проверка на переполнение обязательна. Но, т.к. реально вычитываются характеристики чисел, то деление выполняется по следующей формуле [7, 11]:

 

A / A

m

2 p1 / m 2 p2

( m

 

/ m ) 2 p1 p2 l ,

(3.6)

 

1

2

1

2

1

2

 

где

p1 - p2 l – характеристика результата.

 

 

 

 

Знак ответа определяется обычным образом. Если ответ получился ненормализованный,

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

 

 

 

 

Так

как, мантиссы операндов

нормализованы,

то

возможны случаи,

когда

| m1 | | m2 |, | m1 | | m2 |. В первом случае перед началом деления надо вычесть делитель из

делимого и в целую часть мантиссы частного записать 1. Затем продолжать делить числа обычным методом. После получения частного, очевидно, что оно не будет нормализованным. Следовательно, надо нормализовать частное, т.е. в данном случае сдвинуть его на 1 разряд вправо, а к порядку частного добавить 1.

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

Рассмотрим пример. А=1010=0.1010, р1а=4, В=2=0.1, р2в=2, | m1 | | m2 | .

При первом вычитании m2 из m1 1 записываем в целую часть частного:

0.1010

 

 

+ 1.1000

 

С=1.XX, далее, будем делить методом

0.0010

 

 

 

 

деления без

0.0100

восстановления остатка

+ 1.1000

С = 1.0

 

1.1100

1.1000

 

+ 0.1000

С = 1.01. Сдвигаем вправо С = 0.101,

 

0.0000

 

 

 

p=p+1=3.

49

Результат С=510=0.101.

Вопросы для самоконтроля

1.Назовите форматы представления чисел в ЭВМ?

2.Особенности арифметических операций с отрицательными числами?

3.Прямой, обратный и дополнительный код.

4.Что такое мантисса числа?

5.Для чего выполняется корректировка результата при выполнении операций в Д-

кодах?

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

6.Что такое нормализация числа?

Литература для самостоятельной подготовки по теме:

7, 9, 11.

50