Алгоритм выполнения операций умножения двоичных чисел
Оглавление
1.
Индивидуальное задание
.
Введение
.
Разработка алгоритма и программного модуля преобразования данных в заданный
формат
.
Разработка алгоритма арифметической операции
.
Разработка программы-эмулятора
.
Тестирование программы
.
Вывод
.
Список использований литературы
.
Листинг программы
1. Индивидуальное задание
Разработать алгоритм выполнения операций
умножения двоичных чисел в формате расширенной точности на сумматоре обратного
кода.
Входные данные: Десятичные числа в строковом
формате, например 22, 22.33
Выходные данные: Входные числа в двоичной
системе счисления, в формате расширенной точности, результат требуемой операции
и погрешности вычислений.
2. Введение
Алгоритм решения задачи:
) Преобразование входной строки в
десятичное число;
) Перевод из десятичной системы счисления
в двоичную;
) Преобразование двоичного числа в формат
расширенной точности;
) Повторить 1-3 пункты для второго числа;
) Перевод чисел в обратный код;
) Выполнение требуемой операции
(умножение);
) Перевод результата в прямой код;
) Нормализация;
) Вычисление погрешностей.
3. Разработка алгоритма и
программного модуля преобразования данных в заданный формат
Формат расширенной точности:
Расширенное вещественное число состоит из 80 бит:
первый бит - знак мантиссы, 16 бит - характеристика и 63бита - мантисса. С
помощью этого формата можно представить нормированные числа в диапазоне от до
.
Если значение знакового бита равно 1, то число
считается отрицательным, если 0 - то положительным. Число нуль считается
положительным.
Размерность
формата
|
80
бита
|
Размерность
мантиссы
|
53
бита
|
Размерность
порядка
|
15
бит
|
Смещение
порядка
|
+16383
|
Обратный код.
Обратный код для положительного числа совпадает
с прямым кодом. Для отрицательного числа все цифры числа заменяются на
противоположные (1 на 0, 0 на 1), а в знаковый разряд заносится единица.
Преобразования в обратный код
Диапазон представляемых значений:
Минимальное число: |±12∙2-16382
| ≈ |± 3,36210314e-4932|
Максимальное число: |±12∙216383-1|
≈ |± 5,9486574e+4931|
+16383 -16382 .. +16383
Алгоритм преобразования
вещественного десятичного числа в двоичное число с плавающей точкой формата
расширенной точности.
1. Представить целую часть вещественного числа в
двоичном виде и поставить после нее десятичную точку.
. Преобразовать дробную часть вещественного
числа в двоичный формат.
. Записать полученное значение дробной части
после десятичной точки. Если значение мантиссы меньше выделенного под нее
количества разрядов, то дополнить ее незначащими нулями справа до
предусмотренного форматом размера.
. Нормализовать полученное двоичное число,
определив значение показателя степени.
. К показателю степени прибавить +16383.
. Записать значение характеристики в
соответствующие биты формата перед нормализованной мантиссой.
. Если число положительное, то в самый старший
разряд представления следует записать 0, если отрицательное - то 1.
Перевод целых чисел методом деления
Перевод правильных дробей методом
умножения
Оценка точности выполнения
арифметических операций.
Причинами погрешностей вычислений на ЭВМ могут
быть:
неточное задание исходных данных, участвующих в
выполняемой операции (либо из-за ограниченности разрядной сетки, либо из-за
погрешностей перевода информации из одной системы счисления в другую);
использование приближенных методов вычислений,
что дает методическую погрешность;
округление результатов элементарных операций;
накапливание погрешностей в последовательности элементарных
операций;
сбои в работе ЭВМ.
Абсолютная погрешность - разность между истинным
значением величины А и ее значением, полученным из машинного изображения АM
(или [A]), т.е. ∆[A]=A-AM.
Относительная погрешность
представления - это величина [A]=∆[A]/AM.
Пример преобразования числа в формат
расширенной точности.
К примеру возьмём число 45.56
.5610=
0.10001111010111000010100011110101110000101011100001011100012.
45.5610=101101.10001111010111000010100011110101110000101011100001011100012.
Нормализуем:
.011011000111101011100001010001111010111000010101110000101110001*25.
Характеристика q =16383+5 = 1000000000001002;
0
|
1000000000000
|
1011011000111101011100001010001111010111000010101110000101110001
|
S
|
порядок
|
мантисса
|
.10001111010111000010100011110101110000101011100001011100012=
45.559999999999999998
Полученное число не равно исходному, потому что
мантисса ограниченна.
Абсолютная погрешность: ∆[A]
= |45.56- 45.559999999999999998| =0.000000000000000002
Относительная погрешность: [A] = ≈
4.389815∙10-21
. Разработка алгоритма арифметической
операции
Алгоритм умножения двух чисел:
1) Перевод мантисс слагаемых в обратный
код;
) Вычисление произведения мантисс
сомножителей в форме с фиксированной запятой
) Сложение смещенных порядков
сомножителей;
) Нормализация результата.
Перевод мантисс слагаемых в обратный
код.
Вычисление произведения мантисс
сомножителей в форме с фиксированной запятой
Нормализация результата.
5. Разработка программы-эмулятора
Разработка структур данных.
Программа разработана на языке Turbo
Pascal 7.0.
Для представления чисел в формате расширенной
точности используем 3 строки
Zn - знак
числа, типа string[1];
Exp - порядок
числа, типа string[15];
Mnts - мантисса,
типа string[64];
Программная реализация модуля
преобразования данных
Сложение
двоичных
чисел
function summ(a,b:string):string;
Модифицированное сложение
procedure
modslog(mpa1,mpa2,mpb1,mpb2:string;var
ms1,ms2:string);
Модифицированный сдвиг
Программная реализация алгоритма
выполнения арифметической операции.
Структура программы-эмулятора.
Разработка графического интерфейса
При запуске программы пользователь увидит:
программа алгоритм эмулятор
умножение
Введём А и В сразу
После ввода В
После можно проссмотреть процесс умножения по
шагово стрелкой “←” , или результат стрелкой “→”
Нажмём “→”
. Тестирование программы
1) Введите число А: 18446744073709551615
Введите число А: 1(в 2-ой СС):
1111111111111111111111111111111111111111111111111111111111111111(в 2-ой СС): 1в
расширенной точности
|100000000111110|1111111111111111111111111111111111111111111111111111111111111111в
расширенной точности
|11111111111111|1000000000000000000000000000000000000000000000000000000000000000[обр]:
0|100000000111110|1111111111111111111111111111111111111111111111111111111111111111[обр]:
0|11111111111111|1000000000000000000000000000000000000000000000000000000000000000
-----------------------------
|0000000000000000000000000000000000000000000000000000000000000000|1000000000000000000000000000000000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0100000000000000000000000000000000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0001000000000000000000000000000000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000100000000000000000000000000000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000010000000000000000000000000000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000001000000000000000000000000000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000100000000000000000000000000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000010000000000000000000000000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000001000000000000000000000000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000100000000000000000000000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000010000000000000000000000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000001000000000000000000000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000100000000000000000000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000010000000000000000000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000001000000000000000000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000100000000000000000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000010000000000000000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000001000000000000000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000100000000000000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000010000000000000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000001000000000000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000100000000000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000010000000000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000001000000000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000100000000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000010000000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000001000000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000100000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000010000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000001000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000100000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000010000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000001000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000100000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000010000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000001000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000000100000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000000010000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000000001000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000000000100000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000000000010000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000000000001000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000000000000100000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000000000000010000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000000000000001000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000000000000000100000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000000000000000010000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000000000000000001000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000000000000000000100000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000000000000000000010000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000000000000000000001000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000000000000000000000100000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000000000000000000000010000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000000000000000000000001000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000000000000000000000000100000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000000000000000000000000010000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000000000000000000000000001000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000000000000000000000000000100000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000000000000000000000000000010000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000000000000000000000000000001000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000000000000000000000000000000100
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000000000000000000000000000000010
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000000000000000000000000000000001
m(b)(-2)=1: +m(a)
+
|1111111111111111111111111111111111111111111111111111111111111111
|1111111111111111111111111111111111111111111111111111111111111111|0000000000000000000000000000000000000000000000000000000000000001
Z->
|0111111111111111111111111111111111111111111111111111111111111111|1000000000000000000000000000000000000000000000000000000000000000
мантисса(Z(обр))=00.0111111111111111111111111111111111111111111111111111111111111111(z)=64+1=65(Z(pr.))=00.0111111111111111111111111111111111111111111111111111111111111111
Сдвиг на 1 влево
00.111111111111111111111111111111111111111111111111111111111111111
P(z)=65-1=64=0.111111111111111111111111111111111111111111111111111111111111111*2^64=1111111111111111111111111111111111111111111111111111111111111111=18446744073709551600.000000000000000000
Абсолютная погрешность: 1.50000000000000E+0001
Относительная погрешность:
8.13151629364128E-0019
Истинное значение: 1.84467440737096E+0019
Введите число А: 0.00000000005
Введите число В: 2(в 2-ой СС):
0.000000000000000000000000000000000011011011111001101111111011001(в 2-ой СС):
10в расширенной точности
|11111111111111|0000000000000000000000000000000000011011011111001101111111011001в
расширенной точности
|100000000000000|1000000000000000000000000000000000000000000000000000000000000000[обр]:
0|11111111111111|0000000000000000000000000000000000011011011111001101111111011001[обр]:
0|100000000000000|1000000000000000000000000000000000000000000000000000000000000000
-----------------------------
|0000000000000000000000000000000000000000000000000000000000000000|1000000000000000000000000000000000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0100000000000000000000000000000000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0010000000000000000000000000000000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0001000000000000000000000000000000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000100000000000000000000000000000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000010000000000000000000000000000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000001000000000000000000000000000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000100000000000000000000000000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000010000000000000000000000000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000001000000000000000000000000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000100000000000000000000000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000010000000000000000000000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000001000000000000000000000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000100000000000000000000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000010000000000000000000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000001000000000000000000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000100000000000000000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000010000000000000000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000001000000000000000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000100000000000000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000010000000000000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000001000000000000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000100000000000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000010000000000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000001000000000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000100000000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000010000000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000001000000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000100000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000010000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000001000000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000100000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000010000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000001000000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000100000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000010000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000001000000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000000100000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000000010000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000000001000000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000000000100000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000000000010000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000000000001000000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000000000000100000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000000000000010000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000000000000001000000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000000000000000100000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000000000000000010000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000000000000000001000000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000000000000000000100000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000000000000000000010000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000000000000000000001000000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000000000000000000000100000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000000000000000000000010000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000000000000000000000001000000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000000000000000000000000100000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000000000000000000000000010000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000000000000000000000000001000000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000000000000000000000000000100000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000000000000000000000000000010000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000000000000000000000000000001000
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000000000000000000000000000000100
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000000000000000000000000000000010
Z->
|0000000000000000000000000000000000000000000000000000000000000000|0000000000000000000000000000000000000000000000000000000000000001
m(b)(-2)=1: +m(a)
+
|0000000000000000000000000000000000011011011111001101111111011001|0000000000000000000000000000000000000000000000000000000000000001
Z->
|0000000000000000000000000000000000001101101111100110111111101100|1000000000000000000000000000000000000000000000000000000000000000
мантисса(Z(обр))=00.0000000000000000000000000000000000001101101111100110111111101100
P(z)=1+2=3(Z(pr.))=00.0000000000000000000000000000000000001101101111100110111111101100
Сдвиг на 36 влево
00.1101101111100110111111101100 P(z)=3-36=-33=0.1101101111100110111111101100*2^-33=0.0000000000000000000000000000000001101101111100110111111101100=0.000000000100000000
Абсолютная погрешность: 6.31088724176809E-0030
Относительная погрешность:
6.31088724176809E-0020
Истинное значение: 1.00000000000000E-0010
Вывод
В ходе выполнения работы были приобретены навыки
выполнения построения логических основ ЭВМ. Так же подробнее изучены форматы
представления двоичных чисел с плавающей точкой.
Список использований литературы
1. Савельев
А.Я. Основы информатики. М.: Изд-во МГТУ им. Н.Э. Баумана, 2001 г., 328с.
. Григорьев
В.Л., Злобин В.К. Программирование арифметических операций в микропроцессорах.
М.: Высш. школа, 1991. 303с.
Листинг программы
{$N+}kjhsg;crt;n,ai:integer;
as,as1,as2,vvs,vvs2,zs1,zs2:string; ach,zn:char;s1,ch1s2,ch2s1,ch2s2:string;
ch1s1dv,ch2s1dv,ch1s2dv,ch2s2dv:string;n2,ch2n2:longint;n1,ch2n1:extended;,avto:boolean;,porx,pory,porx2,pory2:integer;porxs,porys:string;,chpy:string;,chpminy,norzac:boolean;,ma2,ma3,mb1,mb2,mb3:string;,z2,z3,mz1,mz2,mz3:string;:string;,por2,por,por3,norsdv:longint;,pos2,pos1i,pos2is,pos2i:string;,nast,nast1,nast2,abspog:extended;,smeshgen2:string;avshag;chk:char;avto=false
then begin:=readkey;readkey of
#75:shag:=true;
#77:avto:=true;;;;DecToBin(const
aStr : String;var zs,s1,s2:string;var nst:extended);= 10;= 2;,
PosDot,aq,tochnost: Integer;, vStr, StrSign, StrDot,as1q,as2q : String;,
TmpNum, Weight : Extended; cel:boolean;aStr = '' then Exit;aStr[1] = '-' then
begin:= '-';:= Copy(aStr, 2, Length(aStr) - 1);else begin:= '';:= aStr;;:=StrSign;:=
Length(vStr) + 1;i := 1 to Length(vStr) do beginvStr[i]='.' then begin:=
i;;;;:= 0;:= 1;i := PosDot - 1 downto 1 do beginvStr[i] of
'0' : Num := Num + 0 * Weight;
'1' : Num := Num + 1 * Weight;
'2' : Num := Num + 2 * Weight;
'3' : Num := Num + 3 * Weight;
'4' : Num := Num + 4 * Weight;
'5' : Num := Num + 5 * Weight;
'6' : Num := Num + 6 * Weight;
'7' : Num := Num + 7 * Weight;
'8' : Num := Num + 8 * Weight;
'9' : Num := Num + 9 * Weight;;:=
Weight * BaseIn;;:= 1 / BaseIn;i := PosDot + 1 to Length(vStr) do beginvStr[i]
of
'0' : Num := Num + 0 * Weight;
'1' : Num := Num + 1 * Weight;
'2' : Num := Num + 2 * Weight;
'3' : Num := Num + 3 * Weight;
'4' : Num := Num + 4 * Weight;
'5' : Num := Num + 5 * Weight;
'6' : Num := Num + 6 * Weight;
'7' : Num := Num + 7 * Weight;
'8' : Num := Num + 8 * Weight;
'9' : Num := Num + 9 * Weight;;:=
Weight / BaseIn;;:=num;:= '';:=64;:= Int(Num);Round( TmpNum - Int(TmpNum /
BaseOut) * BaseOut ) of
: StrRes := '0' + StrRes;
: StrRes := '1' + StrRes;;:=
Int(TmpNum / BaseOut);:=tochnost-1;TmpNum = 0;:= 0;:=true;:= Frac(Num);(TmpNum
<> 0) and (tochnost> i) do begin:=false;i = 0 then StrRes := StrRes +
'.';:= TmpNum * BaseOut;Round(Int(TmpNum)) of
: StrRes := StrRes + '0';
: StrRes := StrRes + '1';;:= Frac(TmpNum);(i);;:=1;q:='';q:='';cel=false
then begin(StrRes[aq]<>'.') do beginq:=as1q+StrRes[aq]; aq:=aq+1; end;
aq:=aq+1;q:=copy(StrRes,aq,length(StrRes)-1);:=as1q;:=as2q;else begin
s1:=StrRes; s2:=''; end;;Dec2Bin(a:integer):string;:integer;,j:string;a=0 then
begin Dec2Bin:='0'; exit end;:='';a<>0 do:=a mod 2;(i,j);:=j+as;:=a div
2;;Bin:=as;;dr2bin(ds:string):string;i:integer; rs,tp:real;ds='0' then begin
dr2bin:='0'; exit
end;:='0.'+ds;(ds,rs,i);i:=0;:='';:=rs;(tp<>0)and(tochn>i)do begin:=tp*2;round(int(tp))
of
:ds:=ds+'0';
:ds:=ds+'1';;:=frac(tp);(i);;bin:=ds;;obrcod(os:string;minss:boolean):string;i,j,n,k:integer;
dos:string;minss=false then begin obrcod:=os; exit; end;:=length(os);i:=1 to n
doos[i]='1' then os[i]:='0' else os[i]:='1';:=os;;doraven(var rs1,rs2:string);length(rs1)<64
do rs1:=rs1+'0';length(rs2)<64 do
rs2:=rs2+'0';;summ(a,b:string):string;,vume:string;,n:integer;:='';:='0';length(a)<>length(b)
dolength(a)>length(b) then:='0'+b;length(a)<length(b)
then:='0'+a;;i:=length(a) downto 1 do(a[i]='0') and (b[i]='0')
then:=vume+c;:='0';(a[i]='1') and (b[i]='1') then:=vume+c;:='1';(a[i]='1') or
(b[i]='1') thenvume='0' then:='1'+c:='0'+c;;;vume<>'0' then
c:=vume+c;:=c;;modslog(mpa1,mpa2,mpb1,mpb2:string;var
ms1,ms2:string);:char;,i:integer;:=summ(mpa2,mpb2);:=summ(mpa1,mpb1);length(ms2)>length(mpa2)
then begin:=summ(ms1,'1'); delete(ms2,1,1) ; end;length(ms1)>2 then begin
ms2:=summ(ms2,'1'); delete(ms1,1,1);end;;sdvig;ch1:char; i,n:integer;(z1,n,i);n
of
:begin
z1:='00';ch1:=z2[length(z2)];(z2,length(z2),1); z2:='0'+z2;(z3,length(z3),1);
z3:=ch1+z3; end;
:
begin:='00';ch1:=z2[length(z2)];(z2,length(z2),1);
z2:='1'+z2;(z3,length(z3),1); z3:=ch1+z3;end;
:
begin:='11';ch1:=z2[length(z2)];(z2,length(z2),1);
z2:='0'+z2;(z3,length(z3),1); z3:=ch1+z3;end;
: begin
z1:='11';ch1:=z2[length(z2)];(z2,length(z2),1); z2:='1'+z2;(z3,length(z3),1);
z3:=ch1+z3; end;;;umnog;ch,chk:char;
i,k,n:integer;shag,avto,mtrue2:boolean;n:=1 to length(mb2) do
z2:=z2+'0';:='00'; z3:=mb2;(z1,'|',z2,'|',z3) ;chpminy then begin modslog(z1,z2,ma1,ma2,z1,z2);
mz3:=z3;(' B<0
=>+A*2^(-n)');avshag;('+');(ma1,'|',ma2);(z1,'|',z2,'|',z3);else
avshag;:=z3[length(z3)];ch='1' then writeln(' m(b)(-',length(mb2),')=1:+m(a)')
else writeln(' Z->');;:=false;:=false;:=length(z3);i:=k downto 1 do
begin:=z3[k];ch='1'
then(z1,z2,ma1,ma2,z1,z2);('+');(ma1,'|',ma2);(z1,'|',z2,'|',z3,'
Z->');;;(z1,'|',z2,'|',z3);:=z3[k];i<>1 then beginch='1' then
writeln(' m(b)(-',i,')=1: +m(a)') else writeln(' Z->'); end;(chpminy) and
(i=1) then begin:=true;zs1<>'-' then:=obrcod(modula,mtrue2);zs1='-' then
modslog(z1,z2,'00',modula,z1,z2)modslog(z1,z2,'11',modula,z1,z2);(' B<0
=>+A^(-)');('+');zs1='-' then writeln('00','|',modula) else
writeln('11','|',modula);(z1,'|',z2,'|',z3);;;end;('');end;izdvvdec(s1:string):longint;s:string;,j,sum,sum2:longint;:=s1;:=0;i:=length(s)-1
downto 1 dos[i]='1' then:=1;j:=1 to length(s)-i do
sum2:=sum2*2;sum2:=0;:=sum+sum2;;s[length(s)]='1' then
inc(sum);:=sum;;izdvvdec2(s1:string):string;co,i,j,k,n,g,cod:integer;
sum,h,e,ns:extended;sr,pos1:string;posd:longint;:=0; e:=1;i:=1 to length(s1) do
begin:=s1[i];sr='1' then begin:=1;k:=1 to length(s1)-i do ns:=ns*2; {tut zero
!!!}:=sum+(ns);end;;(sum:0:0,pos1);:=pos1;;dvvdecdrob(s1:string):string;co,i,j,k,n,g,cod:integer;
sum,h,e,ns:extended;sr,pos2:string;posd:longint;:=0; e:=1;i:=1 to length(s1) do
begin:=s1[i];sr='1' then begin:=1;k:=1 to i do ns:=ns*2; {tut zero
!!!}:=e/ns;:=sum+(h);end;;(sum:-1:30,pos2);(pos2,1,2);:=pos2;end;normaliz;(nast1<>0)and(nast2<>0)
then begin {pri nulE}z1='11' thenz2[1]='1' do begin(z2,1,1); norsdv:=norsdv+1;
norzac:=true;;z1='00' thenz2[1]='0' do begin(z2,1,1); norsdv:=norsdv+1;
norzac:=true;;end;end;posl;ch:char; i,k,l:integer; mtrue:boolean;('');('мантисса(Z(обр))=',z1,'.',z2);:=izdvvdec(porxs);:=izdvvdec(porys);:=por1+por2;('P(z)=',por1,'+',por2,'=',por);:=false
;z1='11' then mtrue:=true
;:=obrcod(z2,mtrue);('mantisa(Z(pr.))=',z1,'.',z2);normaliz;norzac then begin('Сдвиг
на
',norsdv,' влево
',z1,'.',z2,
'
P(z)=',por,'-',norsdv,'=',por-norsdv)end;z1='11' then zn:='-';('Z=',zn,'0.',z2,'*2^',por-norsdv);:=por-norsdv;:=por-norsdv
;:=1;por>0 then beginpor<>0 do begin:=pos1+z2[l];
por:=por-1;l:=l+1;end;i:=l to length(z2) do pos2:=pos2+z2[i];
endbegin:='0';:=z2;por<>0 do begin:='0'+pos2;
por:=por+1;end;(pos2,63,length(pos2));
{for i:=l to length(z2) do
pos2:=pos2+z2[i];};(length(pos1)+length(pos2))=por3 then writeln('Z=',zn,pos1)
else('Z=',zn,pos1,'.',pos2);i:=izdvvdec2(pos1);i:=dvvdecdrob(pos2);('Z=',zn,pos1i,'.',pos2i);
{str(pos2i,pos2is);
}i:=pos1i+'.'+pos2i;(pos1i,nast1,n);:=abs(nast-nast1);('Абсолютная
погрешность:
',abspog); {TUT OSHIBKA}('Относительная
погрешность:
',abs(abspog/nast1){nast1:0:5});zn<>'-' then('Истинное
значение:
',nast)writeln('Истинное
значение:
-',nast);;rastoch;:=nast1*nast2;:=length(ch1s1dv); pory:=length(ch2s1dv);:=porx-1;
pory2:=pory-1;:=Dec2Bin(porx);
porys:=Dec2Bin(pory);:=summ('11111111111111',Dec2Bin(porx2));:=summ('11111111111111',Dec2Bin(pory2));ch1s2dv<>''
then writeln('A(в
2-ой
СС):
',zs1,ch1s1dv,'.',ch1s2dv )writeln('A(в
2-ой
СС):
',zs1,ch1s1dv) ;ch2s2dv<>'' then writeln('B(в
2-ой
СС):
',zs2,ch2s1dv,'.',ch2s2dv)writeln('B(в
2-ой
СС):
',zs2,ch2s1dv);('');zs1='-' then chpminx:=true;zs2='-' then
chpminy:=true;:=ch1s1dv+ch1s2dv;:=ch2s1dv+ch2s2dv;chpminx=true then ma1:='11'
else ma1:='00';chpminy=true then mb1:='11' else mb1:='00';(ma2,mb2);
modula:=ma2;
writeln('A в расширенной точности');
writeln(ma1[1],'|',smeshgen1,'|',ma2);
writeln('B в расширенной точности');
writeln(mb1[1],'|',smeshgen2,'|',mb2);('');;:=false;
avto:=false;;('Программа выполняет перевод чисел
в формат');('расширенной точности, и их умножение');('Пример вводимых данных:
22; 22.333;');('Введите число А: ');
Readln(vvS);(vvS,zs1,ch1s1dv,ch1s2dv,nast1);
write('Введите число B: ');
Readln(vvS2);(vvS2,zs2,ch2s1dv,ch2s2dv,nast2);;:=obrcod(ma2,chpminx);:=obrcod(mb2,chpminy);('A[обр]:
',ma1[1],'|',smeshgen1,'|',ma2);('B[обр]:
',mb1[1],'|',smeshgen2,'|',mb2);('------------------------------');;;
readln;.