К. Хамахер, З. Вранешич, С. Заки - Организация ЭВМ - 5-е издание (2003) (1114649), страница 102
Текст из файла (страница 102)
Значение №Х является результатом выполнения недопустимой операции, такой как О/О или ч'-Е Искпючения Согласно стандарту 1ЕЕЕ, если в ходе работы произойдет потеря значимости, переполнение или деление на нуль, встретится условие шехас1 либо шча1!с1, процессор должен установить флаг иаллюиевия. О первых трех условиях исключений мы уже упоминали. 1пехаст — это ситуация, когда для представления результата в одном нз нормальных форматов его необходимо округлить.
Термин 1лэаЫ употребляется для описания ситуации, когда прсдпринимается попытка выполнения недопустимой операции, такой как О/О или 4-1. При возникновении одной из указанных исключительных ситуаций результату присваивается специальное значение. Если установлен флаг разрешения соответствующего прерывания, в исключительной ситуации происходит переход к системной или пользовательской программе обработки этого прерывания. В качестве альтернативы прикладная программа может сама проверять, нет ли исключений, и производить те или иные операции в соответствии с результатами проверки. 6.7.2. Арифметические операции над числами с плавающей запятой Этот раздел посвящен правилам сложения, вычитания, умножения и деления чисел в формате с плавающей запятой, определенном стандартом 1ЕЕЕ.
Указанные правила регулируют только базовые шаги при выполнении операций. А вот, например, возможность переполнения или потери значимости в них не учтена. Более того, для промежуточных значений мантиссы и порядка может потребоваться более 24 и 8 бит соответственно. Эти и другие особенности операций с плавающей запятой нужно принимать к сведению в процессе разработки арифметических устройств, соответствующих стандарту 1ЕЕЕ.
Все особенности мы, конечно, не рассмотрим, но о важнейших, таких как округление, поговорим обязательно. Если порядок двух операндов с плавающей запятой различен, их мантиссы перед сложением или вычитанием должны быть сдвинуты относительно друг друга.
В качестве примера рассмотрим сложение чисел 2,9400 х 10~ и 4,3100 х 104. Представим 2,9400 к 10~ как 0,0294 х 104 и сложим мантиссы, вследствие чего получим 4,3394 к 104. Последовательность операций при сложении и вычитании можно описать следующим образом. Правило сложения и вычитания 1. Выбрать число с меньшим порядком и сдвинуть его мантиссу вправо на количество разрядов, равное разности порядков. 2.
Установить порядок результата равным большему порядку операндов. 3. Выполнить сложение/вычитание мантисс и определить знак результата, 4. Нормализовать результат в случае необходимости. Умножение и деление чисел с плавающей запятой даже проще их сложения и вычитания — для выполнения этих операций выравнивать мантиссы не требуется. 438 Глава 6. Арифметика Правило умножении 1. Сложить порядки операндов и вычесть из результата значение 127. 2. Перемножить мантиссы и определить знак результата. 3. В случае необходимости нормализовать результат.
Правило деления 1. Вычесть порядок делителя из порядка делимого и прибавить к результату значение 127. 2. Разделить мантиссы и определить знак результата. 3. В случае необходимости нормализовать результат. Прибавление или вычитание 127 при умножении и делении выполняется потому, что порядки чисел представлены в формате с избытком 127. 6.7.3. Разряды защиты и усечение Реализация описанных алгоритмов имеет ряд важных особенностей, обзор которых дан в настоящем разделе.
Хотя размер мантисс исходных операндов и конечного результата ограничен 24 разрядами, включая подразумеваемую ведущую 1, важно, чтобы в ходе промежуточных вычислений сохранялось несколько дополнительных разрядов, называемых разрядами защиты или сторожевыми разряЬами. Это позволяет обеспечить необходимую точность конечного результата. Когда разряды защиты удаляются из конечного результата, мантисса усекается до 24 разрядов. Усечение производится и в других ситуациях, в частности, при преобразовании десятичного числа в двоичный формат.
Конечно, для обозначения данной операпии употребляется также термин округление, но мы будем использовать его в более узком смысле, говоря об одном из способов усечения значения. Существует несколько способов усечения. Простейший из них заключается в удалении разрядов защиты без изменения остальных разрядов. Такая операция называется усвнвниен. Предположим, что необходимо сократить дробное значение с шести разрядов до трех.
Любые значения, лежащие в диапазоне от О,Ь 1Ь гЬ з000 до О,Ь 1Ь гЬ з111, усекаются до О,Ь 1Ь гЬ з. Ошибка усечения до 3-разрядного результата находится в диапазоне 0-0,000111, то есть от 0 и почти до 1 в младшем вз оставшихся разрядов. У нас это разряд Ь з. В результате усечения получается смещенное приближение, поскольку диапазон ошибки не симметричен нулю. Еще одним простым методом усечения является фон-неймановсков округление.
Если все удаляемые разряды содержат нули, последние отбрасываются без изменения оставшихся разрядов. Но если хоть один из удаляемых разрядов содержит 1, младший разряд оставшегося значения устанавливается в 1. В нашем примере усечения дробного значения с шести разрядов до трех любые 6-разрядные значения, в которых Ь гЬ зЬ в не равны 000, укорачиваются до О,Ь,Ь г1. Величина ошибки этого метода лежи~ в диапазоне от — 1 до +1 младшего из оставшихся разрядов. И хотя при таком способе усечения значения диапазон ошибки больше, чем при простом усечении, ее максимальная величина остается той же, а приближение получается несмещенным, так как диапазон ошибки симметричен относительно нуля.
6.7. Обработка чисел с плавающей запятой 439 Для тех операций, в которых участвует много операндов и выполняется значительное количество промежуточных действий, предпочтительнее несмещенное приближение, при котором положительные и отрицательные ошибки компенсируют друг друта. Если статистически оценить результаты сложных вычислений с использованием несмещенного приближения, их точность окажется очень высокой.
Перейдем к следующему методу усечения значения — окруиению. Задача округления состоит в максимальном приближении результирующего значения к исходному. Оно гораздо точнее полученного путем усечения и к тому же дает несмещенный результат. Округление выполняется так: если старший из удаляемых разрядов содержит 1, к младшему из оставшихся разрядов числа прибавляется 1. Таким образом, О,Ь 1Ь зЬ з1... округляется до О,Ь 1Ь зЬ з ч- 0,001, а О,Ъ 1Ь тЬ зО...— до О,Ь ~Ь зЬ з. Результат получается предельно близким к исходному числу за исключением ситуации, когда удаляемые разряды равны 10...0. В этом случае исходное значение лежит посредине между двумя возможными усеченными представлениями.
Для обеспечения несмещенного приближения можно выбирать значение младшего из оставшихся разрядов таким образом, чтобы всегда получалось ближайшее четное значение. В рассматриваемом примере с использованием 6 разрядов значение О,Ъ 1Ь з0100 округляется до О,Ь 1Ь зО, а О,Ь 1Ь з1100 — до О,Ь 1Ь-з1 + 0,001. Эту технологию можно описать так: округление до ближайшего числа, а в случае двух одинаковых ошибок округления — до ближайшего четного числа. Ошибка округления лежит в диапазоне от -1/2 до ч.1/2 значения младшего из оставшихся разрядов.
Очевидно, что это наилучший метод. Однако реализовать его труднее всего, поскольку потребуется дополнительная операция и, возможно, нормализация. Согласно стандарту 1ЕЕЕ, для усечения чисел по умолчанию используется округление. В этом стандарте описаны и другие методы усечения; все они определены как режимы округления. Обсуждая ошибки, возникающие из-за удаления разрядов защиты, мы говорили об одной операции усечения. Если программа выполняет длинную последовательность вычислений, в которой задействованы числа с плавающей запятой, анализ диапазонов ошибок и конечных результатов значительно усложняется.
Зтог аспект числовых вычислений мы больше обсуждать не будем, а напоследок еще раз обратимся к стандарту 1ЕЕЕ и посмотрим, как в ним определяются разряды защиты и округление. Результаты одной операции должны вычисляться с точностью до половины единицы в младшем разряде. В общем случае с этой целью результат должен укорачиваться путем округления. Для обеспечения такой точности на промежуточных шагах выполнения операции достаточно сохранять три разряда защиты. Первые два — это старшие разряды мантиссы, которые в конце вычислений подлежат удалению.
Третий разряд содержит результат выполнения логической операции ИЛИ всех разрядов мантиссы, кроме указанных двух разрядов защиты. Поддерживать его на промежуточных шагах операции достаточно просто. Он инициализируется нулем, а когда в него из мантиссы выдвигается 1, становится равным 1 и сохраняет это значение. Поэтому данный разряд иногда называют вторым промежуточным битом округления (зГ1ску Ь1Г). 440 Глава 6. Арифметика 6.7.4.