AOP_Tom2 (1021737), страница 77
Текст из файла (страница 77)
в4.2.3. Вычисления с удвоенной точностью До сих пор речь шла об арифметических операциях над числами с однократной точностью в формате с плавающей точкой. Это, по существу, означает, что числа а формате с плавающей точкой, с которыми мы имели дело, могли храниться в одном машинном слове. Если вычисления в таком формате не обеспечивают достаточной для приложении точности, ее можно увеличить программными средствами, используя для представления каждого числа два или больше слов памяти. Хотя проблема вычислений с высокой точностью будет в общем виде рассмотрена в разделе 4.3, имеет смысл отдельно проанализировать возможности формата с удвоенной точностью представления. Специальные методы, которые используются при работе с таким форматом, практически непригодны для большей точности.
Кроме того, вычисления с удвоенной точностью разумно считать темой, имеющей самостоятельное значение, так как это первый шаг за пределы однократной точности и, работая в этом формате, можно удовлетворительно решать многие задачи, не требующие чрезвычайно высокой точности. Материал настоящего раздела был актуален, когда автор работал над лерФ* вым изданием этой книги в начале бО-х годов. Но с тех пор компьютеры были значительно усовершенствованы и причины, ло которым пспользовалпсь операции с удвоенной точностью, ушли а прошлое. Хаким образом, на сегодняшншт день данный материал представляет скорое историчессснй интерес. В планируемом четвертом издания этой книги раздел 4.2.1 будет называться "Нормалссзованные вычисления", а в настоящем разделе, 4.2.3, будут рассматриваться "необычные числа".
В новой редакции данного раздела внимание будет сосредоточено на специфлческпх аспектах стандарта АХИ/1ЕЕЕ Ясалс(агс) 754с представлении необычных числовых вешичссн наподобие бесконечности н неопределенности (так называемых Жа)Уз). (См. ссылки на литературу в колце раздела 4.2.1.) Тем не менее давайте все-таки бросим последний взгляд на ндесс, которые кажутся устаревшими, хотя бы для того, чтобы извлечь нз них урок ла будушее. Арифметические операции с удвоенной точностью требуются чаще всего при работе с числами в формате с плавающей точкой и значительно реже — при работе с числами в формате с фиксированной точкой.
Исключением является, пожалуй, лишь область статистических расчетов, в которой для вычисления сумм квадратов и перекрестных произведений обычно используются числа с фиксированной точкой и имеет смысл выполнять операции с удвоенной точностью. Поскольку вычисления с удвоенной точностью для чисел с фиксированной точкой проще, чем с плавающей, наш анализ будет ограничен этим последним случаем. Удвоеннан точность очень часто желательна для увеличения не только точности дробных частей чисел в формате с плавающей точкой, но н интервала изменения порядка. Таким образом, в этом разделе речь пойдет о следующем двухсловном представлении чисел с плавающей точкой в компьютере М1Х: Здесь используютсн 2 байта для хранения порядка и 8 байт для дробной части.
Порядок имеет избыток Ьт/2, где Ь вЂ” размер байта. Знак находится в слове, содержащелг более значимые разряды; знак другого слова принято полностью игнорировать. Наш анализ арифметики с удвоенной точностью будет в значительной степени лэашинно-ориентированным, потому что, только рассматривая задачи, которые возникают при разработке программ, можно правильно воспринять предмет. Поэтому для понимания данного раздела важно внимательно изучить приводимые ниже программы для М1Х. Здесь мы постараемся "отдалиться" от идеалистических целей достижения точности, продекларированных в двух предыдущих разделах; рассматриваемые ниже процедуры не включают округления результатов и допускают наличие некоторой ошибки.
Пользователи не рискуют слишком уж доверять такого рода подпрограммам. Существуют весьма основательные причины блокировать все возможные источники ошибок при вычислениях с однократной точностью, но теперь мы сталкиваемся с иной ситуацией, и вот почему. (а) Дополнительные фрагменты программ, требующиеся для обеспечения правильности округления во всех случаях, довольно объемны, так что, скажем, программа, реализующая такой алгоритм, занимала бы раза в два больше места и требовала бы для выполнения раза в пачтора больше времени. Сравнительно легко можно разработать прекрасные программы для вычисления с однократной точногтью, но при вычислениях с удвоенэюй точностью лицом к лицу мы сталкиваемся с ограниченными возможногтими компьютеров*.
Аналогичная ситуация возникает и в отношении других подпрограмм, выполняющих вычисления в формате с плавающей точкой. Нельзя ожидать от подпрограммы вычисления косинуса определения точного значения гоипп(сов х) для всех х, поскольку это фактически невозможно. Вместо этого подпрограмма вычисления косинуса должна выдавать наименьшую возможную относительную ошибку при всех возможных значениях х, которую можно получить за разумное время вычисления. Конечно, программист должен стараться насколько это возможно обеспечить выполнение математических Автор, очевидно, имеет в виду компьютеры — современники первого издания этой книги.— Лрмм. перев.
законов, существующих в отношении вычисляемых функций, например ! (соз) х! < 1; (сов) х > (со~в у при О < х < у < к. асов)в ( — х) = (соэ) х; (о) Программы вычислений с однократной точностью — зто "хлеб насущный" на каждый день, который должен быть доступен каждому, кто хочет работать с арифметикой с плавающей точкой. А удвоенная точность обычно используется в ситуациях, когда "чистые" результаты не так уж и важны. Разница между вычислениями с семью илн восемью значащими разрядами достаточно заметна, а разница между вычислениями с 15 или 16 разрядами нас не очень беспокоит. Вычисления с удвоенной точностью чаще всего используются на промежуточных этапах решения сложной задачи с однократной точностью, а потому в полном спектре возможностей ~яких процедур нет необходимости.
(с) Весьма поучительно проанализировать эти процедуры с тем, чтобы увидеть, насколько серьезной может быть ошибка, поскольку источники ошибок типичны и для "плохих" подпрограмм, работающих с однократной точностью (см. упр. 7 и В). Рассмотрим теперь с этой точки зрения операции сложения и вычитания. Вычитание, естественно, залленяется сложением с инвертированием знака второго слагаемого.
Для выполнения сложения используется раздельное сложение менее значимых и более значимых половин, обеспечивая при этом, разуллеется, надлежащую обработку переноса. Сложности возникают, однако, вследствие использования прямого кода: можно, сложив менее значимые половины, получить неверный знак (эта ситуация возникает, когда знаки операндов противоположны и менее значимая половина меныпего операнда больше менее значимой половины большего операнда), Простейшее решение — заранее определить правильный знак.
Поэтому на шаге А2 алгоритма 4.2.1А нужно положить не только условие е„> е„, ио и (и( > )о(. Тогда можно быть уверенным в том, что знак результата будет знаком и. В прочих отношениях программа сложения с удвоенной точностью очень похожа на программу с однократной точностью., но все выполняется дважды. 01 АББ ЕЦО 1 ". б 02 Б1ОМ ЕЦО О:О 00 ЕХРР ЕЦЦ 1:2 04 ОГБОВ БТА ТЕМР 00 1РАМ ТЕМР Определение поли для абсолютного значения. Определение поля для знака.
Поле порядка для формата с удвоенной точностью. Вычитание с удвоенной точностью. Изменить знак о. Программа А (Слооюение с удвоенной шочностпью). Подпрограмма ОРАОБ складывает число удвоенной точности с плавающей точкой о, имеющее формат (1), с числом удвоенной точности в формате с плавающей точкой и. Причем предполагается, что о перед началом выполнения программы занесено в гАХ (регистры А и Х), а и первоначально хранится в ячейках АСС и АССХ.
Результат появляется одновременно в гАХ и в (АСС, АССХ). Подпрограмма РгБОВ вычитает о из и при соблюдении тех же соглашений. Предполагается, что оба входных операнда нормализованы и результат также нормализовав. Заключительный фрагмент программы представляет собой процедуру нормализации в формате с удвоенной точностью, используемую и в других подпрограммах этого раздела. В упр. 5 показано, как можно существенно усовершенствовать эту программу. 41 12 ЗЯ б4 Зб 10 47 Зб ЗЯ 80 81 82 88 84 бб ОМОЕМ РЕЕВО 2Н 1Н ЗАМЕ 1Р ЗХМЕ 1Р ЯТА АСС ЗМР 9Р БЬАХ 1 ОЕС2 1 СИРА =0"-(1.'1) ЗЕ 2В БВАХ 2 БТА АСС ЬОА ЕХРО 1МСА 0,2 ЗАМ ЕХРОМО БТА АСС(ЕХРО) СМРА =1(З:3)а Нормализовать влево.
Об 07 08 09 10 11 12 1Я Ц 18 1б 17 18 Ьб 20 21 22 28 24 28 20 27 28 29 80 81 82 ЯЯ ЯЗ Яб Яб 87 88 89 ЗО ОРАОО 1Н гн 1Н БТЗ ЕК1ТОР СМРА АСС(АВБ) ЗС 1Р ЗЬ 2Р СМРХ АССХ(АВБ) ЗЬЕ 2Р БТА АНС БТХ АВСХ ЬОА АСС ЬОХ АССХ ЕМТ1 АСС МОЧЕ АВС(2) БТА ТЕМР Ь01М ТЕМР(ЕХРО) Ь02 АСС(ЕХРО) 1МС1 0,2 БЬАХ 2 БНАХ 1,1 ЯТА АНС БТХ АНСХ БТА АНСХ(Б1СМ) ЬОА АСС ЬОХ АССХ ЯЬАХ 2 БТА АСС ЯЬАХ 4 ЕМТХ 1 БТХ ЕХРО БНС 1 БТА 1Р(Б1СМ) А00 АНСХ(0:4) ЯНАХ 4 ОЕСА 1 АОО АСС(0:4) АОО АНС Сложение с удвоенной точностью. Сравнить (е( с (а(. Если (е( > (а(, произвести взаимную замену и ++ е.
(АСС и АССХ находятся в последовательных ячейках.) г11 в — -е„. г12 <- е„. гП +- е„— е„. Удалить порядок. Масштабирование посредством сдвига вправо. О ев ев ев щ ев ев ег ев ев, Запомнить верный знак е в обеих половинах. (Известно, что а имеет знак результата.) гАХ +- и. Удалить порядок. ив ив ив ив ив. ЕХРО в- 1 (см. ниже). 1 ав ав иг ав. См, комментарии в тексте. Сложить 0 ев ев ег ев.