- •4. Лекция. Представление чисел в компьютерах. Двоичная арифметика. Точность вычислений. Память компьютеров и адреса.
- •4.1. Числа, арифметические операции и символы
- •4.1.1. Представление целых чисел
- •4.1.2. Сложение положительных целых чисел
- •4.1.3. Сложение и вычитание целых чисел со знаком
- •4.1.4. Переполнение в целочисленной арифметике
- •4.2. Символы
- •4.3. Обработка чисел с плавающей запятой
- •4.3.1. Стандарт ieee для чисел с плавающей запятой
- •4.3.2. Арифметические операции над числами с плавающей запятой
- •4.3.3. Точность вычислений. Разряды защиты и усечение
- •4.4. Память и адреса
- •4.5. Операции доступа к памяти. Коды ascii символов.
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-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).