Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Арифметика раздел 5.doc
Скачиваний:
7
Добавлен:
14.08.2019
Размер:
975.36 Кб
Скачать

5.4. Запись чисел в формат с плавающей точкой

Стандарт IEEE 754 предопределяет, что система записи числа в формат с плавающей точкой получает от пользователя указание о способе округления числа посредством переменной Режим. Применяют те же способы округления действительных чисел, что и при записи чисел в формат с фиксированной точкой, а именно:

  • до ближайшего числа;

  • до нуля;

  • до ;

  • до .

Округляют нормализованную мантиссу до точности формата подобно тому, как это делают при округлении числа с фиксированной точкой (раздел 3.3.2).

Если мантисса исходного числа равна нулю, система записи записывает в формат результата код нуля со знаком исходного числа.

Если отбрасываемые при округлении разряды мантиссы не равны нулю, складывается исключительная ситуация потери точности.

Если сохраняемые разряды мантиссы до округления равны 1.11…1 и при округлении необходимо увеличить мантиссу до ближайшей большей, то порядок увеличивают на 1 и принмают мантиссу равной 1.00…0.

Если порядок нормализованного и округленного числа , складывается исключительная ситуация переполнения формата.

Если порядок нормализованного и округленного числа и длина цепочки нулей в младших разрядах округленной мантиссы не меньше , то в формат результата записывают ненормализованное число с мантиссой сдвинутой вправо на разрядов.

Если порядок нормализованного и округленного числа и длина цепочки нулей в младших разрядах округленной мантиссы меньше , складывается исключительная ситуация потери значимости. Учтите, что округление округленного результата недопустимо.

При отсутствии исключительных ситуаций система записи отправляет округленный результат в формате результата по назначению.

Действия системы записи в исключительных ситуациях рассмотрены в разделе 5.5.

5.5 Исключительные ситуации

В процессе вычислений складываются ситуации, которые могут при некоторых обстоятельствах стать причиной недопустимых ошибок в результатах выполнения программы. Такие ситуации называют исключительными. Различают пять типов исключительных ситуаций: переполнение, потеря точности, потеря значимости, деление на нуль, невыполнимая операция. Первые три из них складываются при записи результата выполнения операции в формат результата, а две последние, – в начале выполнения операции. Чтобы предотвратить негативные последствия система (аппаратура и/или программа), выполняющая операции, должна уметь проявлять исключительные ситуации и при их обнаружении выдавать на свой выход сигнал запроса на прерывание и переменную играющую роль признака сложившейся ситуации. Пользователь (человек или программа) в зависимости от известных ему обстоятельств может игнорировать это событие или прервать вычисления с целью его обработки и принятия решения о способе дальнейших вычислений. Если пользователь игнорирует событие (блокирует сигнал прерывания), система формирует результат выполнения операции заданный по умолчанию. Обработка может выполняться стандартным обработчиком исключительной ситуации, предусмотренным в системе, или обработчиком, специально созданным пользователем для конкретной ситуации, возникающей при выполнении данной конкретной команды программы.

Стандарт IEEE 754 предусматривает, что система, выполняющая операции, обнаружив исключительную ситуацию, устанавливает в 1 флаг, соответствующий ситуации (флаг – однобитовая переменная признака ситуации) и формирует сигнал прерывания. Сигнал прерывания может быть заблокирован пользователем посредством переменной Режим, если он игнорирует сигнал прерывания. В случае блокирования прерывания обработка исключительной ситуации не выполняется, и система самостоятельно определяет результат выполнения операции по правилу, оговоренному стандартом.

Блокирование прерывания не изменяет состояния флагов доступных пользователю. Сброс флагов в 0 может выполнить только заказчик, – пользователь. Пользователь может сохранять все флаги и восстанавливать их. Это позволяет пользователю, заблокировавшему прерывания, прочитать состояние флагов после выполнения операции и ветвить свою программу в нужном направлении.

Исключительная ситуация невыполнимая операция возникает, например при делении, если делимое и делитель нули. При отсутствии обработки система присваивает результату значение нечисловой величины.

Стандарт IEEE 754 следующим образом определяет исключительную ситуацию невыполнимая операция.

Исключительная ситуация невыполнимая операция возникает, если в выполняемой операции операнд неправильный. Результат, когда встречается невыполнимая операция без обработки по прерыванию, должен быть простым NaN (раздел 5.3) в формате результата.

