AOP_Tom2 (1021737), страница 67
Текст из файла (страница 67)
(2) Термин "двоичное число с плавающей точкой", как всегда, будет означать, что Ь =. 2, термин "десятичное число с плавающей точкой"' — что Ь = 10 и т. д. Используя 8-разрядные десятичные числа с плавающей точкой с избытком 60, можно, например, написать число Авогадро Х = (74, +.60221400); постоянная Планка Ь = (24, +.66261000). Две компоненты, е и 1, числа с плавающей точкой называются его порядком и дробной часшью соответственно. (Иногда используются и другие названия, особенно 'характеристика" и "мантисса"; однако слово "мантисса" для обозначения дробной части приводит к путанице в терминологии, так как этот термин употреблнется совсем в другом смысле в теории логарифмов и, кроме того, английское слово "шапбэва" означает "мало дающее добавление".) В компьютере И1Х числа с плавающей точкой имеют вид (4) Это представление с плавающей точкой по основанию 6 с избытком д, с четырьмя значащими "цифрами", где Ь есть размер байта (т.
е. 6 = 64 или 6 = 100) и д равняется ЯЬ) . Дробная часть ранна ~ у у у у, а порядок и е находится в интервале 0 < е < 6. Такое внутреннее представление типичный пример соглашений, которые приняты в большинстве существующих компьютеров, хотя основание Ь здесь гораздо больше, чем обычно используемое.
В. Нормализованные вычисления. Число с плавающей точкой (е,у) является нормаэизованным, либо если наиболее значимая цифра в представлении ~ отлична от нуля, так что (а) 1УЬ<)У) <1, либо если 1 = О, а е принимает наименьшее возможное значение. Чтобы установить, какое из двух нормализованных чисел с плавающей точкой имеет ббльшую величину, достаточно сравнить их порядки; только если порядки равны. нужно анализировать и дробные части.
Болыпинство ныне применяемых стандартных подпрограмм работает почти исключительно с нормализованными числами: предполагается, что входные значения для подпрограмм нормализованы, а результаты всегда нормализуются. При реализации этих соглашений в систомных библиотеках мы теряем возможность представлять некоторые числа очень малой величины (например. значение (О, .00000001) не может быть нормализовано без формирования отрицательного порядка), но мы выигрываем в скцрости, единообразии и получаем возможность сравнительно легко ограничить относительную ошибку вычислений. (Арифметика ненормаэизованных чисел с плавающей точкой будет рассмотрена в разделе 4.2.2.) Рассмотрим теперь арифметические операции над нормализованными числами с плавающей точкой подробнее. Попутно затронем и структуру подпрограмм, реализующих эти операции (предполагая, что в нашем распоряжении имеется компьютер без аппаратной реализации этих арифметических операций).
В стандартных подпрограммах для выполнения арифметических действий над числами с плавакицей точкой, написанных на машинном языке, в очень большой степени используются крайне специфические особенности конкретной модели компьютера. Именно поэтому так мало сходства между двумя подпрограммами, скажем, сложения чисел с плаваюгцей точкой, написанными для разных машин.
Все же тщательный анализ большого числа подпрограмм как для двоичных. так и для десятичных компьютеров показывает, что в действительности данные программы имеют много общего, и обсуждение этой темы, вполне возможно, не зависит от конкретной машины. Рнс. й. Сложение чисел с плавающей точкой. Первый (и наиболее трудный!) из алгоритмов, обсуждаемых в этом разделе,— это процедура сложения чисел с плавающей точкой: (б) (е„, у„) 9 (е„, у,.) = (е, Х ). Ввиду того что арнфметнческяедействня над числами с плавающей точкой являютсч по самой своей сути прнблнженнылпб а не точнымн, для обозначения операций сложения, вычитания, умножения н деления с плавающей точкой здесь будут использоваться "округленные" символы чтобы отличать приближенные операции от точных.
Идея, лежащая в основе сложения с плавающей точкой, довольно проста. Полагая, что е„) е„, формируем результат по принципу ем = е, У = У + Х,/6'" (такнм образом, выравнивается положение разделяющих точек н соответственно положение разрядов слагаемых), а затем нормализуем результат. Может возникнуть несколько ситуаций, которые делают выполнение этого процесса нетривиальным; более точное описание метода дается в следующем алгоритме.
Алгоритм А (Сложение чисел с плавающей точкой). Для заданных р-рвзрядных нормализованньгх чисел с плавающей точкой н = (е„, у„) и е = (е„, у,) по основанию 6 с избытком о строится сумма ю = о Ю с. Данный алгоритм (рис. 2) можно использовать и для вычитания чисел с плавающей точкой, если е заменить на — с. А1. (Распаковать.) Выделить порядок и дробную часть в представлениях для и и е.
А2. [Обеспечить выполнение условия е„> е„.] Если е„( е„, поменять местами и и ш (Во многих случаях удобнее совместить шаг А2 с шагом А1 или с каким- нибудь из последующих шагов.) АЗ.[Установить е,.] Установить е„, (- е„. А4. [Проверить е„— е„.] Если е„— е„> р + 2 (больщая разница в порядках), установить у' +- у„и перейти к шагу А7. (Так как предполагается, что и нормализовано, на этом выполнение алгоритма можно было бы и закончить, но часто полезно использовать операцию сложения с нулем для гарантированной нормализации любого, возможно, и ненормализованного, числа.) Аб. [Масштабировать, сдвинув вправо.! Сдвинуть у„вправо на е„— е„позиций, т.
е. разделить ~„на 6'" '". [Замечание. Величина сдвига может достигать р+ 1 разрядов, вследствие чего для выполнения следующего шага (сложения дробной части у„с у„,) потребуется аккумулятор, способный хранить 2р+1 цифр по основанию Ь справа от позиционной точки. Если такого вместительного аккумулятора нет, можно сократить сдвиг до р+ 2 или р+ 3 разрядов, но с соответствующими предосторожностями; подробности обсуждаются в упр. 5.] А6. [Сложить.] Установить у,„< — у + уе.
А7. [Нормализовать.] (В этот момент (ем, (,„) представляет сумму и и в, но ]з [ может содержать более р цифр и может быть больше единицы или меньше 1/6.) Выполнить описываемый ниже алгоритм Х, который нормализует и округлит (е, З ), а также сформирует окончательный результат, 3 Алгоритм Х (Нормализация). "Грубый порядок" е и "сырая дробная часть" з приводятся к нормализованному виду с округлением при необходимости до р разрядов. В этом алгоритме (рис. 3) предполагается, что [Д < 6.
Х1. [Проверить 11 Если Щ > 1 (переполнение дробной части), перейти к шагу 1ч4. Если у = О, установить е равным его наименьшему значению и перейти к шагу 1ч7. Я2. [у' нормализовано?] Если Щ > 1/Ь, перейти к шагу Х5. 1ч 3. [Масштабировать, сдвинув влево.] Сдвинуть у на один разряд влево (т. е. умножить на Ь) и уменьшить е на 1. Возвратиться к шагу Х2. 1ч 4. [Масштабировать, сдвинув вправо.] Сдвинуть у вправо на один разряд (т.
е. разделить на Ь) и увеличить е на 1. Хб. [Округлить.] Округлить у до р разрядов. (Это означает, что у изменяется до ближайшего кратного Ь г. Возможно, что (Ь"у) шо61 = 1, т. е. имеется два ближайших кратных. Если Ь четно, то заменяем ( ближайшим кратным Ь таким, что Ь"з" + -Ь нечетно (обозначим результат округления в таком случае через Г').
Более подробное обсуждение аспектов округления приводится в разделе 4.2.2.) Важно отметить, что операция округления может привести к равенству Щ = 1 (переполнение при округлении); в такой ситуации следует вернуться к шагу' Х4. 1ч6. [Проверить е.] Если порядок е слишком велик, т. е. больше допустимой границы, это воспринимается, как выполнение условия переполнения порядка. Если е слишком мал, зто воспринимается, как выполнение условия исчезновения Рис. 3.
Нормализация (е, Т). порядка. (Дополнительная информация по этому вопросу приводится ниже; эти ситуации интерпретируются обычно, как сигнал об ошибке, в том смы<ле, что результат не может быть представлен в виде нормализованного числа с плавающей точкой из требуемого интервала значений,) тз7. [Упаковать.) Объединнть порядок е и дробную часть Т' для выдачи искомого результата. 1 Несколько простых примеров сложения чисел с плавающей точкой рассматривается в упр. 4. Приведенные ниже подпрограммы для сложения и вычитания на компьютере М1Х читал, имеющих форму (4), служат примером программной реализации алгоритмов А ц ."з.
Эти подпрограммы извлекают одно входное значение и по символическому адресу АСС, другое входное значение о извлекается из регистра А при входе в подпрограмму. Результат ш одновременно появляется в регистре А и в поле АСС. Таким образом, последовательность команд (7) ЫА А; АОО В; ЯОВ С; БТА О, работающих с числами с фиксированной точкой, соответствовала бы такой после- довательности команд, работающих с числами " плавакицей точкой: ООА А, БТА АСС; т.ОА В, ЗМР ГАОО; ЫА С, оМР РВОВ; ЯТА О. (8) Программа А (Сложение, омчитпание и нормализация).