Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
70
Добавлен:
20.03.2015
Размер:
303.62 Кб
Скачать

4.1. Числа, арифметические операции и символы

Компьютеры состоят из логических схем, которые обрабатывают информацию в виде электрических сигналов, принимающих два значения. Мы обозначаем их цифрами 0 и 1. Количество информации, представленной та­ким сигналом, измеряется в битах. Наиболее есте­ственный способ представления числа в компьютерной системе заключается в использовании строки битов, называемой двоичным числом. Символ текста то­же может быть представлен строкой битов, называемой кодом символа.

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

Представление чисел

Рассмотрим n-разрядный вектор

В = bn-1 b1b0

Здесь bi = 0 или 1 при 0 ≤ i ≤ n-1. Этот вектор может представлять беззнаковое це­лочисленное значение V в диапазоне от 0 до 2n-1, где

V(B) = bn-1 x 2n-1 + ...+b1 x 21 + b0 x 20

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

- значение со знаком;

- дополнение до единицы;

- дополнение до двух.

Во всех трех системах крайний слева бит, называемый самым старшим разря­дом (Most Significant Bit, MSB), равен 0 в случае положительных чисел и 1 — в случае отрицательных. На рис. 4.1 все три представления показаны на примере 4-разрядных (4-битовых) чисел. Положительные значения во всех трех системах представляются одинаково, а отрицательные — по-разному. В системе значения со знаком отрицательные числа отличаются от соответствующих положительных чисел тем, что значение самого старшего бита (bз на рисунке 4.1) в векторе В равня­ется не 0, а 1. Например, число +5 представляется как 0101, а число -5 как 1101. Такое представление чисел называют еще прямым кодом числа со знаком. В представлении дополнения до единицы отрицательные значения получают пу­тем дополнения каждого разряда соответствующего положительного значения до единицы. Таким образом, представление числа -3 формируется путем дополнения каждого бита вектора 0011, так что в результате получается 1100. Такое представление чисел еще называют обратным кодом числа. Очевидно, что эту же операцию необходимо выполнить для преобразования отрицательного числа в соответствующее положительное значение. И в одном и в другом случае преобразо­вание называется дополнением числа до единицы. Операция формирования до­полнения заданного числа до единицы эквивалентна вычитанию этого числа из 2n-1, то есть из 1111 в случае 4-разрядных чисел (см. рис. 4.1). В системе допол­нения до двух операция дополнения производится путем вычитания числа из 2n. То же самое значение можно получить и путем добавления 1 к дополнению этого числа до единицы. Такое представление числа еще называют дополнительным кодом числа.

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

Двоичное значение

b3b2b1b0

Представление числа в системе

значения со знаком

дополнения до единицы

дополнения до двух

0111

+7

+7

+7

0110

+6

+6

+6

0101

+5

+5

+5

0100

+4

+4

+4

0011

+3

+3

+3

0010

+2

+2

+2

0001

+1

+1

+1

0000

+0

+0

+0

1000

-0

-7

-8

1001

-1

-6

-7

1010

-2

-5

-6

1011

-3

-4

-5

1100

-4

-3

-4

1101

-5

-2

-3

1110

-6

-1

-2

1111

-7

-0

-1

Рис. 4.1. Двоичное представление целых чисел со знаком

Сложение положительных чисел

Рассмотрим принцип сложения двух одноразрядных чисел. Результат выполне­ния этой операции приведен на рис. 4.2. Обратите внимание, что для записи ре­зультата сложения двух единиц необходим 2-битовый вектор 10, представляю­щий значение 2. В этом случае говорят, что сумма равняется 0, а перенос — 1. Для сложения многоразрядных чисел используется метод, аналогичный тому, с помо­щью которого мы складываем десятичные числа на бумаге. Складываются пары разрядов, начиная с младшего разряда, то есть с правого края битового вектора, с переносом в направлении старшего разряда, то есть левого края битового вектора.

0 1 0 1

+0 +0 +1 +1

____________

0 1 1 10

Перенос

Рис. 4.2. Сложение одноразрядных чисел

Сложение и вычитание чисел со знаком

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