Невыполнимые операции:

  1. Любая операция с сигнализирующим NaN (раздел 5.3).

  2. Сложение или вычитание, когда вычитаются значения бесконечностей, например

  3. Умножение с любыми знаками.

  4. Деление или с любыми знаками.

  5. Вычисление остатка , где бесконечность или .

  6. Извлечение квадратного корня, если операнд меньше нуля.

  7. Преобразование двоичного числа с плавающей точкой в целое или в десятичный формат, когда этот формат мешает (не позволяет) представить переполнение разрядной сетки как бесконечность или NaN и невозможно сигнализировать другим способом.

  8. Сравнение с использованием утверждений < или >, без ?, когда один из операндов несравним.

Подробнее смотри в документах стандарта [lll].

Исключительная ситуация деление на нуль возникает, если делитель ноль, а делимое имеет конечное ненулевое значение. При отсутствии обработки по прерыванию результату должно быть присвоено значение со знаком равным сумме по модулю 2 знаковых разрядов операндов.

Исключительная ситуация переполнения формата возникает когда число подлежащее записи после его округления выходит за верхние границы диапазона чисел рис.5-2 представляемых в формате. В этой ситуации число с нормализованной мантиссой имеет порядок, превышающий положительное максимально допустимое значение и по этой причине не может быть записано в формат.

Стандарт IEEE 754 рекомендует при отсутствии обработки этой ситуации записывать в формат результат, определяемый знаком числа и действующим в момент записи режимом округления. Режим округления определяет результат следующим образом.

  1. При округлении до ближайшего числа записывают в формат код нечисловой величины со знаком исходного числа.

  2. При округлении к нулю записывают число равное со знаком исходного числа.

  3. При округлении до положительного числа записывают число равное со знаком плюс. При округлении отрицательного числа записывают код 

  4. При округлении до отрицательного числа записывают число равное со знаком минус, положительного числа – код не числовой величины 

Прерывания по переполнению во всех операциях кроме преобразований должны предоставлять обработчику прерывания результат, полученный делением точного результата существовавшего до округления на и затем округленного. Корректирующее смещение должно быть 192 в одиночном, 1536 в двойном формате и в расширенном формате, где количество бит в поле порядка.

Смещение порядка выбрано для перевода значений положительного/отрицательного переполнения, как можно ближе к середине диапазона порядка, для того, чтобы если необходимо, они могли бы быть использованы в последующих масштабирующих операциях с меньшим риском порождения дальнейших исключений.

При прерывании по переполнению система должна

  • при преобразовании из двоичного формата с плавающей точкой предоставить обработчику прерывания результат в этом или расширенном формате, возможно с откорректированным смещенным порядком, но округленный до точности адресата;

  • при преобразовании из десятичного в двоичное число предоставить обработчику прерывания результат в самом широком поддерживаемом формате, возможно с откорректированным смещенным порядком, но округленным до точности адресата. Когда результат находится слишком далеко за границами уточненного смещенного порядка, тогда взамен должно быть выдано простое NaN.

Обработчик прерывания, если прерывание не заблокировано, обычно вводит масштабирующий коэффициент, позволяющий уменьшить значение переменной, или записывает результат в больший формат. Суть введения масштабирующего коэффициента поясним следующим примером.

Пусть переменная содержит значение расстояния от Земли до ракеты запущенной к Плутону выраженное в миллиметрах. Тогда в момент запуска ракеты . По мере удаления ракеты от Земли значение быстро возрастает и при некотором расстоянии в вычислителе, отслеживающем расстояние ракеты от Земли, возникает ситуация переполнения формата переменной . Чтобы программа в вычислителе продолжила вычисления достаточно изменить единицу измерения и в дальнейшем измерять расстояние в километрах. Для этого обработчик прерывания по переполнению переменной должен зафиксировать факт изменения единицы длины, т.е. ввести новый масштабирующий коэффициент, и уменьшить текущее расстояние (значение ) в 106 раз. Быть может, по мере приближения ракеты к Плутону снова произойдет переполнение формата . Тогда обработчик прерывания еще раз изменит масштабирующий коэффициент, и теперь будет измеряться мега метрами. При возврате спутника на Землю может происходить обратный процесс, но уже вызванный переполнением порядка числа в отрицательную сторону, т.е. потерей его значимости.

Исключительная ситуация потери точности.

