Анимация
JavaScript


Главная  Библионтека 

0 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 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261

А2. [Обеспечить выполнение условия Си > е„.] Если < е„, поменять местами и и V. (Во многих случаях удобнее совместить шаг А2 с шагом А1 или с каким-нибудь из последующих шагов.)

A3. [Установить €„,.] Установить <- е„.

А4. [Проверить - е„.] Если - е„ > Р + 2 (большая разница в порядках), установить fw fu перейти к шагу А7. (Так как предполагается, что и нормализовано, на этом выполнение алгоритма можно было бы и закончить, но часто полезно использовать операцию сложения с нулем для гарантированной нормализации любого, возможно, и ненормализованного, числа.)

А5. [Масштабировать, сдвинув вправо.] Сдвинуть /„ вправо на - е„ позиций, т. е. разделить на [Замечание. Величина сдвига может достигать

р -f 1 разрядов, вследствие чего для выполнения следующего шага (сложения дробной части /и с /„) потребуется аккумулятор, способный хранить 2p-f 1 цифр по основанию b справа от позиционной точки. Если такого вместительного аккумулятора нет, можно сократить сдвиг до р -f 2 или р -f 3 разрядов, но с соответствующими предосторожностями; подробности обсуждаются в упр. 5.]

А6. [Сложить.] Установить fw fu + fv

А7. [Нормализовать.] (В этот момент {ew,fw) представляет сумму ы и w, но /и, может содержать более р цифр и может быть больше единицы или меньше 1/Ь.) Выполнить описываемый ниже алгоритм N, который нормализует и округлит (е», /ш), а также сформирует окончательный результат.

Алгоритм N (Нормализация). "Грубый порядок" е и "сырая дробная часть" / приводятся к нормализованному вид> с округлением при необходимости до р разрядов. В этом алгоритме (рис. 3) предполагается, что / < Ь.

N1. [Проверить /.] Если / > 1 (переполнение дробной части), перейти к шагу N4. Если / = О, установить в равным его наименьшему значению и перейти к шагу N7.

N2. [/ нормализовано?] Если / > 1/6, перейти к шагу N5.

N3. [Масштабировать, сдвинув влево.] Сдвинуть / на один разряд влево (т. е. умножить на Ь) и уменьшить е на 1. Возвратиться к шагу N2.

N4. [Масштабировать, сдвинув вправо.] Сдвинуть / вправо на один разряд (т. е. разделить на Ь) и увеличить е на 1.

N5. [Округлить.] Округлить f до р разрядов; (Это означает, что / изменяется до ближайшего кратного Ь~р. Возможно, что (6/) mod 1 = , т. е. имеется два ближайших кратных. Если b четно, то заменяем / ближайшим кратным 6", таким, что bf + b нечетно (обозначим результат округления в таком случае через /). Более подробное обсуждение аспектов округления приводится в разделе 4.2.2.) Важно отметить, что операция округления может привести к равенству / = 1 (переполнение при округлении); в такой ситуации следует вернуться к шагу N4.

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




Масштабировать, сдвинув вправо

/ нормализовано?

Масштабировать,

сдвинув влево


Переполнение при округлении

Переполнение или исчезновение порядка

Рис. 3. Нормализация (е,/).

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

N7. [Упаковать.] Объединить порядок е и дробную часть / для выдачи искомого результата.

Несколько простых примеров сложения чисел с плавающей точкой рассматривается в упр. 4.

Приведенные ниже подпрограммы для сложения и вычитания на компьютере MIX чисел, имеющих форгиу (4), служат примером программной реализации алгоритмов А и N. Эти подпрограммы извлекают одно входное значение и по символическому адресу АСС, другое входное значение v извлекается из регистра А при входе в подпрограмму. Результат w одновременно появляется в регистре Айв поле АСС. Таким образом, последовательность команд

LDA А; ADD В; SUB С; STA D,

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

LDA А, STA АСС; LDA В, JMP FADD; LDA С, JMP FSUB; STA D.

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



подпрограммами, которые будут рассмотрены ниже. Как в этой программе, так и во многих других программах данной главы, идентификатор OFLO именует подпрограмму, которая печатает сообщение о том, что индикатор переполнения машины MIX внезапно перешел в состояние "включено". Предполагается, что размер байта b кратен 4. В подпрограмме нормализации NORM предполагается, что г12 = е и гАХ = /, где гА = О влечет за собой гХ = О и г12 < Ь.

BYTE

1(4:4)

Размер байта b.

Определение поля порядка.

FSUB

TEMP

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

LDAN

TEMP

Изменить знак операнда.

FADD

EXITF

Подпрограмма сложения чисел с плавающей точкой.

OFLO

Снятие блокировки переполнения.

TEMP

TEMP <- V.

CMPA ACC(EXP)

Шаги А1-АЗ скомбинированы ниже.

Переход, если е„ > Си-

FU(0:4)

FU± 0.

ACC(EXP)

г12 <г- Cw

FV(0:4)

LDIN TEMP(EXP)

rll <--е„.

FU(0:4)

F\3 - i f f f fO {u,v меняются ролями).

TEMP(EXP)

rI2 Си,.

FV(0:4)

LDIN ACC(EXP)

ill <--Cv.

INCl

rll Си - e-v. (Шаг A4 не является необходимым.)

А5. Масштабировать, сдвинув вправо.

ENTX 0

Очистить гХ.

SRAX 0,1

Сдвиг вправо на Си - е„ позиций.

А6. Сложение.

А7. Нормализация. Переход, если произошло переполнение.

NORM

Простой случай?

CMPA

=0=(1:1)

/ нормализовано?

Если нормализовано, округлить его.

гХ гА.

DECX

(гХ положительно.)

TEMP

(Операнды имеют противоположные знаки;

HALF(0:0)

нужно уточнить состояние регистров

LDAN

TEMP

перед округлением и нормализацией.)

HALF

HALF

Дополнить наименьшей значащей величиной.

Переход к подпрограмме нормализации.

HALF

Половина размера слова (знак может изменяться).

Дробная часть Д.

Дробная часть /„.



0 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 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261