Д. Кнут - Искусство программирования том 2 (3-е издание) - 2001 (Часть 1) (1119452), страница 78
Текст из файла (страница 78)
7 и 8). Рассмотрим теперь с этой точки зрения операции сложения и вычитания. Вычитаные, естественно, заменяется сложением с инвертированием знака второго слагаемого. Для выполнения сложения используется раздельное сложение менее значимых и более значимых половин, обеспечивая при этом, разумеется, надлежащую обработку переноса. Сложности возникают, однако, вследствие использования прямого кода: можно, сложив менее значимые полсанны, получить неверный знак (этв ситуация возникает, когда знаки операндов противоположны и менее значимая половина меньшего операнда больше менее значимой половины большего операнда). Простейшее решение — заранее определить правильный знак. Поэтому на шаге А2 алгоритма 4.2.1А нужно положить не только условие е„> е„, но и (и) > )и(, Тогда можно быть уверенным в том, что знак результата будет знаком и.
В прочих отношениях программа сложения с удвоенной точностью очень похожа на программу с однократной точностью, но все выполняется дважды. Программа А (Сложение с удвоенной шочносшью). Подпрограмма ОРАОО складывает число удвоенной точности с плавающей точкой о, имеющее формат (1), с числом удвоенной точности в формате с плавающей точкой и. Причем предполагается, что о перед началом выполнения программы занесено в гАХ (регистры А и Х), а и первоначально хранится в ячейках АСС и АССА. Результат появляется одновременно в гАХ и в (АСС, АССХ). Подпрограмма ОРЯОВ вычитает и из и при соблюдении тех же соглашений. Предполагается, что оба входных операнда нормализованы и результат также нормвлизован. Заключительный фрагмент программы представляет собой процедуру нормализации в формате с удвоенной точностью, используемую и в других подпрограммах этого раздела. В упр.
5 показано, как можно существенно усовершенствовать эту программу. 01 АВЗ ЕОО 1: Ь Ол ЯТОМ ЕЦО О:О ОЮ ЕХРО ЕЦО 1:2 04 ОРЯЗ ЯТА ТЕМР 05 ЕОАИ ТЕИР Определение поля для абсолютного значения. Определение поля для знака, Поле порядка лля формата с удвоенной точностью. Вычитание с удвоенной точностью, Изменить знак и бб 07 08 УУ 18 11 13 18 Ц 18 18 17 18 18 80 81 88 88 81 88 Уб 87 88 УУ 88 81 88 88 81 88 Уб 87 88 УУ ЛО ОРА00 1Н 2Н 1Н ЯТЛ ЕХ1ТОР СИРА АСС(АВЗ) ЛС 1Р ЛЬ 2Г СМРХ АССХ(АВЗ) Л1Е 2Р ЗТА АНО ЯТХ АНОХ ЫА АСС ип АССХ ЕМТ1 АСС НОРЕ АНО(2) ЯТА ТЕМР Ы1М ТЕМР(ЕХРО) Ц)2 АССИХРО) ХМС1 0.2 ЗЛАХ 2 ЯНАХ 1,1 ЯТА А НО ЯТХ АНОХ ЗТА АНОХ(З10М) )Л)А АСС Ы>Х АССХ ЯОАХ 2 ЗТА АСС ЗОАХ 4 ЕМТХ 1 ЗТХ ЕХРО ЗЕС ЗТА 1Р(ЯТОМ) АОО АНОХ(0:4) ЯНАХ 4 ОВСА 1 А00 АСС(024) А00 АНО Сложение с удвоенной точность2о, Сравнить )е~ с )и), Если ~е) > )а~, произвести взаимнук2 замену и в+ е.
(АСС и АССХ находятся в последовательных ячейках,) 211+- -е,. г12 в- е„. 211 в ев — ев. Удалить порядок. Масштабирование посредством сдвига вправо. 02Л евсеев ев ев ег ев ев. Запомнить верный знак е в обеих половинах. (Известно, что и имеет знак результата.) гАХ+- а. Удалить порядок. а2 аг ив ив ив. ЗХРО в- 1 (см. ниже). 1 ав ив аг ив. См.
комментарии в тексте. Сложить 0 ев ев ег ев, Восстановить после занесения 1 (знак варьируется). Сложить более значимые половины, (Переполнения быть не может.) ОМОЕМ ОЕЕНО 2Н 1Н 11 18 18 й 18 Лб 87 18 18 80 88 81 88 ЛАМЕ 1Р ЛХМЕ 1Р ЗТА АСС ЛМР ОР ЗЛАХ 1 ОЕС2 1 СИРА О (1:1) ЛЕ 2В ЯНАХ 2 ЗТА АСС 10А ЕХРО 1МСА 0,2 ЛАМ ЕХРОМО ЗТА АСС(ЕХРО) СИРА 1(Еч 3) и Подпрограмма нормализацяи. 1,„в гАХ, г, = ЗАРО + г12. Если ги = О, присвоить е +- О.
Нормазизовать влево. Везущий байт нулевой? (Округление опущено.) Вычислить порядок результате. Он отрипателен7 Он занимает бозее двух байтов? вии00 =и +си~ е е е 0 0 = е,„+ ее~ =сто хат нвиии юесее =енж х~ф = с сч х с„, =и хе Рис. 4. Умножение с удвоенной точностью чисел, имеющих дробные части длиной В байт.
Переслать ответ в гА. Выход из п<дпрогрвммы. Когда в этой подпрограмме складываются менее значимые половины, в то слово, о котором известно, что оно имеет верный знак, слева вставляется дополнительный разряд "1". После выполнения сложения этот байт может равняться О, 1 или 2 в зависимости от обстоятельств и все эти тря случая обрабатываются одновременно. (Ср. данный фрагмент с довольно громоздким методом формирования дополнения, который использовался в программе 4.2.1А.) Стоит отметить, что после выполнения команды' в строке 40 регистр А может оказаться равным нулю, ио аккумулятор будет содержать правильный знак, который должен быть приписан результату, если регистр Х не равен нулю 1это есть следствие способа, с помощью которого в компьютере ИХХ определяется знак результата, равного нулю).
Поменяй мы местами строки 39 и 40, программа давала бы неверный результат, хотя обе команды имеют один и тот же код "АОО'Ч Рассмотрим теперь умножение с удвоенной точностью. Произведение имеет четыре компоненты, схематически представленные на рис. 4. Так как нам нужны только восемь крайних слева байтов, можем игнорировать разряды, расположенные справа от вертикальной черты на диаграмме. В частности, это означает, что нет необходимости даже вычислять произведение двух менее значимых половин.
Программа М (Умноисеиие с удвоенной нючиосгпью), Соглашения относительно входных и выходных данных для этой подпрограммы те же, что и для программы А. 01 ВТТЕ ЕОО 1 (4: 4) 06 ОО ЕОО ВТТЕеВТТЕ/2 03 ОРИО1 ЗТЛ ЕХТТРР 04 ЗТА ТЕИР дб З1.АХ 2 06 ЗТА А ВО Размер байта. Избыток порядка удвоенной точности. Умножение с удвоенной точностью. Удалить порядок. 66 Л. 67 ЕХРОЧО НЕТ 66 ЕХРОИО НЕТ Бд ВН Ы)А бд 9Н ЗТХ 61 ЕХ1ТОР ЛИР бй АВО СОМ 66 АВОХ СОИ 64 АСС СОМ 66 АССХ СОМ 66 ЕХРО СОМ ВР 20 10 АСС АССХ 0 О 0 О О Аккумулятор длв чисел с плавающей точкой.
Часть "грубого" порядка. $ ЕХРО +- е, + е, г12 «- — ОО. Удалить порядок. и,„, еь ажхж' )а х щ(. О х х х х. (Переполнение невозможно.) а„х я Верный знак результата. Теперь приготовиться к сложению всех частичных произведений. О х х х х. (Переполнение невозможно.) Обратите внимание на, аккуратное обращение со знаками в этой программе, а также на тот факт, что диапазон представления порядков позволяет вычислять порядок результата при помаши индексного регистра.
Программа М, вероятно, несколько кхромает' в отношении точности, так как она использует только информацию, расположенную на рис. 4 слева от вертикальной черты, а это может привести к ошибке до двух единиц в наименее значимом байте. Как достичь несколько большей точности, вы узнаете из упр. 4. Программа деления с удвоенной точностью чисел в формате с плавающей точкой — самая трудная или, по крайней мере, самая страшная на вид из всех программ., которые до сих пор рассматривались в этой главе.
На самом деле она не такая уж сложная, если разобраться в принципе ее работы. Запишем пару чисел, уЧае~нушщнл В ДЕЛЕНИИ, В ВкдЕ (Нж + «Н1)1(Е + «щ), Гдс « — ВЕЛИЧИНа, Обратиая размеру машинного слова, причем предполагается, что число е нормализовано. Эту дробь можно разложить в ряд: вы+«ню и,„+«и«( 1 Сы + «Н1 Фж ~ 1 + «(Ф1/Эж) =" „'.
'('- (;".) "( —.".')*-") 07 бб ОЯ 1б 11 1Я 1Я 14 15 1б 17 1Я 19 ЯО Я1 ЯЯ ЯЯ Яб Яб Яб Я7 Яб ЯЯ Яд 81 ЮЯ ЯЯ ЗТХ АЕОХ ЬОА ТЕИР(ЕХРО) А00 АСС(ЕХРО) ЯТА ЕХРО ЕМТ2 -ЦЦ ЬОА АСС ЬОХ АССХ ЯЬАХ 2 ЗТА АСС ЗТХ АССХ ИОЬ АКОХ БТА ТЕИР ЬОА АВО(АВЯ) ИОЬ АССХ(АЯЗ) ЗВА 1 А00 ТЕИР(1:4) ЗТА ТЕИР ЬОА АЯО ИОЬ АСС ЗТА ТЕИР (ЯТОМ) ЗТА АСС ЗТХ АССХ ЬВА АССХ(О:4) А00 ТЕИР ЗИАХ 4 А00 АСС Л~Р ОМОЕИ (Переполнение невозможно.) Нормализовать и выйти из падпрограммы. а Так как О < ~ц! < 1 и 1/Ь < ~о ~ < 1, получим ~о~/в ~ < Ь и можно пренебречь ошибкой, связанной с отбрасыванием членов порядка ст. Наш метод состоит, таким образом, в том, чтобы вычислить ю,„+ снд = (иж + ен~)/о„„а затем вычесть из результата с раз ш,и~/о В приведенной ниже программе команды строк 27-32 выполняют нижнюю половину сложения с удвоенной точностью, используя иной метод получения нужного знака, чем в программе А.
Программа Х) (Деление с рдеоенной шочностью). Эта программа работает при тех же предположениях, что и программы А и ЬЕ д1 ОРВХЧ ЯТ1 ЕХ1ТВР 02 ЛОЧ ОРОС Деление с удвоенной точностью, Убедиться, что индикатор переполнения выключен. Удал итыюрядок. ела. ш. ЕХРО е- е — е„. г12 ~- Н1+ 1. 16 ЯТА 17 ЯВАХ 18 ВЛЧ 19 ЗТА 20 1Л)А 21, ЕИТХ 22 01Ч 28 ЛОЧ 2Л ИЛ~. 26 ЯНАХ 26 ЯВС 27 ЯОВ 28 ВЕСА 28 ЗОВ 80 ЛОЧ 81 1ИСХ 82 ЗЕС 88 АВО 8Л ЗТА 86 1.0А 86 ЛИР 87 ВЧХНОВ НЕТ гА е- ЦЬ'ш/е Ц/Ь". Вызывает ли деление переполненнеу гАХ е — (в„,ш/Ьо,~ (приблизительно). Умножить на Ь и сохранить ведущий байт в гХ. Вычесть )щ~.