Анимация
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

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

Пример 1. Преобразовать число {5325121)% в десятичный формат.

Ъ.З 2 5 1 2 1

- 1 О

4 3.2 5 1 2 1

- 8 6

3 AQ.5 1 2 1

- 6 9 2

2 1 1 3.1 2 1

- 5 5 4 6

2 2 1 8 5..2 /

- 4 4 3 7 0

1 7 7 4 8 2.i

- 3 5 4 9 6 4

1 4 1 9 8 5 7 Результат: (1419857)io.

Достаточно надежный способ проверки вычислений состоит в "выбрасывании девяток": сумма разрядов десятичного числа должна быть конгруэнтной по модулю 9 попеременно сумме и разности разрядов числа, представленного в восьмеричном формате, причем крайний справа разряд последнего числа берется со знаком "плюс". В вышеприведенном примере имеем l-f4-fl-f9-f8-f5-f7 = 35 и l-2-fl-5-f2-3-f5 = -1; разность равна 36 (кратна 9). Если проверка дала отрицательный результат, то она повторяется с {к + 1) ведущими разрядами после fc-ro шага и местоположение ошибки определяется при помощи процедуры двоичного поиска. Другими словами, можно определить, где произошла ошибка, начав с проверки среднего результата, и затем в зависимости от того, верен ли результат, применить ту же процедуру к первой или второй части вычислений.

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

Преобразование целых чисел, представленных в десятичном формате, в восьмеричный формат. Для выполнения обратного преобразования можно использовать аналогичную процедуру. Запишем заданное в десятичном формате число, удвоим на fc-м шаге к ведупщх разрядов, используя представление в восьмеричном формате, и сложим полученные (fc + 1) ведущих разрядов, опять же используя представление в восьмеричном формате. Для заданного числа, содержащего {т + 1) разрядов, процесс заканчивается через т шагов.



пример 2. Преобразовать число (1419857)io в восьмеричный формат.

/.4 1 9 8 5 7

+ 1

1 6.1 9 8 5 7 + 3 4

2 1 5.9 8 Ъ 7 + 4 3 2

2 6 1 3.8 Ъ 7 + 5 4 2 6

3 3 5 6 6.5 7 + 6 7 3 5 4

4 2 5 2 4 1-7 +10 5 2 5 0 2

5 3 2 5 1 2 1 Результат: {5325121)8-

(Заметим, что при вычислении восьмеричного представления присутствуют невосьмеричные цифры 8 и 9.) Проверка результата может быть выполнена описанным выше способом. Этот метод был опубликован Шарлем П. Розье (Charles Р. Rozier), IEEE Trans. СЕ-11 (1962), 708-709.

Обе описанные процедуры представляют собой, по существу, вариации метода 1, b обобщенного преобразования из одной системы счисления в другую. Операции удваивания и вычитания в десятичной системе счисления подобны умножению на 10 - 2 = 8. Операции удваивания и вычитания в восьмеричной системе счисления подобны умножению на 8 -f 2 = 10. Аналогичный метод существует и для преобразования из шестнадцатеричной системы счисления в десятичную, но это преобразование вьшолняется немного сложнее, так j<aK вместо операции умножения на 2 оно включает операцию умножения на 6.

Чтобы запомнить оба этих метода, нужно уяснить, что при переводе числа из восьмеричной системы счисления в десятичную вьшолняется вычитание, так как представление чисел в десятичном формате короче, чем в восьмеричном. Аналогично при переводе числа из представления в десятичном формате в восьмеричный необходимо выполнять сложение. Вычисления выполняются в формате представления результата, а не в исходном формате представления числа; в противном случае требуемый результат получен не будет.

Преобразование дробей. Аналогичные методы, пригодные для столь же быстрого преобразования вручную дробей, неизвестны. Похоже, что наилучшим является метод 2, а, в котором с целью упрощения операций умножения на 10 или 8 выполняются операции удвоения и сложения. В этом случае критерий выбора сложения и/или вычитания меняется на обратный - при преобразовании чисел в десятичный формат вьшолняется сложение, а при преобразовании чисел в восьмеричный формат вьшолняется вычитание. Кроме того, при вычислениях используется формат, в котором представлено исходное число, а не формат, в котором подставляется результат (см. приведенные ниже примеры 3 и 4). Реализация этого процесса требует примерно в два раза больше вычислений, чем рассмотренный выше метод преобразования целых чисел.



Пример 3. Преобразование числа (.14159)io в восьмеричный формат.

14 15 9

2 8 3 1 8-

Jf .1 3 2 7 2

2 6 5 4 4-

/.06176

1 2 3 5 2-

0.4 9 4 О 8 9 8 8 1 6-5.9 5 2 4 6 19 0 5 2 8-7.6 2 1 1 2 1 2 4 2 2 4-

..9 6 8 9 6 Результат: (. 110374... )8 Пример 4. Преобразование числа {.110374)» в десятичный формат.

.1 1 0 3 7 4 2 2 0 7 7 0 +

1.3 2 4 7 3 О 6 5 1 6 6 0 + 4.1 2 1 1 6 О 2 4 2 3 4 0 + 1.4 5 4 1 4 О 1 1 3 0 3 0 0+

5.6 7 1 7 О О 1 5 6 3 6 0 0+

8.5 О 2 6 О О 1 2 0 5 4 0 0 +

6.2 3 3 4 О О Результат: (. 141586...)io.

D. Преобразование чисел с плавающей точкой. При выполнении преобразований чисел с плавающей точкой необходимо одновременно выполнять операции как с целой частью числа, так и с дробной, поскольку преобразование целой части числа оказывает влияние на дробную часть. Для преобразования числа / • 2 в десятичный формат можно сначала представить 2 в виде F 10 (обычно при помощи вспомогательных таблиц) и затем уже преобразовать Ff в десятичный формат. Аналогично можно умножить е на logio 2 и затем округлить результат до ближайшего целого числа Е; после этого разделить f -2 на 10 и преобразовать результат. Обратно, для преобразован 1Я числа F • 10 в двоичный формат можно преобразовать F, а затем у.множить его на -пи-ю хи*-, представленное в формате с плавающей точкой (снова используя вспомогательные таблицы). Для уменьшения максимальных размеров вспомогательных таблиц используется обычная методика, основанная на применении нескольких операций умножения и/или деления, хотя это



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