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

А = 141, В = 8.

  N шага   Операнды Действия   Комментарии
Делимое/остаток старш. разр. Делимое/остаток младш. разр.
    А В R0≥0   _1 0 0 0 1 0 0 0 0 0 0 0     1 1 0 1         Заем отсутствует. Некорректность деления.

Для рассматриваемых делимого и делителя С=17.

Аналогичная ситуация фиксации некорректности деления будет иметь место и при В<8, в том числе и при В=0.

Возможные модернизации метода деления

1) Для явного представления знака остатка можно использовать дополнительный старший бит как в регистре остатка, так и в сумматоре-вычитателе. Следует иметь в виду, что при сдвиге остатка влево может произойти искажение старшего бита остатка, интерпретируемого как знаковый. В связи с этим действия на очередном шаге алгоритма деления следует определять значением знакового бита остатка до сдвига, а не после.

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

2) Для упрощения метода операцию вычитания делителя можно заменить операцией сложения с его дополнительным кодом.

В процессорах Intel беззнаковое деление реализуется командой DIV, а знаковое - командой IDIV.

Деление знаковых чисел

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

• метод деления в прямых кодах;

• метод деления в дополнительных кодах.

Основные особенности метода деления в прямых кодах

1. Отрицательные операнды предварительно преобразуются из дополнительного кода в прямой.

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

3. Знак частного вырабатывается отдельным действием как сумма по модулю 2 знаковых разрядов операндов.

4. Знаку остатка присваивается знак делимого. Исключением из правил 3,4 является получение нулевого частного и(или) нулевого остатка, которым, независимо от знаков операндов, присваивается знак + (положительный ноль).

5. Отрицательные результаты в конце операции преобразуются из прямого кода в дополнительный.

6. Существенным отличием знакового деления в прямых кодах от беззнакового деления является проверка корректности деления, выполняемая на начальных шагах алгоритма.

Обоснование метода проверки корректности деления

В связи с тем, что старший бит n-разрядного делителя и, соответственно, частного отводится для представления знака, условие корректности для для деления модулей операндов имеет вид:

|A| / |В| ≤ 2n-1 – 1 => |A| / |В| < 2n-1

|A| / |В| · 2n-1 < 0

Из полученного соотношения следует, что на этапе пробного вычитания следует делимое и делитель расположить друг под другом следующим образом:

     

|A|

|В| · 2n-1


1 бит

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

Основные особенности метода деления в дополнительных кодах

1. Цифры частного, формируемые на каждом шаге, определяются не только знаком остатка, но и знаком делителя. При их совпадении цифра частного равна 1, при несовпадении – 0.

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

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

4. Коррекция частного выполняется только при отрицательном делимом и нулевом остатке и состоит в инкременте (увеличении на единицу) для положительного частного и декременте для отрицательного частного.

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

Обоснование методов проверки корректности

1) А>0, B>0.

A/B < 2n-1;

A - B·2n-1 < 0.

2) А<0, B<0.

A/B < 2n-1;

A - B·2n-1 > 0.

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

а) выполняется предварительный сдвиг делимого на один разряд влево;

б) из старших разрядов сдвинутого делимого вычитается делитель;

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

3) A<0, B>0.

A/B ≥ - 2n-1;

A/B ≥ - 2n-1 – 1;

A + B·2n-1 + B > 0.

4) A>0, B<0.

A/B > - 2n-1 – 1;

A + B·2n-1 + B < 0.

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

1. сложение делителя с младшими разрядами делимого;

2. сдвиг полученного остатка влево;

3. сложение делителя со старшими разрядами остатка;

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: