Анимация
JavaScript
|
Главная Библионтека законов, существующих в отношении вычисляемых функций, например (cos) (-х) = (cos) х; (со)а;<1; (cos) а; > (cos) j/при О < х < 1/< 7Г. (b) Программы вычислений с однократной точностью - это "хлеб насущный" на каждый день, который должен быть доступен каждому, кто хочет работать с арифметикой с плавающей точкой. А удвоенная точность обычно используется в ситуациях, когда "чистые" результаты не так уж и важны. Разница между вычислениями с семью или восемью значащими разрядами достаточно заметна, а разница между вычислениями с 15 или 16 разрядами нас не очень беспокоит. Вычисления с удвоенной точностью чаще всего используются на промежуточных этапах решения сложной задачи с однократной точностью, а потому в полном спектре возможностей таких проце,дур нет необходимости. (c) Весьма поучительно проанализировать эти процедуры с тем, чтобы увидеть, насколько серьезной может быть ошибка, поскольку источники ошибок типичны и для "плохих" подпрограмм, работающих с однократной точностью (см. упр. 7 и 8). Рассмотрим теперь с этой точки зрения операции сложения и вычитания. Вычитание, естественно, заменяется сложением с инвертированием знака второго слагаемого. Для выполнения сложения используется раздельное сложение менее значимых и более значимых половин, обеспечивая при этом, разумеется, надлежащую обработку переноса. Сложности возникают, однако, вследствие использования прямого кода: можно, сложив менее значимые половины, получить неверный знак (эта ситуация возникает, когда знаки операндов противоположны и менее значимая половина меньшего операнда больше менее значимой половины большего операнда). Простейшее решение- заранее определить правильный знак. Поэтому на шаге А2 алгоритма 4.2.1А нужно положить не только условие е„ > е„, но и \и\ > \v\. Тогда можно быть уверенным в том, что знак результата будет знаком и. В прочих отношениях программа сложения с удвоенной точностью очень похожа на программу с однократной точностью, но все выполняется дважды. Программа А {Сложение с удвоенной точностью). Подпрограмма DFADD складывает число удвоенной точности с плавающей точкой и, имеющее формат (1), с числом удвоенной точности в формате с плавающей точкой и. Причем предполагается, что V перед началом выполнения программы занесено в гАХ (регистры А и X), а u первоначально хранится в ячейках АСС и АССХ. Результат появляется одновременно в гАХ и в (АСС, АССХ). Подпрограмма DFSUB вычитает v из и при соблюдении тех же соглашений. Предполагается, что оба входных операнда нормализованы и результат также нормализован. Заключительный фрагмент программы представляет собой процедуру нормализации в формате с удвоенной точностью, используемую и в других подпрограммах этого раздела. В упр. 5 показано, как можно существенно усовершенствовать эту программу. 01 ABS EQU 1:5 Определение поля для абсолютного значения. 02 SIGN EQU О: О Определение поля для знака. 03 EXPD EQU 1:2 Поле порядка для формата с удвоенной точностью. 04 DFSUB STA TEMP Вычитание с удвоенной точностью. 05 LDAN TEMP Изменить знак v. 06 DFADD 07 08 09 10 11 12 IH Ц 15 16 17 18 2H 38 IH 41 DNORM 42 43 DZERO 45 2H 46 47 IH 48 49 50 51 52 53 54 55 STJ CMPA JG JL CMPX ENTl MOVE LDIN INCl SLAX SRAX SLAX SLAX ENTX SRAX DECA EXITDF ACC(ABS) ACCX(ABS) ARGX ACCX ARG(2) TEMP TEMP(EXPD) ACC(EXPD) 1.1 ARG ARGX ARGX(SIGN) ACCX EXPO 1 IF(SIGN) ARGX(0:4) 4 1 ACC(0:4) ARG JANZ IF JXNZ IF STA ACC JMP 9F SLAX 1 DEC2 1 CMPA =0=(1:1) JE 2B SRAX 2 STA ACC LDA EXPO INCA 0,2 JAN EXPUND STA ACC(EXPD) CMPA =1(3:3)= Сложение с удвоенной точностью. Сравнить \v\ с Если t; > \и\, произвести взаимную замену и v. (АСС и АССХ находятся в последовательных ячейках.) гИ •(--ev. г12 •(- е„. гИ +- ви - eti. Удалить порядок. Масштабирование посредством сдвига вправо. О VI V2 V3 1)4 Vi V6 V7 VS Vg. Запомнить верный знак v в обеих половинах. (Известно, что и имеет знак результата.) гАХ 4- и. Удалить порядок. Ui U2 из U4 «5- EXPO +- 1 (см. ниже). 1 U5 ие U7 Ug. См. комментарии в тексте. Сложить О 1)5 Ve V7 Dg. Восстановить после занесения 1 (знак варьируется). Сложить более значимые половины. (Переполнения быть не может.) Подпрограмма нормализации, в гАХ, = EXPO + rI2. Если fu, = О, присвоить Cui +- 0. Нормализовать влево. Ведущий байт нулевой? (Округление опущено.) Вычислить порядок результата. Он отрицателен? Он занимает более двух байтов?
Рис. 4. Умножение с удвоенной точностью чисел, имеющих дробные части длиной 8 байт.
Переслать ответ в гА. Выход из подпрограммы. Аккумулятор для чисел с плавающей точкой. Часть "грубого" порядка. Когда в этой подпрограмме складываются менее значимые половины, в то слово, о котором известно, что оно имеет верный знак, слева вставляется дополнительный разряд "1". После выполнения сложения этот байт может равняться О, 1 или 2 в зависимости от обстоятельств и все эти три случая обрабатываются одновременно. (Ср. данный фрагмент с довольно громоздким методом формирования дополнения, который использовался в программе 4.2.1 А.) Стоит отметить, что после выполнения команды в строке 40 регистр А может оказаться равным нулю, но аккумулятор будет содержать правильный знак, который должен быть приписан результату, если регистр X не равен нулю (это есть следствие способа, с помощью которого в компьютере MIX определяется знак результата, равного нулю). Поменяй мы местами строки 39 и 40, программа давала бы неверный результат, хотя обе команды имеют один и тот же код "ADD"! Рассмотрим теперь умножение с удвоенной точностью. Произведение имеет четыре компоненты, схематически представленные на рис. 4. Так как нам нужны только восемь крайних слева байтов, можем игнорировать разряды, расположенные справа от вертикальной черты на диаграмме. В частности, это означает, что нет необходимости даже вычислять произведение двух менее значимых половин. Программа М {Умножение с удвоенной точностью). Соглащения относительно входных и выходных данных для этой подпрограммы те же, что и для программы А. 01 BYTE EQU 02 QQ EQU 03 DFMUL STJ 04 STA 1(4:4) BYTE*BYTE/2 EXITDF TEMP 05 06 SLAX 2 STA ARG Размер байта. Избыток порядка удвоенной точности. Умножение с удвоенной точностью. Удалить порядок. 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 |