Если округленный результат операции не точен, или если имеет место положительное переполнение без прерывания, тогда должна быть объявлена исключительная ситуация неточный результат (потеря точности) и выработан сигнал прерывания.

Округленный или переполненный результат должен быть доставлен по назначению или, если прерывание по исключительной ситуации потеря точности произошло, к обработчику прерывания.

Казалось бы, при большой длине поля мантиссы потеря точности несущественна и не может приводить к большим ошибкам при решении задач. Однако это далеко не всегда так.

Пример 5-9. Пусть нужно вычислять , причем переменные должны быть представлены в десятичной системе счисления в формате с длиной поля мантиссы 6 позиций и точкой фиксированной справа от старшей позиции. Транслятор не знает значений переменных и поэтому определит выполнение операций сложения в порядке их записи в выражении. В процессе выполнения программы вычисление и переменных может выполняться многократно при разных значениях переменных.

Пусть при очередном выполнении значения ; были вычислены и записаны в формат без потери точности. При записи в формат вычисленного точного значения возникла исключительная ситуация потери точности и выполнено округление до ближайшего числа, что привело к отбрасыванию двух младших разрядов мантиссы. Потеря, казалось бы, незначительна – всего лишь 1 в 7 разряде справа от запятой.

При вычислении V получим

;

.

Точное значение

.

Ошибка в старшем разряде результата!!!

Может сложиться впечатление, что решать ответственные задачи, используя арифметику с плавающей точкой с фиксированной длиной поля мантиссы, невозможно из-за низкой достоверности результатов. Это не так, и для этого в системах, использующих арифметику с плавающей точкой, предусматривают обработку исключительной ситуации потери точности.

Обработчик ситуации потери точности может быть построен с применением весьма разнообразных принципов. Их описание и исследование не является предметом арифметики. Поэтому здесь покажем лишь некоторые возможности.

Простейший обработчик может прекратить выполнение программы и сообщить пользователю о причинах ее остановки. Дальнейшие решения принимает пользователь. Интеллектуальный обработчик принимает меры для исключения неприемлемых последствий возникновения исключительной ситуации. Он может, например, назначить другой, быть может, расширенный формат для записи результата, что исключит или смягчит неприемлемые последствия, или передаст управление другому варианту программы предусмотренному на этот случай.

В примере 5-9, обнаружив исключительную ситуацию потери точности при записи значения , достаточно представить переменную , где ; ; и выбрать должный порядок вычисления

.

Тогда переменная

вычислена точно в том же ранее заданном формате.

Исключительная ситуация потери значимости.

Если формат результата не допускает представление числа в ненормализованной форме и вследствие этого область растянутой потери значимости рис.5-2 отсутствует, а область полной потери значимости расширена, то исключительная ситуация потери значимости возникает, если после округления число не равное нулю становится равным машинному нулю. Оговорка «после округления» вызвана тем, что после округления модуль числа может увеличиться и число сместится из области полной потери значимости в область представляемых нормализованных чисел. Смещение числа при округлении из области представляемых чисел в область полной потери значимости невозможно.

Если формат результата допускает представление числа в ненормализованной форме, то определение ситуации потери значимости несколько осложняется.

Поясним причины такого осложнения на примерах.

Пример 5-10. Пусть точное десятичное число необходимо записать в формат с минимальным порядком (–99) и мантиссой длиной с точкой фиксированной перед позицией старшего разряда дробной части мантиссы. В этот формат его можно записать только в ненормализованном виде как . Число предельно денормализовано, имеет значение (рис.5-2), но представлено абсолютно точно, и ни о какой потери точности и значимости говорить не приходится. Следовательно, факт даже предельной денормализации или крошечность числа сам по себе не позволяет судить о потере значимости.

Пример 5-11. Пусть в тот же формат необходимо записать число (вертикальной чертой будем отделять сохраняемые разряды). Если бы формат позволял записать порядок (–104), то при той же длине поля мантиссы во всех режимах округления, кроме режима округления до , результат был бы нормализованным с ординарной потерей точности. При ограниченном порядке (–99), после денормализации и округления в тех же режимах, получим результат с тем же значением и, следовательно, с точностью формата.

Таким образом, сочетание денормализации и потери точности не может быть признаком потери значимости.

Пример 5-12. Выполним запись числа в режиме округления до . При отсутствии ограничения на величину порядка получим результат с потерей точности до точности формата. При ограниченном порядке исходное число придется денормализовать на 5 разрядов вправо и округлить. Получим результат со значением вдвое превышающим значение, вычисленное с точностью формата. Едва ли такой результат устроит пользователя.

