Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 4. Как сделать так, чтобы вас уважали и ценили?
Как сделать лучше себе и другим людям
Как сделать свидание интересным?
Категории:
АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника
|
СимволыКомпьютеры должны обрабатывать не только числа, но и текстовую информацию, состоящую из символов. Под термином «символы» подразумеваются буквы алфавита, десятичные цифры, знаки препинания и т. п. Они представляются кодами, обычно имеющими длину 8 бит. Одной из наиболее широко распространенных кодовых таблиц является таблица ASCII (American Standard Code For Information Interchange), приведенная в приложении. 4.3. Обработка чисел с плавающей запятой До сих пор речь шла только о числах с фиксированной запятой и целочисленных значениях, то есть таких, при обработке которых предполагается, что двоичная запятая находится справа от числа. Если считать, что двоичная запятая располагается справа от знакового разряда, определяя дробное значение, то в системе дополнения до двух значение числа со знаком F, представленного n-разрядной двоичной дробью В= b 0 ,b -1, b -2 ...b -(n-1) определяется функцией F(B) = -b 0 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 в масштабном множителе. Теперь можно дать точное определение машинного представления числа с плавающей запятой: оно состоит из знака, строки значащих цифр, называемой мантиссой, и показателя степени (фиксированного основания), называемого порядком. 4.3.1. Стандарт 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 х 2 E’-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. Поскольку масштабный множитель представлен в формате 2 i, сдвиг мантиссы на один разряд вправо или влево компенсируется увеличением или уменьшением порядка на единицу. Во-вторых, в ходе вычислений может быть сгенерировано число, выходящее за рамки диапазона нормальных чисел. Если точность одинарная, это означает, что для представления нормализованного числа потребуется порядок менее -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. При возникновении одной из указанных исключительных ситуаций результату присваивается специальное значение. Если установлен флаг разрешения соответствующего прерывания, в исключительной ситуации происходит переход к системной или пользовательской программе обработки этого прерывания. В качестве альтернативы прикладная программа может сама проверять, нет ли исключений, и производить те или иные операции в соответствии с результатами проверки. 4.3.2. Арифметические операции над числами с плавающей запятой Этот раздел посвящен правилам сложения, вычитания, умножения и деления чисел в формате с плавающей запятой, определенном стандартом 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. 4.3.3. Точность вычислений. Разряды защиты и усечение Реализация описанных алгоритмов имеет ряд важных особенностей, обзор которых дан в настоящем разделе. Хотя размер мантисс исходных операндов и конечного результата ограничен 24 разрядами, включая подразумеваемую ведущую 1, важно, чтобы в ходе промежуточных вычислений сохранялось несколько дополнительных разрядов, называемых разрядами защиты или сторожевыми разрядами. Это позволяет обеспечить необходимую точность конечного результата. Когда разряды защиты удаляются из конечного результата, мантисса усекается до 24 разрядов. Усечение производится и в других ситуациях, в частности, при преобразовании десятичного числа в двоичный формат. Конечно, для обозначения данной операции употребляется также термин округление, но мы будем использовать его в более узком смысле, говоря об одном из способов усечения значения. Существует несколько способов усечения. Простейший из них заключается в удалении разрядов защиты без изменения остальных разрядов. Такая операция называется усечением. Предположим, что необходимо сократить дробное значение с шести разрядов до трех. Любые значения, лежащие в диапазоне от 0 ,b-1b-2b-3 000 до 0,b-1b-2b-3 111, усекаются до 0 ,b-1b-2b-3. Ошибка усечения до 3-разрядного результата находится в диапазоне 0 − 0,000111, то есть от 0 и почти до 1 в младшем из оставшихся разрядов. У нас это разряд b -3. В результате усечения получается смещенное приближение, поскольку диапазон ошибки не симметричен нулю. Еще одним простым методом усечения является фон-неймановское округление. Если все удаляемые разряды содержат нули, последние отбрасываются без изменения оставшихся разрядов. Но если хоть один из удаляемых разрядов содержит 1, младший разряд оставшегося значения устанавливается в 1. В нашем примере усечения дробного значения с шести разрядов до трех любые 6-разрядные значения, в которых b-4b-5b-6 не равны 000, укорачиваются до 0,b-1b-2 1. Величина ошибки этого метода лежит в диапазоне от -1 до +1 младшего из оставшихся разрядов. И хотя при таком способе усечения значения диапазон ошибки больше, чем при простом усечении, ее максимальная величина остается той же, а приближение получается несмещенным, так как диапазон ошибки симметричен относительно нуля. Для тех операций, в которых участвует много операндов и выполняется значительное количество промежуточных действий, предпочтительнее несмещенное приближение, при котором положительные и отрицательные ошибки компенсируют друг друга. Если статистически оценить результаты сложных вычислений с использованием несмещенного приближения, их точность окажется очень высокой. Перейдем к следующему методу усечения значения — округлению. Задача округления состоит в максимальном приближении результирующего значения к исходному. Оно гораздо точнее полученного путем усечения и к тому же дает несмещенный результат. Округление выполняется так: если старший из удаляемых разрядов содержит 1, к младшему из оставшихся разрядов числа прибавляется 1. Таким образом, 0,b-1b-2b-3 1- округляется до 0,b-1b-2b-3 +0,001, а 0,b-1b-2b-3 0 ... — до 0,b-1b-2b-3. Результат получается предельно близким к исходному числу за исключением ситуации, когда удаляемые разряды равны 10...0. В этом случае исходное значение лежит посредине между двумя возможными усеченными представлениями. Для обеспечения несмещенного приближения можно выбирать значение младшего из оставшихся разрядов таким образом, чтобы всегда получалось ближайшее четное значение. В рассматриваемом примере с использованием 6 разрядов значение 0,b-1b- 20100 округляется до 0,b-1b-2 0, a 0,b-1b-2 1100— до 0,b-1b-2 1 + 0,001. Эту технологию можно описать так: округление до ближайшего числа, а в случае двух одинаковых ошибок округления — до ближайшего четного числа. Ошибка округления лежит в диапазоне от -1/2 до +1/2 значения младшего из оставшихся разрядов. Очевидно, что это наилучший метод. Однако реализовать его труднее всего, поскольку потребуется дополнительная операция и, возможно, нормализация. Согласно стандарту IEEE, для усечения чисел по умолчанию используется округление. В этом стандарте описаны и другие методы усечения; все они определены как режимы округления. Обсуждая ошибки, возникающие из-за удаления разрядов защиты, мы говорили об одной операции усечения. Если программа выполняет длинную последовательность вычислений, в которой задействованы числа с плавающей запятой, анализ диапазонов ошибок и конечных результатов значительно усложняется. Этот аспект числовых вычислений мы больше обсуждать не будем, а напоследок еще раз обратимся к стандарту IEEE и посмотрим, как в нём определяются разряды защиты и округление. Результаты одной операции должны вычисляться с точностью до половины единицы в младшем разряде. В общем случае с этой целью результат должен укорачиваться путем округления. Для обеспечения такой точности на промежуточных шагах выполнения операции достаточно сохранять три разряда защиты. Первые два — это старшие разряды мантиссы, которые в конце вычислений подлежат удалению. Третий разряд содержит результат выполнения логической операции ИЛИ всех разрядов мантиссы, кроме указанных двух разрядов защиты. Поддерживать его на промежуточных шагах операции достаточно просто. Он инициализируется нулем, а когда в него из мантиссы выдвигается 1,становится равным 1 и сохраняет это значение. Поэтому данный разряд иногда называют вторым промежуточным битом округления (sticky bit).
|