Чтобы понять принципы арифметики дополнений до двух, нужно рассмотреть операцию сложения по модулю N (обозначаемую как mod N). Удобным графиче­ским представлением сложения положительных чисел по модулю N является круг с N значениями по его периметру: от 0 до N - 1 (рис. 4.2, а). Для примера рассмот­рим значение N = 16. Результатом операции (7 + 4) mod 16 является значение 11. Для того чтобы выполнить эту операцию с помощью графического представле­ния, найдите на окружности отметку 7 и переместитесь от нее на четыре деления по часовой стрелке. Там вы найдете ответ — значение 11. Аналогичным образом (9 + 14) mod 16 = 7. Найдя значение 9 и отсчитав от него 14 делений, вы опишете полный круг и остановитесь на делении 7. Этот нехитрый графический прием по­зволяет вычислить любую сумму (а + b) mod 16 для любых положительных чисел а и b: вы находите число а и перемещаетесь на b делений по часовой стрелке.

Теперь рассмотрим другую интерпретацию окружности mod 16. Предположим, что значения из диапазона от 0 до 15 представлены в соответствии с двоичной сис­темой счисления 4-битовыми двоичными векторами: 0000, 0001,..., 1111. А двоич­ные векторы, как видно на рис. 4.3, б, представляют числа со знаком от -8 до +7, что соответствует системе дополнения до двух (рис. 4.1).

Давайте применим графическую технологию сложения по модулю 16 к про­стому примеру сложения чисел +7 и -3. В системе дополнения до двух эти числа представлены как 0111и1101 соответственно. Для того чтобы их сложить, найди­те на окружности число 0111 и переместитесь на 1101 шагов по часовой стрелке (то есть на 13 шагов — сосчитайте количество делений от 0 до 1101). Вы окаже­тесь на делении 0100, представляющем ответ, а именно +4 (рис. 4.2, б). Если вы выполните эту операцию путем сложения пар разрядов справа налево, результат будет таким:

0111

+ 1101

1 0100

Перенос

Как видите, для получения правильного результата мы проигнорировали пе­ренос из четвертого разряда. В этом и состоит суть сложения по модулю. Переме­щаясь по кругу (рис. 4.2, 6), мы возвращаемся не к значению 10000, следующему за значением 1111, а к значению 0000.

Рис. 4.2. Сложение по модулю и сложение в системе дополнения до двух:

представление операций над целыми числами по модулю N (а); операции над числами в системе дополнения до 2 по модулю 16 (б)

Теперь мы можем описать правила сложения и вычитания n-разрядных чисел со знаком в системе дополнения до двух.

1. Для сложения двух чисел следует сложить их n-разрядные представления, игнорируя сигнал переноса из позиции старшего разряда (MSB). Суммой будет алгебраически правильное значение, представленное в системе допол­нения до двух, если это значение лежит в диапазоне от -2n-l до +2n-1 - 1.

2. Для вычитания чисел Х и У, то есть выполнения операции Х - Y, следует вычислить дополнение числа Y до двух, а затем добавить его к числу X с учетом правила 1. Результатом будет алгебраически правильное значе­ние, представленное в системе дополнения до двух, если это значение ле­жит в диапазоне от -2n-l до +2n-1 - 1.

На рис. 4.3 показано несколько примеров сложения и вычитания 4-разрядных двоичных чисел. Во всех этих примерах ответ оказывается в диапазоне от -8 до 7. Если ответ выходит за границу указанного диапазона, мы говорим, что произош­ло арифметическое переполнение. Такие ситуации рассматриваются ниже. Представленные здесь четыре операции сложения (рис. 4.3, а-г) вы­полнены по правилу 1, а шесть операций вычитания (рис. 4.3, д-к) — по правилу 2. В операции вычитания для вычитаемого (нижнее значение) сначала выполняется вычисление дополнения, а затем сложение — точно так же, как в случае двух по­ложительных чисел.

В программировании часто возникает необходимость выразить некоторое чис­ло, заданное в системе дополнения до двух, с использованием определенного ко­личества разрядов, большего, чем необходимо для представления этого числа на самом деле. Если речь идет о положительных числах, для этого достаточно просто добавить слева нужное количество нулей. В случае отрицательных чисел край­ний слева бит, представляющий знак числа, должен быть равен 1, и для получе­ния более длинного представления того же значения нужно повторить знаковый бит слева от числа столько раз, сколько нужно для достижения заданной длины. Чтобы понять, почему нужно действовать именно так, давайте снова вернемся к окружности для сложения по модулю 16, показанной на рис. 4.2, б. Сравните эту окружность с окружностью для сложения по модулям 32 и 64. Представление от­рицательных чисел, -1, -2 и т. д., будет точно таким же, с дополнительной едини­цей слева. Операция добавления единицы называется расширением знака.

Теперь вы знаете, насколько просто выполняется сложение и вычитание чисел со знаком в системе дополнения до двух. Поэтому для представления чисел в со­временных компьютерах выбрана именно эта система. Может показаться, что и система дополнения до 1 не хуже, но это только на первый взгляд. Хотя вычис­лить дополнение до единицы и проще, результаты операции сложения не всегда оказываются правильными. В данном случае нельзя игнорировать перенос, сn. Если сn = 0, полученный результат будет верным. Но если сn = 1, то для определе­ния точного результата к полученному значению нужно добавить 1. Необходи­мость в этом поправочном цикле, зависящая от значения переноса, делает опера­ции сложения и вычитания в системе дополнения до единицы более сложными, чем в системе дополнения до двух.

Рис. 4.3. Операции сложения и вычитания в системе дополнения до двух

Переполнение в целочисленной арифметике

В системе дополнения до двух n бит могут представлять значения из диапазона от −2n-1 до +2n-1-1. Используя, предположим, четыре бита, можно представить чис­ла от -8 до +7 (рис. 4.1). Когда результат арифметической операции выходит за пределы представимого диапазона, происходит арифметическое переполнение. При сложении беззнаковых чисел индикатором переполнения служит перенос сn из позиции старшего разряда. Однако при сложении чисел со знаком это не сра­батывает. Возьмем, к примеру, 4-битовые числа со знаком. Если попытаться сло­жить числа +7 и +4, результирующим вектором суммы S будет 1011, а это код числа -5. Как видите, результат сложения неверный, хотя сигнал переноса из по­зиции MSB равен 0. Точно так же при сложении чисел -4 и -6 получим вектор S = 0110 = +6, то есть еще один ошибочный результат. Сигнал переноса в данном случае равен 1. Таким образом, переполнение может произойти при условии, что оба слагаемых имеют одинаковый знак. Сложение же чисел с разными знаками не вызывает переполнения.

Отсюда можно сделать следующие выводы.

1. Переполнение может произойти только при сложении чисел с одинако­выми знаками.

2. При сложении чисел со знаком сигнал переноса из позиции знакового би­та не является индикатором переполнения.

Способ обнаружения переполнения заключается в анализе знаков слагаемых Х и У и знака результата. Если оба операнда, Х и Y, имеют один и тот же знак, ин­дикатором переполнения является несовпадение их знака со знаком суммы.

Символы

Компьютеры должны обрабатывать не только числа, но и текстовую информа­цию, состоящую из символов. Под термином «символы» подразумеваются буквы алфавита, десятичные цифры, знаки препинания и т. п. Они представляются ко­дами, обычно имеющими длину 8 бит. Одной из наиболее широко распространен­ных кодовых таблиц является таблица ASCII (American Standard Code For Infor­mation Interchange), приведенная в приложении.

Обработка чисел с плавающей запятой

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

В= b0,b-1,b-2 ...b-(n-1)

определяется функцией

F(B) = -b0  20 + b-1  2-1 + b-2  2-2 +...+ b-(n-1)  2-(n-1)

где значение F лежит в диапазоне

-1 ≤ F ≤ 1 - 2-(n-1)

