www.chms.ru - вывоз мусора в Балашихе 

Динамо-машины  Обратные коды 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 [ 108 ] 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189

иногда называют алгебраическим сравнением, а второе - сравнением по модулю.

Ответ сравнения может вырабатываться в арифметическом устройстве в виде состояния некоторого триггера. Скажем, если этот триггер к концу выполнения сравнения находится в положении laquo;О raquo;, то это значит, что В gt;С, а если в положении laquo;1 raquo; - то В С. Иначе ответ может даваться в виде электрического импульса, появляющегося на одном из двух проводов или каким-нибудь другим способом. Если сравнение может дать один из трех результатов (скажем, В gt; С, или В lt;СС, или В = С), то его ответ изображается в виде комбинации состояний двух триггеров, или в виде состояния 3-позиционного кольца, или в виде импульса на одном из трех проводов и т. д.

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

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

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

**) По крайней мере это справедливо для трехадресных машин.



3.3.2 Выполнение алгебраического сравнения чисел с фиксированной запятой. Пусть необходимо выполнить сравнение двух чисел, В и С, каждое из которых представлено с фиксированной запятой. Для определенности будем полагать, что числа записаны в двоичной системе цифрами О 1 позиционным способом, с естественными весами разрядов, и что запятая фиксирована перед первым из основных разрядов числа; возможное отступление от позиционного способа изображения чисел или от естественного порядка весов может быть связано с применением дополнительных кодов для отрицательных чисел. Впрочем, все сказанное ниже легко обобщить на случаи аналогичного изображения чисел в любой п-ичной системе и для запятой, фиксированной в любом другом месте.

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

Говоря в дальнейшем о выполнении сравнения, мы будем иметь в виду те операции, когда ответ одного вида должен получаться при В lt; С, ответ другого вида - при В gt; С. Модификации, в которых требуется особый ответ в случае равенства чисел (В = С), встречаются сравнительно редко.

На первый взгляд наиболее естественным представляется тот путь выполнения сравнения, который упоминался в 3.3.1: произвести вычитание двух заданных чисел В - С и прочесть ответ сравнения по знаку результата. Если результат отрицателен, то В lt;С, если положителен - то gt; С. При этом, однако, нужно принять во внимание два существенных затруднения.

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



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

Вторая трудность проявляется только при использовании прямых кодов для изображения чисел. Она связана с неоднозначностью представления нуля. Если в прямых кодах выполняется вычитание двух равных чисел, то результатом может быть и -f О, и -О в зависимости от алгебраических знаков исходных чисел. Например, выполняя вычитание равных чисел по методу 3.1.1, получим, что разность двух положительных чисел равна - О, а разность двух отрицательных чисел + 0. Еще хуже, если оба исходных числа равны нулю; действуя указанным методом, получим

(+0) - (+0) = - 0; (-О)-(-О) = +0;

(+ 0) - (-0) = -0; (-0)- (ч- 0) = + 0. Хотя числа во всех случаях равны между собой, знак разности получается то laquo;+ raquo;, то laquo;- raquo;; если бы не были приняты специальные меры, то и ответ сравнения получался бы каждый раз разный. Между тем большей частью желательно, чтобы ответ сравнения был определенным: скажем, либо lt; С, либо В gt; С.

Рассмотрим пути преодоления указанных трудностей.

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

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



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 [ 108 ] 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189