Пример 5-13. Пусть в тот же формат необходимо записать число в режиме округления до нуля. При отсутствии ограничения на величину порядка после округления получим . При наличии ограничения результат со значением . В обоих случаях число потеряло точность.

В первом случае его точность сократилась до 6 разрядов, что гарантирует выбранная пользователем длина поля мантиссы, а абсолютная погрешность представления составляет и не превышает веса единицы младшего разряда, что гарантирует выбранный способ округления. Потеря числом точности ординарная.

Во втором случае из-за ненормализованного представления точность сократилась до двух разрядов (на это пользователь не рассчитывал), а абсолютная погрешность возросла до в 10 000 ! раз.

В примерах 5-12 и 5-13 возникла экстраординарная потеря точности. Едва ли пользователь рассчитывал на получение результатов с такими ошибками. Поэтому результаты, возможно, потеряли значимость для практического применения. Но так ли это, может решить только пользователь.

Определение. Потерю точности будем называть экстраординарной, если она превышает величину гарантированной предельной потери точности определяемой выбранным форматом и режимом округления.

Именно экстраординарная потеря точности является причиной исключительной ситуации потери значимости.

В чем же состоят причины экстраординарной потери точности?

Если число, принадлежащее области чисел представляемых в формате (рис.5-2), в зависимости от режима округления заменяется числом ближайшим большим или ближайшим меньшим, то такая замена приводит к возникновению абсолютной погрешности округления равной величине интервала на числовой оси между исходным точным значением и результатом округления. На рис.5-8 показан случай замены исходного числа ближайшим большим.

Сказанное справедливо как при округлении чисел в области нормализованных чисел, так и в области растянутой потери значимости (рис.5-2).

Так как все нормализованные числа имеют цифру не равную 0 в старшей позиции поля мантиссы, то количество значащих разрядов после округления всегда равно длине поля мантиссы, что и обеспечивает гарантированную точность представления нормализованных чисел.

Н енормализованные числа содержат нули в старших позициях поля мантиссы. Поэтому количество значащих разрядов в мантиссе после округления меньше длины поля мантиссы. Соответственно точность представления числа меньше точности формата. Это является предпосылкой для потери значимости.

Если нормализованное число с порядком округлено до точности формата с потерей значащих разрядов, и младшие разряды округленной мантиссы содержат нулей, то денормализация числа вправо на разрядов с целью представления его в ненормализованной форме с порядком не приведет к изменению значения числа. За пределы поля мантиссы будут выдвинуты только нули. Точность ненормализованного числа будет не меньше точности формата и исключительная ситуация потери значимости не сложится. Если в младших разрядах нормализованной и округленной мантиссы содержится хотя бы одна цифра не равная нулю, при денормализации вправо значение числа изменится, его точность уменьшится, что и является признаком потери значимости.

Стандарт IEEE 754 следующим образом определяет исключительную ситуацию потери значимости двоичных чисел с плавающей точкой.

Два коррелированных (взаимосвязанных) события вносят свой вклад в отрицательное переполнение. Первое – создание крошечного результата отличного от нуля между , который, потому что он так мал, может вызвать позже некоторую другую исключительную ситуацию, такую как положительное переполнение при делении. Второе – экстраординарная потеря точности при аппроксимации таких маленьких чисел ненормализованными числами. Конструктор может выбрать, как эти события определить, но он должен определять эти события таким же образом для всех операций.

Крошечность может быть обнаружена одним из двух способов:

(1) После округления – когда отличный от нуля результат, вычисленный так, как если бы диапазон порядка был бы неограничен, будет лежать строго между .

(2) Перед округлением – когда отличный от нуля результат, вычисленный так, как если бы диапазон порядка и точность были неограниченны, окажется строго между .

Потеря точности может быть обнаружена как одно из двух:

(3) Денормализованная потеря – когда полученный результат отличается от того, который был бы вычислен при неограниченном диапазоне порядка.

(4) Неточный результат (inexact result) – когда полученный результат отличается от того, который был бы вычислен при неограниченном диапазоне порядка и точности.