Рассмотрим диапазон значений, которые можно представить в 32-разрядном формате с фиксированной запятой. Если интерпретировать их как целые числа, получается диапазон от 0 до ±2,15  109, а если как дроби — диапазон от ±4.55  10-10 до ±1. Ни одного из этих диапазонов не достаточно для научных вычисле­ний, в которых могут использоваться такие параметры, как число Авогадро (6,0247 х 1023 моль-1) и константа Планка (6,6254 х 10-27 эргс). Необходим такой формат, который подходил бы и для очень больших целых, и для очень малень­ких дробных чисел. Для этого компьютер должен уметь представлять числа и оперировать ими таким образом, чтобы позиция двоичной запятой была перемен­ной и автоматически изменялась в процессе вычислений. Такие числа называют числами с плавающей запятой. Напомним, что в числах с фиксированной запятой двоичная запятая всегда располагается в одной и той же позиции.

Поскольку в числе с плавающей запятой позиция двоичной запятой перемен­ная, она должна быть явно задана в представлении числа. Так, в хорошо знакомом вам научном десятичном формате числа могут записываться как 6,0247 х 1023, 6,6254 х 10-27, -1,0341 х 102, -7,3000 х 10-14 и т. д. Говорят, что в этих числах по пять значащих цифр. Масштабные множители (1023, 10-27 и т. д.) указывают по­зицию десятичной запятой по отношению к значащим цифрам. Числа, в которых десятичная запятая расположена справа от первой (ненулевой) значащей цифры, называют нормализованными. Основание масштабного множителя (10), которое является фиксированным, в машинном представлении чисел с плавающей запя­той можно не задавать. Итак, число с плавающей запятой должно содержать знак, значащие цифры и показатель степени 10 в масштабном множителе.

Теперь мож­но дать точное определение машинного представления числа с плавающей запя­той: оно состоит из знака, строки значащих цифр, называемой мантиссой, и пока­зателя степени (фиксированного основания), называемого порядком.

Стандарт IEEE для чисел с плавающей запятой

Сначала рассмотрим в общих чертах представление чисел с плавающей запятой в десятичной системе счисления, а затем соотнесем это представление с двоичным. Итак, числа с плавающей запятой удобно записывать следующим образом:

± Х1, Х2, Х3, Х4,X5, Х6, Х7, х 10±Y1 Y2

Здесь Хiи Yi это десятичные цифры. Такого количества значащих цифр (7) и диапазона значений порядка (±99) достаточно для научных расчетов. Мантиссу и порядок из этих диапазонов можно перевести в двоичное представление, уме­щающееся в 32 разряда, то есть в стандартное компьютерное слово. Мантисса длиной 24 бита может представлять десятичное число из 7 цифр, а 8-битовый по­рядок подразумеваемого основания 2 позволяет представить достаточно широ­кий диапазон значений масштабных множителей. Для знака числа необходим один бит. Поскольку ведущий бит нормализованной мантиссы обязательно дол­жен быть равен 1, его можно не включать в представление, за счет чего и освобож­дается один бит для знака. Таким образом, 32 бита позволяют представить доста­точно широкий диапазон чисел с плавающей запятой.

Описанный стандарт представления чисел с плавающей запятой в 32-разряд­ном формате разработан и детально специфицирован Институтом инженеров по электротехнике и электронике (Institute of Electrical and Electronics Engineers, IEEE). В нем определены и представление чисел, и правила выполнения четырех базовых арифметических операций. На рис. 4.4 а продемонстрировано 32-раз­рядное представление чисел с плавающей запятой. Знак числа задается в первом разряде, за ним следует представление порядка (по основанию 2). Вместо числа со знаком в поле порядка E хранится целое число без знака E' = E + 127. Этот формат называется форматом, с избытком 127. Таким образом, E' входит в диапа­зон 0≤Е’≤255. Граничные значения указанного диапазона, 0 и 255, употребляют­ся для представления описанных ниже специальных значений. Для обычных (нормальных) значений E' лежит в пределах 1≤ E’≤254. Это означает, что реаль­ный порядок, E, находится в диапазоне -126 ≤ E ≤ 127. Представление порядка в формате с избытком х упрощает, сравнение относительного размера двух чисел с плавающей запятой.

