2.2.1. МЕТОДИКА СЛОЖЕНИЯ И ВЫЧИТАНИЯ
Ранее, в § 1.2, было показано, что сложение чисел с фиксированной запятой — точная операция, поскольку она не использует округление результата и не вносит в него какую-либо дополнительную погрешность, кроме погрешностей слагаемых.
Если слагаемые точны, то точна и сумма. Если слагаемые — числа ограниченной точности, то точность суммы определяется выражениями (1.15) и (1.16). В отличие от этого сложение чисел с плавающей запятой является в общем случае неточной операцией, вносящей дополнительную погрешность в результат. Поэтому сумма чисел с плавающей запятой даже при точных слагаемых будет, вообще говоря, числом ограниченной точности. Операцию вычитания чисел с плавающей запятой, представленных в дополнительных кодах, можно свести к операции сложения уменьшаемого с дополнительным кодом вычитаемого. Поэтому в дальнейшем обсудим операцию алгебраического сложения (выполняет сложение и вычитание чисел в зависимости от знаков слагаемых!.
Формула (2.11) определяет процесс выравнивания порядков и алгебраического суммирования мантисс с равными порядками по правилам арифметики с фиксированной запятой. При сложении мантисс возможны две ситуации: переполнение мантиссы суммы и отсутствие переполнения. В первом случае необходимо устранить переполнение путем сдвига мантиссы вправо на один двоичный разряд (делением на 2) и соответствующим увеличением на 1 порядка суммы. Эту операцию называют нормализацией вправо. Во втором случае необходимость в нормализации вправо отпадает. Действия на этапе нормализации вправо отражает формула (2.12).
При сложении близких по величине чисел с разными знаками возможно уменьшение значности мантиссы
тиссы суммы. При программной реализации нормализации влево величина г, как правило, не определяется, а сдвиги влево и коррекция порядка производятся до тех пор (при ненулевой мантиссе), пока не будет выполнено условие (2.3).
При реализации процессов, описываемых формулами (2.10) — (2.13), возможно появление четырех особых ситуаций, которые должны выявляться программными средствами. При выравнивании порядков возможен слѵ-
суммы, т. е. появление в левых разрядах формата мантиссы незначащих нулей. В этом случае необходимо нормализовать мантиссу согласно условию (2.3). Эта опе-
обнулении результата в случае антипереполнения порядка [32 -34]. Основная прогрешность возникает при денормализации мантиссы, поскольку при последующей нормализации суммы вправо эта первоначальная 'погрешность может только уменьшиться, а при нормализации суммы влево погрешность можно вообще устранить, если сохранить хотя бы два первых выдвинутых разряда денормализованной мантиссы и использовать их.при нормализации суммы влево (незначащие нули могут по-
Исходные слагаемые являются числами ограниченной точности, граничные относительные ошибки представления которых определяются неравенством (2.6). Согласно формуле (1.14), граничная относительная ошибка суммы ре превосходит ошибки наименее точного слагаемого. Однако округление суммы увеличивает эту ошибку на величину, вычисленную по формуле (2.14), т. е. в 2 раза, и сумма становится менее точной, чем слагаемые. Ошибку округления можно уменьшить, если использовать правило симметричного округления (1.9).
Далее приведены программы сложения чисел с плавающей запятой СДПЗЗ и СДП34, реализующие рассмотрений
ные алгоритмы сложения для короткого (8,16) и длинного (8, 24) форматов чисел.
2.2.2. ФОРМАТ (8, 16) +(8, 16)= (8, 16)
Программа СДПЗЗ выполняет сложение чисел, представленных в формате (8, 16) (см. рис. 2.3, а):
Прежде всего программа проверяет слагаемые на нулевое значение, обращаясь к вспомогательной подпрограмме КОМЗ:
Аналогичная подпрограмма КОМ4 используется ниже в программе СДП34 для проверки на нуль четырехбайтных чисел.
Поскольку сумма размещается на месте первого слагаемого, то при равенстве нулю второго слагаемого нет необходимости выполнять сложение; аналогично при равенстве нулю первого слагаемого сумма равна второму слагаемому, перемещенному на место первого. Перемещение выполняет подпрограмма ПМЗ:
Аналогичная подпрограмма ПМ4 используется ниже в программе СДП34 для перемещения четырехбайтного слагаемого (подпрограмма ПМ4 в отличие от бесцикловой ПМЗ организует пересылку байтов в цикле, что уменьшает длину подпрограммы). Использование подпрограмм КОМЗ и ПМЗ сущестенно сокращает среднее время выполнения программы СДПЗЗ, поскольку нулевые слагаемые достаточно часто встречаются в вычислительных процессах. При отсутствии необходимости проверки слагаемых на нуль программу СДПЗЗ можно упростить на 20
байт и ускорить на 180 тактов, исключив фрагменты проверки слагаемых.
Такой обмен повышает регулярность структуры программы и ее ясность, поскольку однозначно понимается, что большее слагаемое находится всегда на месте первого слагаемого. Этот прием уменьшает в дальнейшем количество проверок и длину программы. Но, с другой стороны, выполнение обмена слагаемых требует затрат и памяти, и времени. В данной программе компромисс сделан в пользу ясности.
Программа ДМАН2 сохраняет последние сдвинутые разряды мантиссы с целью их использования при округлении суммы. После сложения мантисс выполняется анализ суммы на переполнение, и знак суммы заносится в старший разряд байта порядка.
При сложении отрицательных мантисс вида 8000Н происходит то единственное переполнение, которое не фиксируется в модифицированном коде, но которое необходимо выявлять и устранять. Признаком такого переполнения является отрицательная сумма с нулевой мантиссой. Устранение переполнения производит программа ПМАН2:
Программа ПМАН2 контролирует верхнюю границу порядка и в случае опасности переполнения порядка устанавливает признак переноса CY = 1, который используется для аварийного анализа в основной программе. Если в результате сложения не было переполнения мантиссы суммы, она проверяется на условие нормализации и, если необходимо, нормализуется подпрограммой НМАН2:
Программа НМАН2 проверяет условие нормализации мантиссы, представленной в дополнительном коде (в этом случае наличие единицы в старшем цифровом разряде мантиссы еще не свидетельствует о ее нормализованно- сти), и при нормализации влево контролирует порядок суммы на антипереполнение, устанавливая признак переноса CY = 1 при антипереполнении (порядок суммы равен нулю). В заключение сложения выполняются симметричное округление суммы, устранение, если необходимо, переполнения мантиссы после округления и ее запись в память на место первого слагаемого. Заметим, что симметричное округление по первой отбрасываемой цифре денормализованной мантиссы (в случае, если не было нормализации вправо), реализованное в программе, эффективно лишь при сложении чисел с одинаковыми знаками, поскольку только в этом случае знак отбрасываемой цифры совпадает со знаком суммы, и, следовательно, округление выполняется верно, иначе ошибка округления превысит ошибку несимметричного округления. Если такая ситуация нежелательна с точки зрения использования программы в системе, можно либо усложнить процесс симметричного округления в программе, введя анализ знака ошибки, либо упростить программу, исключив это округление.
Набор положительных и отрицательных чисел, представленных в формате (8,16), приведен в табл. 2.3. Эти числа можно использовать для тестовой проверки программы СДПЗЗ (в рамках представленного множества).
2.2.3. ФОРМАТ (8.24)+ (8,24) =(8.24)
Программа СДП34 выполняет сложение чисел, представленных в формате (8,24) (см. рис. 2.3,6)-
Структура ее аналогична структуре программы СДПЗЗ, за исключением того, что переполнение мантиссы суммы проводится без применения модифицированных кодов. Такое решение для микропроцессора более экономично, требует меньше затрат памяти. Программа обращается к вспомогательным подпрограммам контроля слагаемых на нуль КОМ4 и их перемещения ПМ4, приведенным выше, к подпрограммам обмена слагаемых ОБМ4, денормализации мантиссы ДМАНЗ, устранения переполнения мантиссы суммы ПМАНЗ и ее нормализации влево НМАНЗ:
Структура этих программ аналогична структуре программ, рассмотренных выше.
Набор положительных и отрицательных чисел, представленных в формате (8, 24), приведен в табл. 2.4.
Табл. 2.4. Числа с плавающей запятой в формате (8, 24)
2.3.