AOP_Tom2 (1021737), страница 68
Текст из файла (страница 68)
Следующая программа представляет собой подпрограмму, ревлнзующую алгоритм А, причем она построена таким образом, что нормализукиций фрагмент может использоваться другими подпрограммами, которые будут рассмотрены ниже. Как в этой программе, так и во многих других программах данной главы, идентификатор ОРЕО именует подпрограмму, которая печатает сообщение о том, что индикатор переполнения машины М1Х внезапно перешел в состояние "включено". Предполагается, что размер байта 5 кратен 4.
В подпрограмме нормализации МОНН предполагается, что г12 = е и гАХ = 1', где гА = О влечет за собой гХ = О и г12 ( 6. Переход, если ер ~ е„. РУ+- ~1~УУО г12 < — е гП Ф- -е„. 00 В?ТЕ 01 ЕХР 02 ЛБОВ 08 05 РАОО 05 Об 07 08 09 10 11 12 18 15 15 1Н 1б 17 18 19 4Н 20 ЬН 21 22 28 6Н 25 25 20 27 28 Яо 81 82 ЯЯ 85 Я5 Яб Я7 НАЕР 88 РО 89 РЧ ЕЦО 1(4:4) ЕЦО 1:1 БТА ТЕМР (.ОАМ ТЕМР БТЛ ЕХ1ТР ЛОЧ ОРЕО БТА ТЕМР (.ОХ АСС СМРА АСС(ЕХР) ЗОЕ 1Р ЯТХ РУ(0:4) Е02 АСС(ЕХР) БТА РЧ(0:4) Е01Н ТЕМР(ЕХР) ЛМР 4Р БТА РО(0:4) 1,02 ТЕМР(ЕХР) ЯТХ РЧ(0:4) 1.01М АСС(ЕХР) 1НС1 0,2 ЕОА РЧ ЕМТХ 0 ЯНАХ О, 1 АОО РО ЯОЧ М4 ЗХЕ МОЕМ СИРА -"0=(1:1) ЗМЕ Мб ЯНС б ОЕСХ 1 БТА ТЕМР БТА НА(.Р(0:0) ЫАМ ТЕМР АОО НАЕР АОО НАЕГ БНС 4 ЗМР МЗА СОМ 1//2 СОМ 0 СОМ 0 Размер байта 5. Определение поля порядка. Подпрограмма вычитания чисел с плавающей точкой.
Изменить знак операнда. Подпрограмма сложения чисел с плавающей точкой. Снятие блокировки переполнения. ТЕМР < — о. гХ г- и. Шаги А1-АЗ скомблии овины ниже. РУ +- ж 1 1,1 1 0 (и, е меняются ролями). г12+- е г11 < — -е„. г11 +- е„— е„. (Шаг А4 не является необходимым.) А5. Масщтаби рвать вянув вп аво. Очистить гХ.
Сдвиг вправо иа е„— е„позиций, Аб. Сложение. рррр. и р~~нрм и, р переполнение. Простой случай? 1 нормализовано? Если нормализовано, округлить его. )гХ! еч (гА). (гХ положительно.) (Операнды имеют противоположные знаки; нужно уточнить состояние регистров перед округлением и нормализацией.) Дополнить наименыпей значащей величиной. Переход к подпрограмме иормюгизации.
Половина размера слова (знак может изменяться). Дробная часть 1„. Дробная часть ?р. 40 МОКИ )АХ ХНО 41 И2 СМРА =0=(1:1) 42 ЮИЕ Иб нь шнншс ХЕ Но малнзовано лн,(? Перейти к шагу ХЬ, если ведущий байт отличен от нуля. НЗ. Масштабн рвать внн в влево. 45 ИЗ 44 ИЗА 45 46 И4 47 Я1АХ 1 ОЕС2 1 ЗМР И2 ЕИТХ 1 ЯКС 1 Уменьшить е на 1. Вернутьсв к шагу Х2. )Ч4. Масштабу рвать вил в вп аво.
Выполнить сдвиг вправо и вставить "1" с соответствующим знаком. Увеличить е на 1. ш,О ро„~ )остаток) н -'Ь? )остаток) > АЬ? )остаток) = -Ь; округлить до нечетного. г12+- е — Ь. Довольно большой фрагмент кода программы (строки 25-37) включен в программу по той причине, что в М1Х имеется 5-байтовый аккумулятор для сложения чисел со знаком, в то время как алгоритм А в общем случае требует для него 2р+ 1 = 9 разрядов.
В действительности всю программу можно сократить почти вдвое, если пожертвовать хотя бы небольшой долей точности. Однако, как будет показано в следующем разделе, всегда лучше получать наибольшую возможную точность, В строке 55 используется нестандартная команда М1Х, описанная в разделе 4.5.2. Время выполнения сложения и вычитания чисел с плавающей точкой зависит от нескольких факторов, анв.лизируемых ниже, в разделе 4.2.4. Рассмотрим теперь операции умножения и деления„которые выполняк~тся проще, чем сложение, и довольно похожи одна на другую. Алгоритм М (Умношсение или деление чисел с нлаеанлцей гаечкой).
По данным Р-РазРЯдным ноРмализованным числам с плавающей точкой и = (е„,ун) и е = (е„, Х„) по основанию Ь с избытком а строится произведение ш = и З с или частное ш=иЗс. М1. (Распаковать.1 Выделить порядки и дробные части в представлениях и и е. 46 40 И5 50 51 52 55 54 55 56 ЯН 56 50 Иб 60 И7 61 62 ХКО 65 ВН 64 ЕХ1ТР 65 ЕХРОУ 66 ЕХРОМ 67 АСС 1ИС2 1 СМРА =В?ТЕ/2=(б:б) 51 Иб 50 5Р ЗХИХ ЯР БТА ТЕМР ЫХ ТЕМР(4:4) )ХО Иб БТА в+1(0:О) 1ИСА В?ТЕ ЭОУ И4 32И ЕХРОИ ЕИТХ 0,2 БКС 1 РЕС2 В?ТЕ ЯТА АСС 32И НЕТ 2 НЕТ 1 СОИ 0 Перейти к шагу Мб, если гХ нечетно.
Сохранить знак гА. Добавить Ь ~ к )7")(знак может изменяться). Проверить переполнение из-за округления. ав,пх~хн,. и, и. )У7. Упаковать. гХ < — е. Выход, если только не е > Ь. Обнаружено переполнение порядка. Обнаружено исчезновение порядка. Аккумулятор для операций с плавающей точкой. 1 (Иногда удобно, хотя и необязательно, проверить в ходе выполнения этого шага, не равны ли операнды нулю.) М2.[Выполнить операцию.) Установить е +- е„+ е„— д, 1 «-,(„,(„ для умножения; е„, +- е„— е«+ Ч+ 1, 1 +- (б ~1„))1«для деления. (9) (Поскольку предполагается, что вводимые числа нормализованы, в результате получим, что либо 1,„= О, либо 1/оз < [,гк[ с 1, либо возникнет ошибка «деление на нуль".) Здесь.
если в этом есть необходимость, можно урезать г«, до р+ 2 или р+ 3 разрядов, как в упр. 5. МЗ. [Нормализовать.) Применить к (ем,1,„) алгоритм )ч' с тем, чтобы нормализовать, округлить и упаковать результат. (Замечание. В этом случае нормализация выполняется проще ввиду того, что масштабирование посредством сдвига влево происходит не более одного раза и после деления переполнение не может возникнуть вследствие округления,) 3 В подпрограммах для М1Х, тексты которых приведены ниже, используются те же соглашения, что и в программе А. Этн подпрограммы служат примером машинной реализации алгоритма М.
Программа М (Умножение и деление чисел с нлаеаклцей точкой). г12 « — е + е — д. 10 Р01Ч ЯТ) 14 гОЧ 10 ЯТА 10 ЯТА 17 1,01 18 1,02 10 ОЕС2 00 ЕИТХ 01 ЕОА йй ЯЕА йу СМРА Е( Л. Об ЯКА 00 1ИС2 г12 < — е — е, +д. гА < — 1 . Переход, если Д [ < ~й ~ Иначе — масштабировать 1„вправо и увеличить г12 на 1. 01 Ц ЕЦО 00 РММЛ. ЯТ) ОЯ )ОЧ 04 Я ТА Об ЕОХ 00 ЯТХ 07 1.01 08 Ю2 00 1ИС2 10 ЯЕА 11 МШ.
10 ЛМР ВЧТЕ/2 ЕХ1ТР ОИ.О ТЕМР АСС РО(0:4) ТЕМР(ЕХР) АСС(ЕХР) -Ц,1 1 РО ИОКИ ЕХХТР ОР10 ТЕМР РЧ(0:4) ТЕМР(ЕХР) АСС(ЕХР) -Ц,1 О АСС 1 РЧ(1:5) ««3 1 1 д есть половина размера байта. Подпрограмма умножения чисел с плавающей точкой. Снятие блокировки переполнения. ТЕМР +- о. гХ « — и. РЧ вЂ” ~ Ш 1 О. Умножить Г"„на 1,. Нормализовать, округлить и выйти нз подпрограммы. Подпрограмма деления чисел с плавающей точкой. Снятие блокировки переполнения ТЕМР «- о. РЧ « — к 1 1 1 г" О. 27 ОТУ РУ 00 1МОУ МОЕМ 09 ОгХКО НЕТ 3 Разделить. Нормализовать, округлить и выйти из подпрограммы.
Ненормализовано или делитель равен нулю. 1 Наиболее интересная особенность этой программы — подготовка к выполнению деления, осуществляемая командами в строках 23 — 26. Эти операции проводятся для того, чтобы обеспечить достаточную точность при округлении ответа. При < )1е~, непосредственно применив алгоритм М, можно сохранить результат в 4юрме «х 01 1 1 1» в регистре А, что сделает невозможным чистое округление без специального анализа остатка (он хранится в регистре Х). Поэтому в такой ситуации программа, вычисляет 1„, < — г"„/1„, гарантируя, что 1' либо равно нулю, либо во всех случаях нормализовано.
Процедура округления может оперировать пятью значащими байтами, возможно, проверяя, не равен ли остаток нулин Иногда может потребоваться перевод из представления с фиксированной точкой в представление с плавающей точкой и обратно. При помощи описанного вышо алгоритма нормализации легко получается программа перевода "из фиксированной в плавающую', Например, целое число переводится в форму с плавающей точкой с помощью следукяцей подпрограммы на языке М1Х.
01 РЕОТ БТ1 ЕХ1ТР Предполагаем, что гА = и есть целое число. 0г ЛОМ ОРЕО Снятие блокировки переполнения. 03 ЕМТ2 О+5 Установить "грубый" порядок. 04 ЕМТХ О 05 ЛМР МОКИ Нормализовать, округлить и выйти из подпрограммы. $ (10) Подпрограмма перевода "из плавающей в фиксированную" служит предметом упр. 14. 1) Пдтеря знака. Во многих машинах (к М1Х это не относится) команды сдвига регистров воздействуют на знаковый разряд, поэтому следует подробно анализировать операции сдвига, используемые при нормализации и изменении масштаба дробной части числа.
Часто знак теряется и при появлении "минус нуля". (Например, операторы 36-34 программы А ответственны за установку знакового разряда регистра А. См. также упр. 6.) 2) Невозможность прао яьного определения, что произошло исчезновение ияи переполнение порядка. Не следует проверять величину е до окончания операций округления и нормализации, так как предварительные проверки могут привести к ошибочным результатам. Исчезновение н переполнение порядка могут происходить и при выполнении сложения и вычитания, а не только при умножении и делении, и, несмотря на то что это событие довольно редкое, проверку необходимо проводить для каждого конкретного случая.