
- •Глава 3. Машинная арифметика
- •3.1. Машинное представление целых чисел
- •3.2. Арифметика чисел с фиксированной точкой
- •3.3. Арифметика чисел с плавающей точкой
- •3.3.2. Сложение чисел в форме с плавающей точкой
- •3.3.3. Умножение и деление чисел в форме с плавающей точкой
- •3.3.4. Точность арифметических операций с числами в форме с плавающей точкой
- •3.4. Вычисления с многократной точностью
- •3.4.1. Вычисления с большими целыми числами
- •3.4.2. Модулярная арифметика
- •3.4.3. Ускорение процесса умножения
- •3.5. Эффективные алгоритмы вычисления степеней
- •3.5.1. Бинарный метод
- •3.5.2. Метод факторизации показателя
- •3.6. Эффективные действия с дробями
- •3.7. Алгоритм Евклида для больших чисел
- •3.8. Алгоритмы разложения на простые множители
- •3.8.1.Метод пробных делений
- •3.8.2. Метод Ферма
- •3.8.3. Метод Крайчика
Глава 3. Машинная арифметика
3.1. Машинное представление целых чисел
Под формой машинного представления чисел понимается совокупность правил, устанавливающих соответствие между записью числа и его количественным значением.
Представление
целых чисел в прямом коде.
Натуральные числа
,
записанные в двоичной системе счисления,
являются наборами двоичных разрядов
из нулей и единиц (битов):
,
что соответствует равенству
.
Для единообразного
представления как положительных, так
и отрицательных целых чисел
отводится специальныйзнаковый
разряд
,
обособленный от остальных разрядов.
Принято соглашение: нуль в знаковом
разряде представляет «
»,
а единица «
».
Знаковый разряд помещается либо перед
остальными разрядами, либо после них.
Мы будем придерживаться первого варианта.
Тогдапредставление
целого числа в прямом коде,
занимающее
двоичных разрядов (
цифровых и один знаковый), имеет вид:
.
(23)
что соответствует равенству
.
Цифровой разряд
имеет вес
;
в частности, старший цифровой разряд
имеет вес
.
Подстроку
прямого кода будем называть егомодульной
(или цифровой)
частью.
При фиксированном
числе
цифровых двоичных разрядов в прямом
коде, в соответствии с комбинаторным
принципом умножения, может быть
представлено (возможно, с нулевыми
первыми цифрами)
целых чисел(единица
вычитается, поскольку две строки с
нулевыми цифровыми разрядами представляют
одно и то же число:
).
Наименьшее представляемое число равно
;
наибольшее равно
(последние равенства
вытекают из формулы суммирования
членов геометрической прогрессии с
начальным членом
и знаменателем
).
Неоднозначность представления нуля
является недостатком прямого кода.
Инвертирование.
Рассмотрим сначала пример. Натуральное
число
имеет трёхразрядную двоичную запись
(без знакового разряда):
.
Если в этой записи нули поменять на
единицы, а единицы на нули, получится
строка
,
которая представляет в прямом коде
число
.
При этом
;
.
Таким же образом
;
если поменять в этой записи двоичные
цифры по схеме
,
получим строку
,
которая представляет в прямом коде
число
;
при этом
;
.
Инвертированием
(или инверсией)
-разрядной
битовой строки
называется строка
,
полученная преобразованием по правилу
.
Операцию инвертирования называют такжедополнением
до единицы.
Например, если
,
то
Если рассматривать
строки
и
как двоичные записи натуральных чисел,
то их сумма по правилу двоичного сложения
даёт строку из единиц, то есть двоичную
запись числа
:
.
(24)
Представление целых чисел в обратном коде.
Поскольку вычисление разности двух чисел традиционным способом «в столбик» производится существенно дольше, чем сложение, и связано с «заниманием» единицы из старшего разряда, целесообразно заменить его более быстрыми операциями инвертирования и сложения. Этой цели служит представление отрицательных чисел в виде, отличном от прямого кода.
Положительные
целые числа имеют обратный код (англ.
inverted
code
или complement
on
one
— «дополнение
до единицы»)
,
совпадающий с прямым кодом.
Максимально возможное положительное
число в обратном коде по-прежнему равно
.
Обратный код
представления
отрицательного числа
получается
инвертированием модульной части прямого
кода.
Примеры. 1.
Пусть для представления целого числа
отведён байт (битов). Обратный код для
получается следующим образом:
;
.
Если интерпретировать
полученную битовую строку как прямой
код отрицательного числа с семью
цифровыми разрядами, то это код числа
:
.
2.
Содержимое байта
,
интерпретируемое как обратный код,
представляет отрицательное (поскольку
в старшем разряде единица) число
,
модуль которого получается инвертированием
всех разрядов кроме старшего (знакового):
.
Эта
же битовая
строка, интерпретируемая как прямой
код, представляет отрицательное число
.
При этом
.
3.
Обратный 8-битовый код
представляет число
:
.
Эта же битовая
строка, интерпретируемая как прямой
код, представляет отрицательное число
.
При этом
.
Пусть
— отрицательное число, прямой код
которого совпадает с обратным кодом
отрицательного числа
.
В
силу (24),
.
Так как
,
то
,
и
.
Таким образом, получаем утверждение:
Обратный
код отрицательного числа
с одним знаковым и
цифровыми разрядами совпадает с прямым
кодом отрицательного числа
:
.
Пример.
.
Полученная битовая строка, рассматриваемая
как прямой код, представляет число
.
К обратному коду
можно придти также следующим образом.
Изменим интерпретацию знакового разряда
в (23), приписывая ему по умолчанию
отрицательный вес
.
Это означает понимание записи (23) как
равенства
.
У положительного
числа знаковый разряд
,
так что для него новая интерпретация
знакового разряда ничего не меняет. У
отрицательного же числа
,
и запись (23) означает в новой интерпретации,
что
.
Поскольку при этом
,
то
.
Коэффициенты
получаются из цифр
прямого кода числа
поразрядным инвертированием
,
как это имеет место и при получении
обратного кода.
Итак, получение
обратного кода отрицательного числа
с
цифровыми разрядами равносильно
приписыванию знаковому разряду
отрицательного веса
и получению
прямого кода получающегося числа.
Для изменения
знака отрицательного числа
,
записанного в обратном коде, следует
инвертировать все его разряды, включая
знаковый; в результате получится прямой
код положительного числа
.
Пример.
;
инверсия всех разрядов, включая знаковый,
даёт
— прямой код числа
.
Обратный код имеет
тот же недостаток, что и прямой — двоякое
представление нуля: отрицательный нуль
как обратный код для
,
и положительный нуль
.
Приведём без доказательства следующее утверждение:
Вычисление
обратного кода разности чисел
можно осуществить в виде
по схеме:
1)
представить целые числа
и
в обратном коде;
2) сложить битовые строки по правилам двоичной арифметики;
3)
прибавить, к младшему разряду суммы
перенос
,
возникающий после сложения знаковых
разрядов; последний равен нулю или
единице:
.
(25)
Пример.
Рассмотрим вычисление разности
.
Имеем:
(для положительных
чисел обратный код совпадает с прямым);
далее,
;
;
.
Разность
отрицательного числа и положительного
целесообразно вычислять в машинной
арифметике, приписывая знак минус сумме
их модулей:
.
Такой же результат даёт и вычисление
по схеме (25). Так, при вычислении разности
с использованием обратных кодов при
пяти цифровых разрядах имеем:
;
;
;
— обратный код для числа
.
Представление целых чисел в дополнительном коде.
Дополнительный
код (англ.
two’s
complement
code
или
twos-complement
code
— «дополнение до двух»)
представления положительного числа
совпадает с его прямым кодом.
Максимальное представимое число в
-разрядной
сетке (
цифровых и один знаковый) по-прежнему
равно
.
Дополнительный код отрицательного числа получается инвертированием модульной части его прямого кода, прибавлением единицы к полученной битовой строке по правилам двоичной арифметики и сохранением единицы в качестве знакового разряда.
Примеры. 1. Пусть
для представления целого числа отведён
байт (битов). Дополнительный код для
получается следующим образом:
;
.
Если
интерпретировать полученную битовую
строку как прямой код, то это код числа
.
2.
Дополнительный код для числа
:
;
.
3.
Содержимое байта
,
интерпретируемое как дополнительный
код, представляет отрицательное
(поскольку в знаковом разряде единица)
число
,
модуль которого получается вычитанием
единицы и последующим инвертированием
всех разрядов, кроме старшего (знакового):
.
4.
Дополнительный 8-битовый код
представляет число
:
.
Минимальное
отрицательное число, представимое в
дополнительном коде, занимающем
основных (цифровых) разрядов и один
знаковый, есть
.
Наибольшее положительное (как и в случае
прямого или обратного кода) есть
.
В частности, байт (восемь разрядов),
интерпретируемый как дополнительный
код, представляет числа от
до
.
Недостатком дополнительного кода является необходимость выполнения при его получении арифметических действий, при которых единица переноса может проходить по всем разрядам. Это существенно увеличивает время, необходимое для взаимных преобразований между прямым и дополнительным кодом.
Поскольку
инвертирование модуля отрицательного
числа
означает, в силу (24), переход к числу
,
то после прибавления к его прямому коду
единицы получается
.
Итоговое дописывание знаковой единицы
означает получение прямого кода числа
.Таким образом,
.
(26)
Итак, переход
к дополнительному коду можно рассматривать
как приписывание знаковому разряду
отрицательного веса
.
Поскольку ,
то, беря дополнительный код уже для
,
получим в силу (26):
.
Итак, для того чтобы вернуться от дополнительного кода к прямому коду, достаточно повторно применить операцию получения дополнительного кода.
Приведём без доказательства следующее утверждение:
Дополнительный
код разности натуральных чисел
,
можно получить сложением дополнительных
кодов чисел
и
(напомним,
что для положительного
дополнительный код совпадает с прямым):
.
(27)
Примеры.
Пусть
.
;
;
;
;
—
дополнительный (он же и прямой) код
разности
.
Ещё один пример — когда разность оказывается отрицательной:
;
;
;
;
—
дополнительный
код числа
.
Представление дробных чисел в форме с естественной точкой. Естественная форма представления числа в ЭВМ — следствие повседневной практики записи чисел в виде целой и дробной части, разделённых десятичной точкой (или запятой). У отрицательных чисел перед старшей цифрой помещается знак «–». Представление чисел с естественной точкой в виде последовательности цифр предполагает дополнительное указание на положение точки.
Представление дробных чисел в форме с фиксированной точкой. Необходимость в указании положения десятичной точки отпадает, если её место в разрядной сетке по умолчанию фиксировано.
Пусть
представление осуществляется в
позиционной системе счисления с
основанием
,
и на представление отводится
цифровых разрядов:
разрядов на дробную часть и
разрядов на целую. Тогда диапазон для
модуля ненулевых представляемых чисел
— от
до
.
Например, при
наибольшее число (все цифры в записи —
девятки) есть
.