Последние 23 разряда числа представляют мантиссу. Поскольку числа зада­ются в нормализованном виде, старший бит мантиссы всегда равен 1. Этот бит не указывается явно; подразумевается, что он располагается слева от двоичной запя­той. Таким образом, 23 бита в поле M соответствуют дробной части мантиссы, то есть разрядам справа от двоичной запятой. Пример числа с плавающей запятой одинарной точности приведен на рис. 4.4, б.

Стандартное 32-разрядное представление (рис. 4.4, а) называется представле­нием с одинарной точностью, поскольку занимает одно 32-разрядное слово. Оно позволяет представлять масштабные множители в диапазоне от 2-126 до 2+127, что приблизительно равно 10±38. Значение 24-разрядной мантиссы обеспечивает при­мерно ту же точность, что и семизначное десятичное значение. Для достижения большей точности и увеличения диапазона чисел с плавающей запятой стандарт IEEE определяет формат двойной точности (рис. 4.4, в). В нем расширены диа­пазоны значений мантиссы и порядка. Так, 11-разрядный порядок в формате с избытком 1023 E лежит в диапазоне 1 Е' ≤ 2046 для обычных значений, а значе­ния 0 и 2047 употребляются для представления специальных символов. Следова­тельно, действительный порядок E лежит в диапазоне -1022 E 1023, позво­ляющем представить масштабные множители от 2-1022 до 21023 (то есть приблизи­тельно 10±308). Значения 53-разрядной мантиссы обеспечивают практически ту же точность, что и 16 десятичных цифр.

Чтобы компьютер соответствовал стандарту IEEE, он должен поддерживать как минимум представление чисел с плавающей запятой одинарной точности. Представление двойной точности необязательно. Этот стандарт определяет еще несколько необязательных расширенных версий обоих форматов. Они предна­значены для повышения точности и порядка представления промежуточных ре­зультатов последовательных вычислений. Например, внутреннее произведение двух векторов можно вычислить путем накопления суммы произведений с рас­ширенной точностью. Входные значения имеют стандартную точность, одинар­ную или двойную; результат округляется до той же точности. Благодаря расши­ренным форматам можно сократить погрешность округления, которая накапли­вается при многократных однотипных вычислениях. Кроме того, расширенные форматы повышают точность вычисления таких элементарных функций, как си­нус, косинус и т. п. Наряду с четырьмя базовыми арифметическими операциями стандарт IEEE определяет операции вычисления остатка от деления, квадратного корня, преобразования из двоичного кода в десятичный и наоборот.

Знак 8-разрядный 23-разрядная дробная

числа порядок со знаком часть мантиссы

в формате

с избытком 127

Представленное значение = ±l.M х 2E’-127

а

Представленное значение = 1,001010 ... 0 х 2-87

б

Знак 11-разрядный 52-разрядная

Числа порядок в формате дробная часть мантиссы

с избытком 1023

Представленное значение = ±l.М х 2Е’-1023

в

Рис. 4.4. Представления чисел с плавающей запятой, определенные в стандарте IEEE: формат числа с одинарной точностью (а); пример числа с одинарной точностью (б); формат числа с двойной точностью (в)

Порядок в формате с избытком 127

(Слева от двоичной запятой нет явно заданной 1)

Представленное значение = +0,0010110... х 29

а

Представленное значение = +1,0110... х 26

б

Рис. 4.5. Число с плавающей запятой в формате IEEE одинарной точности:

ненормализованное (а); нормализованное (б)

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

Во-первых, если число не нормализовано, его всегда можно привести к нормальной форме, сдвинув дробную часть и соответст­вующим образом изменив порядок. На рис. 4.5 вы видите ненормализованное значение 0,0010110... х 29 и его нормализованное представление 1,0110... х 26. По­скольку масштабный множитель представлен в формате 2i, сдвиг мантиссы на один разряд вправо или влево компенсируется увеличением или уменьшением порядка на единицу.

Во-вторых, в ходе вычислений может быть сгенерировано число, выходящее за рамки диапазона нормальных чисел. Если точность одинар­ная, это означает, что для представления нормализованного числа потребуется по­рядок менее -126 или более +127. В первом случае говорят о потере значимости или отрицательном переполнении (underflow), а во втором — о переполнении (overflow). И потеря значимости, и переполнение являются арифметическими исключениями, о которых мы поговорим чуть позже.