Комментарий к п.(1) и п.(2). Результаты применения правил отличаются тем, что при использовании правила (2) результат выполнения операции с порядком и мантиссой содержащей код 0.11..1 в сохраняемых разрядах будет всегда признан крошечным, а при использовании правила (1) этот же результат в некоторых режимах округления, если сложатся условия для замены его числом ближайшим большим, станет числом нормализованным и не сможет вызвать ситуацию потери значимости.

Комментарий к п.(3) и п.(4). При применении п.(3) ненормализованный (крошечный) результат будет признан значимым, если его точность не меньше точности формата. При применении п.(4) крошечный результат будет признан значимым, только если он равен исходному числу.

Когда прерывание в исключительной ситуации потери значимости не осуществлено, или не активировано (случай по умолчанию), ситуация потери значимости должна быть сигнализирована (посредством флага потери значимости) только когда крошечность и потеря точности были обнаружены. Метод для обнаружения крошечности и потери точности не воздействует на полученный результат, который может быть нулём, ненормализованным числом или .

Когда осуществлено прерывание в исключительной ситуации потери точности и оно активировано, то флаг потери точности должен сигнализировать, когда ситуация крошечности обнаружена независимо от потери точности.

Прерывания в исключительной ситуации потери значимости при всех операциях кроме преобразования должны поставить обработчику прерывания результат, полученный умножением абсолютно точного результата на и затем округленного. Поправка смещения (bias adjust) равна 192 в одиночном, 1536 в двойном и в расширенном формате, где - число бит в поле порядка.4

Прерывания из-за потери значимости при выполнении преобразований должны быть обработаны аналогично обработке положительного переполнения при преобразовании.

Ситуацию потери значимости обычно проявляют до записи числа в формат. Это вызвано тем, что обработчику ситуации потери значимости следует передать значение записываемого в формат числа округленного до точности формата. После записи ненормализованного числа это значение может быть потеряно.

Можно сформулировать различные правила определения потери значимости. Рассмотрим одно из них.

Пусть исходное число не равное нулю нормализовано и имеет порядок , причем ; – длина поля мантиссы в формате результата. Для записи числа в формат нормализованную мантиссу нужно округлить до точности формата, и установить порядок равным , сдвинув мантиссу.

Ситуация потери значимости складывается:

  1. При округлении мантиссы до ближайшей меньшей

    • если (все значащие разряды будут выдвинуты за пределы поля мантиссы и отброшены при округлении; результат будет равен 0);

    • если при хотя бы один из младших разрядов исходной мантиссы содержит цифру не равную нулю (при увеличении порядка до теряется не менее чем один значащий разряд мантиссы, что приводит к экстраординарной потере точности).

  2. При округлении мантиссы до ближайшей большей

    • если ;

    • если при хотя бы один из младших сохраняемых разрядов мантиссы после округления содержит цифру не равную нулю или до округления содержит не максимальную цифру.

Комментарий к п.2. При замене мантиссы ближайшей большей возможно переполнение мантиссы. При этом количество разрядов в исходной мантиссе увеличится на 1. Поэтому условие выдвижения всех значащих разрядов за пределы формата будет . При все разрядов округленной мантиссы могут быть равны 0 в единственном случае, когда мантисса переполнилась и стала равной 10.00…0. После сдвига такой мантиссы на разрядов вправо и записи порядка значение числа не изменится и нет потери точности.

В единственном случае при переполнении мантиссы при округлении и результат округления будет нормализованным с порядком . В этом случае код смещенного порядка следует принять равным 00..01. Во всех остальных случаях код смещенного порядка должен быть равным 00…0, так как результат число ненормализованное.

В заключение заметим. Событие исключительной ситуации потери точности может сочетаться с событием переполнения или потери значимости. Ситуации переполнения и потери значимости не могут складываться одновременно. Ситуации переполнения и потери значимости имеют приоритет при обработке по отношению к ситуации потери точности.

1 Точность и погрешность числа являются величинами связанными, но не взаимно обратными.

2 Снижение точности числа ниже некоторой минимально допустимой величины и тем более до нуля может приводить к катастрофическим последствиям.

3 При смещении порядков в область отрицательных чисел знак (–) в поле порядка можно задать по умолчанию.

4 Заметьте, что система, в основу которой положены аппаратные средства, всегда прерывается при отрицательном переполнении, производя округление и коррекцию смещения порядка результата. Она должна указывать, округлен ли такой результат в большую сторону по величине порядка, чтобы правильно ненормализованный результат мог быть произведен в программном обеспечении системы, когда пользовательский обработчик прерывания не функционирует.

171