Анимация
JavaScript
|
Главная Библионтека
Довольно большой фрагмент кода программы (строки 25-37) включен в программу по той причине, что в MIX имеется 5-байтовый аккумулятор для сложения чисел со знаком, в то время как алгоритм А в общем случае требует для него 2р + 1 = 9 разрядов. В действительности всю программу можно сократить почти вдвое, если пожертвовать хотя бы небольшой долей точности. Однако, как будет показано в следующем разделе, всегда лучше получать наибольшую возможную точность. В строке 55 используется нестандартная команда MIX, описанная в разделе 4.5.2. Время выполнения сложения и вычитания чисел с плавающей точкой зависит от нескольких факторов, анализируемых ниже, в разделе 4.2.4. Рассмотрим теперь операции умножения и деления, которые выполняются проще, чем сложение, и довольно похожи одна на другую. Алгоритм М {Умножение или деление чисел с плавающей точкой). По данным р-разрядным нормализованным числам с плавающей точкой и = (е„,/и) и v = {ср,/г,) по основанию b с избытком q строится произведение w =u®v или частное и; = ы 0 W. Ml. [Распаковать.] Выделить порядки и дробные части в представлениях и и v. (Иногда удобно, хотя и необязательно, проверить в ходе выполнения этого шага, не равны ли операнды нулю.) М2. [Выполнить операцию.] Установить fw /и fv и {b-4u)lh <- е„ - е„ + g + 1, для умножения; для деления. (Поскольку предполагается, что вводимые числа нормализованы, в результате получим, что либо fw = О, либо 1/6 < /и, < 1, либо возникнет ошибка "деление на нуль".) Здесь, если в этом есть необходимость, можно урезать /„, до р + 2 или р + 3 разрядов, как в упр. 5. МЗ. [Нормализовать.] Применить к {ew,fw) алгоритм N с тем, чтобы нормализовать, округлить и упаковать результат. {Замечание. В этом случае нормализация выполняется проще ввиду того, что масштабирование посредством сдвига влево происходит не более одного раза и после деления переполнение не может возникнуть вследствие округления.) В подпрограммах для MIX, тексты которых приведены ниже, используются те же соглашения, что и в программе А. Эти подпрограммы служат примером машинной реализации алгоритма М. Программа М [Умножение и деление чисел с плавающей точкой).
27 DIV FV Разделить. 88 JNOV NORM Нормализовать, округлить и выйти из подпрограммы. 29 DVZRO HLT 3 Ненормализовано или делитель равен нулю. Наиболее интересная особенность этой программы - подготовка к выполнению деления, осуществляемая командами в строках 23-26. Эти операции проводятся для того, чтобы обеспечить достаточную точность при округлении ответа. При \fu\ < \fv\, непосредственно применив алгоритм М, можно сохранить результат в форме "± О / / / /" в регистре А, что сделает невозможным чистое округление без специального анализа остатка (он хранится в регистре X). Поэтому в такой ситуации программа вычисляет <- fu/fv, гарантируя, что /„, либо равно нулю, либо во всех случаях нормализовано. Процедура округления может оперировать пятью значащими байтами, возможно, проверяя, не равен ли остаток нулю. Иногда может потребоваться перевод из представления с фиксированной точкой в представление с плавающей точкой и обратно. При помощи описанного выше алгоритма нормализации легко получается программа перевода "из фиксированной в плаваюшую". Например, целое число переводится в форму с плавающей точкой с помощью следующей подпрограммы на языке MIX. 01 FLOT STJ EXITF Предполагаем, что гА = и есть целое число. 02 JOV OFLO Снятие блокировки переполнения. 03 ENT2 Q+5 Установить "грубый" порядок. (10) 04 ENTX О 05 JMP NORM Нормализовать, округлить и выйти из подпрограммы. Подпрограмма перевода "из плавающей в фиксированную" служит предметом упр. 14. Отладка подпрограмм выполнения арифметических операций над числами с плавающей точкой - обычно довольно сложная задача из-за обилия различных случаев, которые нужно предусмотреть. Ниже перечислены распространенные ловушки, подстерегающие программиста, который занимается программами "плавающей арифметики". 1) Пдтеря знака. Во многих машинах (к MIX это не относится) команды сдвига регистров воздействуют на знаковый разряд, поэтому следует подробно анализировать операции сдвига, используемые при нормализации и изменении масштаба дробной части числа. Часто знак теряется и при появлении "минус нуля". (Например, операторы 30-34 программы А ответственны за установку знакового разряда регистра А. См. также упр. 6.) 2) Невозможность правильного определения, что произошло - исчезновение или переполнение порядка. Не следует проверять величину е до окончания операций округления и нормализации, так как предварительные проверки могут привести к ошибочным результатам. Исчезновение и переполнение порядка могут происходить и при вьшолнении сложения и вычитания, а не только при умножении и делении, и, несмотря на то что это событие довольно редкое, проверку необходимо проводить для каждого конкретного случая. Для того чтобы выполнить необходимые корректирующие операции после обнаружения исчезновения или переполнения, нужно заранее позаботиться о сохранении достаточной для этого информации. 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 |