Специальные значения

Граничные значения 0 и 255 порядка Е' формате с избытком 127 используются для представления специальных значений. Если E' = 0 и дробная часть мантиссы M равна нулю, значит, представлено точное значение 0. Порядок E' = 255 и ман­тисса M = 0 представляют значение ∞, где ∞ — результат деления нормального числа на нуль. Для представления этих значений обычно применяется и знако­вый разряд, например: ±0 и ±∞.

Значения Е' = 0 и М ≠ 0 соответствуют представлению анормальных чисел. Это числа ±0,М х 2-126, которые меньше самого маленького числа. У них отсутствует подразумеваемая единица слева от двоичной запятой, a M представляет собой любую ненулевую 23-разрядную дробную часть числа. Анормальные числа пред­назначены для случаев, когда возможна постепенная потеря значимости; они расширяют диапазон представляемых чисел и могут быть полезны при работе с очень маленькими числами. Когда E'=255 и M ≠ 0, представленное значение на­зывается Not a Number (NaN). Значение NaN является результатом выполнения недопустимой операции, такой как 0/0 или √-1.

Исключения

Согласно стандарту IEEE, если в ходе работы произойдет потеря значимости, пере­полнение или деление на нуль, встретится условие inexact либо invalid, процессор должен установить флаг исключения. О первых трех условиях исключений мы уже упоминали. Inexact это ситуация, когда для представления результата в одном из нормальных форматов его необходимо округлить. Термин invalid употребляется для описания ситуации, когда предпринимается попытка выполнения недопусти­мой операции, такой как 0/0 или √-1. При возникновении одной из указанных ис­ключительных ситуаций результату присваивается специальное значение.

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

Арифметические операции над числами с плавающей запятой

Этот раздел посвящен правилам сложения, вычитания, умножения и деления чи­сел в формате с плавающей запятой, определенном стандартом IEEE. Указанные правила регулируют только базовые шаги при выполнении операций. А вот, на­пример, возможность переполнения или потери значимости в них не учтена. Бо­лее того, для промежуточных значений мантиссы и порядка может потребоваться более 24 и 8 бит соответственно. Эти и другие особенности операций с плаваю­щей запятой нужно принимать к сведению в процессе разработки арифметиче­ских устройств, соответствующих стандарту IEEE. Все особенности мы, конечно, не рассмотрим, но о важнейших, таких как округление, поговорим обязательно.

Если порядок двух операндов с плавающей запятой различен, их мантиссы пе­ред сложением или вычитанием должны быть сдвинуты относительно друг друга. В качестве примера рассмотрим сложение чисел 2,9400 х 102 и 4,3100 х 104. Пред­ставим 2,9400 х 102 как 0,0294 х 104 и сложим мантиссы, вследствие чего получим 4,3394 х 104. Последовательность операций при сложении и вычитании можно описать следующим образом.

Правило сложения и вычитания

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

2. Установить порядок результата равным большему порядку операндов.

3. Выполнить сложение/вычитание мантисс и определить знак результата.

4. Нормализовать результат в случае необходимости.

Умножение и деление чисел с плавающей запятой даже проще их сложения и вычитания — для выполнения этих операций выравнивать мантиссы не требуется.

Правило умножения

1. Сложить порядки операндов и вычесть из результата значение 127.

2. Перемножить мантиссы и определить знак результата.

3. В случае необходимости нормализовать результат.

Правило деления

1. Вычесть порядок делителя из порядка делимого и прибавить к результату значение 127.

2. Разделить мантиссы и определить знак результата.

3. В случае необходимости нормализовать результат.

Прибавление или вычитание 127 при умножении и делении выполняется по­тому, что порядки чисел представлены в формате с избытком 127.

Разряды защиты и усечение

Реализация описанных алгоритмов имеет ряд важных особенностей, обзор кото­рых дан в настоящем разделе. Хотя размер мантисс исходных операндов и конеч­ного результата ограничен 24 разрядами, включая подразумеваемую ведущую 1, важно, чтобы в ходе промежуточных вычислений сохранялось несколько допол­нительных разрядов, называемых разрядами защиты или сторожевыми разряда­ми. Это позволяет обеспечить необходимую точность конечного результата.

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

