- •Содержание
- •Часть I. Арифметика в форматах с фиксированной точкой
- •1. Введение
- •Место и роль Арифметики цифровых вычислительных машин в современной науке
- •Предмет и предназначение настоящей книги
- •Рекомендации читателю
- •Раздел 2 достаточно просмотреть, быстро переворачивая страницы.
- •Позиционные системы счисления
- •Двоичная, восьмеричная, шестнадцатеричная и двоично-кодированные системы счисления
- •Преобразование чисел из десятичной в двоичную, восьмеричную и шестнадцатеричную системы счисления и наоборот
- •Представление чисел в форматах с фиксированной точкой
- •Формат с фиксированной точкой
- •Свойства формата с фиксированной точкой
- •Ограниченный диапазон представления чисел
- •Точность действительного числа в формате и точность формата
- •Значимость числа и потеря значимости
- •Эффективность использования двоичного формата
- •Представление чисел в прямом, обратном и дополнительном кодах
- •Взаимное преобразование прямого, обратного и дополнительного кодов
- •Взаимное преобразование прямого и обратного кодов отрицательных чисел
- •Взаимное преобразование обратного и дополнительного кодов отрицательных чисел
- •Взаимное преобразование прямого и дополнительного кодов отрицательных чисел
- •Запись кода числа в формат с фиксированной точкой
- •Функции системы записи и исключительные ситуации
- •Округление действительных чисел
- •Округление кодов действительных чисел с записью в формат с фиксированной точкой
- •Округление прямого кода числа
- •Округление обратного и дополнительного кодов положительного числа
- •Округление обратного кода отрицательного числа
- •Округление дополнительного кода отрицательного числа
- •Арифметические операции в форматах с фиксированной точкой
- •Операция пересылки
- •Операция изменения знака
- •Операции алгебраического сложения и вычитания
- •Сложение в дополнительном коде
- •Вычитание в дополнительном коде
- •Особенности сложения и вычитания в дополнительном коде
- •Сложение в обратном коде
- •Вычитание в обратном коде
- •Особенности сложения и вычитания в обратном коде
- •Взаимная замена операций вычитания и сложения
- •Сложение и вычитание в прямом коде
- •Операция алгебраического умножения
- •Умножение в прямом коде
- •Умножение в дополнительном коде
- •Умножение с преобразованием операндов в прямой код и произведения в дополнительный
- •Умножение дополнительного кода множимого на модуль множителя
- •Умножение дополнительного кода множимого на дополнительный код множителя
- •Умножение множимого в традиционной двоичной системе на множитель, представленный в двоичной системе счисления с алфавитом
- •Умножение дополнительных кодов с заменой знакового разряда множителя 1 на
- •Преобразование множителя с заменой цепочек единиц нулями
- •Преобразование множителя с сокращением вдвое верхней оценки количества единиц
- •Умножение на два разряда с переносом 1 в очередную двойку разрядов множителя
- •Умножение на два разряда с преобразованием множителя заменой цепочек единиц нулями
- •Умножение на два разряда множителя с увеличенным количеством нулевых частных произведений
- •Изменение операции над частным произведением
- •Вычисление частного произведения с требуемым знаком
- •Сокращение матриц дополнительных кодов частных произведений
- •Табличный способ умножения
- •Умножение чисел большой разрядности
- •Операции алгебраического деления и вычисления остатка
- •Математические основы некоторых способов деления двоичных чисел
- •Деление двоичных чисел в прямом коде
- •Деление с восстановлением остатка
- •Деление без восстановления остатка
- •Деление с вычислением очередного сдвинутого влево остатка
- •Деление без записи очередного остатка на место предыдущего
- •Деление двоичных чисел в дополнительном коде
- •Деление нормализованных двоичных чисел
- •Некоторые способы ускорения деления
- •Операция сравнение
- •Выполнение операций в двоично-десятичной системе счисления
- •Вычисление двоично-десятичного кода обратной десятичной цифры
- •Взаимные преобразования прямого, обратного и дополнительного кода двоично-десятичного числа
- •Изменение знака двоично-десятичных чисел
- •Сложение двоично-десятичных чисел
- •Сложение в двоично-десятичной системе 8421
- •Вычитание двоично-десятичных чисел
- •Литература
Операции алгебраического сложения и вычитания
Система арифметических операций, контролируя операнды, может проявить ситуацию невыполнимая операция и выработать сигнал прерывания, если операнд не является числом или значение операнда не определено.
Различают операции сложения/вычитания целых чисел, действительных чисел и комбинации целого и действительного числа.
Результат сложения/вычитания целых чисел должен быть числом целым вычисленным точно. При записи в формат результата точной суммы/разности целых чисел возможна ситуация переполнения формата результата. Исключительные ситуации потери точности и потери значимости сложиться не могут.
Результат сложения/вычитания действительных чисел и комбинации целого и действительного числа является числом действительным. При записи вычисленного точного значения в формат результата может выполняться округление (раздел 3.3.2). Поэтому возможны исключительные ситуации переполнения формата результата, потери точности, потери значимости и переполнения.
Как было отмечено в разделе 3.2, правила выполнения операций алгебраического сложения и вычитания в прямых кодах относительно сложны. Сложение/вычитание в обратном и особенно в дополнительном коде выполняется проще, чем в прямом, поскольку не возникает необходимость в анализе знаков операндов и сравнении их модулей.
Обычно операнды представлены в одинаковых кодах. Если операнды представлены в разных кодах, то конструктор, знакомый с правилами выполнения операции с операндами в одинаковых кодах, может самостоятельно сформулировать правила сложения/вычитания с получением результата в требуемом коде.
Если операнды представлены в разных форматах, то для выполнения операции их форматы расширяют до равных и минимальных. Если поля в форматах операндов не совпадают, то короткое поле расширяют до длинного. Расширяя поле дробной части числа вправо, в дополнительные позиции записывают:
в прямом и в дополнительном коде – нули независимо от знака числа;
в обратном коде положительного числа – нули, отрицательного числа – цифры обратные нулю.
Расширяя поле целой части числа влево, в дополнительные позиции записывают:
в прямом коде – нули независимо от знака числа;
в обратном и в дополнительном коде положительного числа – нули, отрицательного числа – цифры обратные нулю.
Ниже рассматриваются правила сложения/вычитания операндов в одинаковых форматах и кодах с получением результата в том же коде, что и код операндов.
Значение точного результата сложения (вычитания) не равное 0 строго определено и не зависит от того, в каком коде выполняется операция. Точный результат равный 0 может быть (+0) или (–0). Знак нуля зависит от того, в каком коде, и по каким правилам выполняется операция. Поскольку в дополнительном коде (варианты B или C) существует только (+0), то результат любой операции равный нулю в этих вариантах кода имеет знак (+). В варианте A дополнительного кода, в обратном и в прямом коде это не так.
Неоднозначность представления нуля в прямом, обратном и дополнительном коде варианта A в сочетании с незнанием программистом ситуаций, при которых образуется нуль с тем или иным знаком, может приводить к ошибкам в результатах выполнения программы. Например, выполняя программирование в ассемблере, программист может организовать ветвление в программе по знаку суммы, не задумавшись над тем, что сумма может быть равной 0. При сумме равной 0 направление перехода зависит от знака нуля. Каков он, зависит от значения слагаемых и кода, в котором выполняется операция.
Настоятельно рекомендую, прежде чем приступать к написанию ответственной программы ознакомиться с особенностями представления нуля в ЭВМ, на которой будет выполняться программа. Перенос ответственного программного обеспечения с ЭВМ одного типа на ЭВМ другого типа должен сопровождаться детальным изучением их различий в выполнении арифметических операций и их совместимости. Не случайно стандарт IEEE 754 строго определяет правила вычисления знака результата равного 0 для двоичных арифметических операций с плавающей точкой.
