- •Предисловие
- •Введение
- •Глава 1. Множества
- •§ 1. Множества н их спецификация
- •§ 2. Простейшие операции над множествами
- •X ∉ ø при любом х.
- •§ 3. Диаграммы Венна
- •§ 4. Подмножества и доказательства
- •Глава 2. Отношения
- •§ 5. Произведения множеств
- •§ 1. Основные понятия
- •§ 2. Графические представления
- •§ 3. Свойства отношений
- •§ 4. Разбиения и отношения эквивалентности
- •§ 5. Отношения порядка
- •§ 6. Отношения на базах данных и структурах данных
- •§ 7. Составные отношения
- •§ 8. Замыкание отношений
- •Глава 3. Функции
- •§ 1. Функции и отображения
- •§ 2. Обратные функции и отображения
- •§ 3. Мощность множеств и счетность
- •§ 4. Некоторые специальные классы функций
- •§ 5. Аналитические свойства вещественных функций
- •§ 6. Операции
- •Глава 4. Основные понятия арифметики
- •§ 1. «Малая» конечная арифметика
- •§ 2. «Большая» конечная арифметика
- •§ 3. Двоичная арифметика
- •§ 4. Логическая арифметика
- •Глава 5. Алгебраические структуры
- •§ 1. Алгебраические структуры и подструктуры
- •§ 2. Простейшие операционные структуры
- •§ 3. Кольца и поля
- •§ 4. Линейная алгебра
- •4.1. Векторные пространства о линейные преобразования.
- •§ 5. Решетка и булевы алгебры
- •§ 6. Замкнутые полукольца
- •Глава 6. Матрицы
- •§ 1. Матрицы и бинарные отношения на конечных множествах
- •§ 2. Матрицы над другими алгебраическими структурами
- •§ 3. Матрицы и векторные пространства
- •Глава 7. Теория графов
- •§ 1. Вводные понятия
- •§ 2. Маршруты, циклы и связанность.
- •§ 3. Планарные графы
- •3.1. Теоремы Эйлера и Куратовского.
- •3.2. Раскраска карт и графов.
- •§ 4. Структуры данных для представления графа
- •§ 5. Обход графа
- •5.2. Обход графа по глубине.
- •5.4. Остовные леса обходов по глубине и ширине.
- •§ 6. Ориентированные графы
- •6.2. Маршруты и связность в орграфах.
- •Глава 8. Языки и грамматики
- •§ 1. Основные понятия
- •§ 2. Грамматики с фразовой структурой
- •2.1. Основные определения.
- •§ 3. Контекстно-свободные языки
- •§ 4. Понятия грамматического разбора и грамматических модификаций
- •§ 5. Грамматики операторного предшествования
- •Глава 9. Конечные автоматы
- •§ 1. Общие понятия
- •§ 2. Конечные автоматы
- •§ 3. Регулярная алгебра
- •Глава 10.Компьютерная геометрия
- •§ 1. Системы координат для подмножеств r3
- •§ 2. Преобразования
- •§ 3. Кривые и поверхности
§ 3. Двоичная арифметика
Из
уже построенных арифметик над
и
легко выделить основы двоичной арифметики.
Существуют две так называемые двоичные
арифметики. Первая
– это
так называемая
знаковая
и
модульная
форма, определённая на
,
т.е.
(определённое
в предыдущем параграфе) с добавленным
знаком, расширяющим элементы
.
Знак обычно кодируют в бинарной форме:
для «
»
и
для «
».
Вторая арифметика
(двоичная
арифметика дополнений)
–
это
с
элементами
во
всех
n
позициях.
Этот вид двоичной арифметики используется
в большинстве компьютеров. Поэтому
ограничим наши рассмотрения
.
Чтобы сделать обсуждение более конкретным,
рассмотрим
,
элементы которого лежат в пределах от
(т.е.
содержит
различных чисел). Число
представляется в
как
.
Поэтому легко найти двоичное дополнение.
Для этого надо слегка изменить все
двоичные цифры, называемые битами, чтобы
получить дополнение до
,
а затем прибавить
,
чтобы получить дополнение до 2.
П р и м е р 3.1.
.
//
Очевидно,
что могут возникнуть проблемы, вызванные
ограниченностью чисел. Мы не можем их
избежать, однако следует знать, когда
возможна «ошибка». Форма дополнения
делает проверку условия переполнения
относительно легкой, использующей
только значения старшего значащего
бита. (В
это бит с номером
.)
Этот
бит обозначает знак представляемого
числа и называется знаковым битом
или знаковым разрядом. Перед тем как
проверить, какое значение имеет знаковый
бит, напомним, что прибавление
к максимальному положительному числу
в
дает
максимальное отрицательное число
(наибольшее отрицательное число — это
отрицательное число, отстоящее дальше
всего от нуля). Другими словами, числа
повторяются ц
иклическим
образом. В
мы имеем ситуацию, изображенную на рис.
4.1.
Рис. 4.1
Что же произойдёт, если мы сложим два
числа
и
,
где
и
(в
,
a
= 16)?
Сумма
будет ограничена:
.
Само по себе это неравенство ничего не даёт. Поэтому мы рассмотрим три случая:
( I
) если
и
тогда
;
( II ) если
и
тогда
;
( III ) если и
тогда
.
Вначале
заметим, что результат в случае ( III
) находится в требуемых пределах и,
следовательно, всегда правильный. Чтобы
понять, как могут возникать ошибки в
случаях
и
,
необходимо вспомнить, что если
и
,
то число
представимо в конечной арифметике
числом
,
где
и
.
Аналогично, если
,
то
представимо
,
где
и
.
Следовательно, ответ будет неправильный,
если он в случае
положительный или в случае
отрицательный.
Чтобы объяснить эти заключения в терминах свойств знакового разряда, рассмотрим различные возможности сложения двух чисел:
а) оба числа отрицательны;
б) оба числа положительны;
в) числа имеют различные знаки.
Анализируя
эти случаи, видим, что переполнение
(ошибка переполнения) встречается тогда
и только тогда, когда существует перенос
в знаковый разряд или перенос из знакового
разряда, но
не оба вместе.
Для иллюстрации этого рассмотрим
несколько примеров в
.
Попытаемся сопоставить эти примеры со
случаями
и а)
в), рассмотренными выше.
П р и м е р 3.2. Напомним, что вычисления проводятся в :
. //
Вернёмся
теперь к умножению и делению. Сначала
рассмотрим умножение. Напомним, что в
(или, более точно, в
для достаточно большого n)
умножение на 10 можно получить «сдвигом»
всех цифр на одну позицию влево и записью
в 0-й позиции цифры 0. (В
умножение на m
также всегда можно осуществить сдвигом
влево.)
Следовательно, мы имеем простой способ умножения на неотрицательные степени числа 2 в – сдвиг каждой цифры влево на соответствующее число позиций.
П р и м е р 3.3. (Вычисления проводятся в .)
. //
Из
этих примеров видно, что метод также
хорошо работает для отрицательных
чисел, но результат будет с ошибкой (
переполнения), если на каждом этапе
менялся знак и если потом он опять
изменился. Для умножения произвольного
целого числа (элемента
)
используем свойство дистрибутивности
умножения по отношению к сложению и
представим множитель как сумму степеней
числа 2.
П р и м е р 3.4. (Вычисления проводятся в .)
.
Поэтому
.
//
Точно так же, как умножение производилось сдвигами влево, деление на положительные степени числа 2 осуществляется сдвигом вправо. (Деление на другие целые числа должно получаться путём сведения к вычитанию степеней числа 2. Этот процесс мы обсуждать не будем.) Однако специального рассмотрения требуют отрицательные числа. Отметим также, что в общем случае ожидаемый результат (т.е. арифметически ожидаемый результат в R) будет не целым, а дробным.
,
и
сдвигом
на
,
и
позиции соответственно. Имеем
(12)
Сдвиг
на одну позицию вправо автоматически
сводит любое отрицательное число к
положительному. В
сдвиг переводит
к
.
Чтобы исправить это, следует отнять от
результата число
,
что даст
(т.е.
).
То же самое можно получить, устанавливая
знаковый разряд равным 1. Следовательно,
правильный результат достигается
использованием знакового разряда,
значение которого равно 0 или 1 (в
зависимости от знака числа). Для того
чтобы заполнить «пропуски», создаваемые
в результате сдвига вправо.
Следовательно, приводит к
.
Действие битов (со значением
),
«выпадающих» из числа в результате
сдвига вправо, должно усекать результат.
Поэтому
даёт
.
Существует общепринятая практика
округлять число (вверх независимо от
знака) прибавлением к числу утерянного
последнего бита. Это соответствует
обычному арифметическому правилу
округления, поскольку
в первом бите остатка представляет
собой
.
Следовательно,
даёт
.
У п р а ж н е н и е 4.3.
1. Быстрый способ вычисления дополнения до 2 от данного битового элемента в заключается в следующем. Начиная с правого конца, копируем все идущие подряд нули и первую встретившуюся единицу. Затем все оставшиеся биты изменяем. Показать, что этот способ работает в большинстве случаев, и рассмотреть случаи, когда он не работает.
2.
Пусть в
производятся следующие вычисления.
Складывают два числа
и
(обозначим их сумму через
).
Если от
отнять
,
то получим некоторый результат
,
а
если от
отнять
,
то получим некоторое число
.
Что можно сказать о
и
?
Как отличаются результаты, если вычисления
производятся в
?