Существует несколько способов усечения. Простейший из них заключается в удалении разрядов защиты без изменения остальных разрядов. Такая операция называется усечением. Предположим, что необходимо сократить дробное значение с шести разрядов до трех. Любые значения, лежащие в диапазоне от 0,b-1b-2b-3000 до 0,b-1b-2b-3111, усекаются до 0,b-1b-2b-3. Ошибка усечения до 3-разрядного ре­зультата находится в диапазоне 0 − 0,000111, то есть от 0 и почти до 1 в младшем из оставшихся разрядов. У нас это разряд b-3. В результате усечения получается сме­щенное приближение, поскольку диапазон ошибки не симметричен нулю.

Еще одним простым методом усечения является фон-неймановское округление. Если все удаляемые разряды содержат нули, последние отбрасываются без изме­нения оставшихся разрядов. Но если хоть один из удаляемых разрядов содержит 1, младший разряд оставшегося значения устанавливается в 1. В нашем примере усечения дробного значения с шести разрядов до трех любые 6-разрядные значе­ния, в которых b-4b-5b-6 не равны 000, укорачиваются до 0,b-1b-21. Величина ошибки этого метода лежит в диапазоне от -1 до +1 младшего из оставшихся раз­рядов. И хотя при таком способе усечения значения диапазон ошибки больше, чем при простом усечении, ее максимальная величина остается той же, а прибли­жение получается несмещенным, так как диапазон ошибки симметричен относи­тельно нуля.

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

Перейдем к следующему методу усечения значения — округлению. Задача ок­ругления состоит в максимальном приближении результирующего значения к ис­ходному. Оно гораздо точнее полученного путем усечения и к тому же дает несме­щенный результат. Округление выполняется так: если старший из удаляемых разрядов содержит 1, к младшему из оставшихся разрядов числа прибавляется 1. Таким образом, 0,b-1b-2b-31- округляется до 0,b-1b-2b-3+0,001, а 0,b-1b-2b-30... — до 0,b-1b-2b-3. Результат получается предельно близким к исходному числу за ис­ключением ситуации, когда удаляемые разряды равны 10...0. В этом случае исход­ное значение лежит посредине между двумя возможными усеченными представле­ниями. Для обеспечения несмещенного приближения можно выбирать значение младшего из оставшихся разрядов таким образом, чтобы всегда получалось бли­жайшее четное значение.

В рассматриваемом примере с использованием 6 разря­дов значение 0,b-1b-20100 округляется до 0,b-1b-20, a 0,b-1b-21100— до 0,b-1b-21+ 0,001. Эту технологию можно описать так: округление до ближайшего числа, а в случае двух одинаковых ошибок округления — до ближайшего четного числа.

Ошибка округления лежит в диапазоне от -1/2 до +1/2 значения младшего из оставшихся разрядов. Очевидно, что это наилучший метод. Однако реализовать его труднее всего, поскольку потребуется дополнительная операция и, возможно, нормализация. Согласно стандарту IEEE, для усечения чисел по умолчанию ис­пользуется округление. В этом стандарте описаны и другие методы усечения; все они определены как режимы округления.

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

Результаты одной операции должны вычисляться с точностью до половины единицы в младшем разряде. В общем случае с этой целью результат должен уко­рачиваться путем округления. Для обеспечения такой точности на промежуточ­ных шагах выполнения операции достаточно сохранять три разряда защиты. Пер­вые два — это старшие разряды мантиссы, которые в конце вычислений подлежат удалению. Третий разряд содержит результат выполнения логической операции ИЛИ всех разрядов мантиссы, кроме указанных двух разрядов защиты. Поддер­живать его на промежуточных шагах операции достаточно просто. Он инициали­зируется нулем, а когда в него из мантиссы выдвигается 1,становится равным 1 и сохраняет это значение. Поэтому данный разряд иногда называют вторым проме­жуточным битом округления (sticky bit).

Соседние файлы в папке Архитектура компьютеров