Помощь в написании студенческих работ
Антистрессовый сервис

Алгоритм выполнения операций умножения двоичных чисел

КурсоваяПомощь в написанииУзнать стоимостьмоей работы

Записать полученное значение дробной части после десятичной точки. Если значение мантиссы меньше выделенного под нее количества разрядов, то дополнить ее незначащими нулями справа до предусмотренного форматом размера. Расширенное вещественное число состоит из 80 бит: первый бит — знак мантиссы, 16 бит — характеристика и 63бита — мантисса. С помощью этого формата можно представить нормированные… Читать ещё >

Алгоритм выполнения операций умножения двоичных чисел (реферат, курсовая, диплом, контрольная)

1. Индивидуальное задание

2. Введение

3. Разработка алгоритма и программного модуля преобразования данных в заданный формат

4. Разработка алгоритма арифметической операции

5. Разработка программы-эмулятора

6. Тестирование программы

7. Вывод

8. Список использований литературы

9. Листинг программы

1. Индивидуальное задание

Разработать алгоритм выполнения операций умножения двоичных чисел в формате расширенной точности на сумматоре обратного кода.

Входные данные: Десятичные числа в строковом формате, например 22, 22.33

Выходные данные: Входные числа в двоичной системе счисления, в формате расширенной точности, результат требуемой операции и погрешности вычислений.

2. Введение

Алгоритм решения задачи:

1) Преобразование входной строки в десятичное число;

2) Перевод из десятичной системы счисления в двоичную;

3) Преобразование двоичного числа в формат расширенной точности;

4) Повторить 1−3 пункты для второго числа;

5) Перевод чисел в обратный код;

6) Выполнение требуемой операции (умножение);

7) Перевод результата в прямой код;

8) Нормализация;

9) Вычисление погрешностей.

3. Разработка алгоритма и программного модуля преобразования данных в заданный формат

Формат расширенной точности:

Расширенное вещественное число состоит из 80 бит: первый бит — знак мантиссы, 16 бит — характеристика и 63бита — мантисса. С помощью этого формата можно представить нормированные числа в диапазоне от до .

Если значение знакового бита равно 1, то число считается отрицательным, если 0 — то положительным. Число нуль считается положительным.

Размерность формата

80 бита

Размерность мантиссы

53 бита

Размерность порядка

15 бит

Смещение порядка

+16 383

Обратный код.

Обратный код для положительного числа совпадает с прямым кодом. Для отрицательного числа все цифры числа заменяются на противоположные (1 на 0, 0 на 1), а в знаковый разряд заносится единица.

Преобразования в обратный код

Диапазон представляемых значений:

Минимальное число: |±12•2-16 382 |? |± 3,3 621 0314e-4932|

Максимальное число: |±12•216 383-1|? |± 5,948 6574e+4931|

+16 383 -16 382. +16 383

Алгоритм преобразования вещественного десятичного числа в двоичное число с плавающей точкой формата расширенной точности.

1. Представить целую часть вещественного числа в двоичном виде и поставить после нее десятичную точку.

2. Преобразовать дробную часть вещественного числа в двоичный формат.

3. Записать полученное значение дробной части после десятичной точки. Если значение мантиссы меньше выделенного под нее количества разрядов, то дополнить ее незначащими нулями справа до предусмотренного форматом размера.

4. Нормализовать полученное двоичное число, определив значение показателя степени.

5. К показателю степени прибавить +16 383.

6. Записать значение характеристики в соответствующие биты формата перед нормализованной мантиссой.

7. Если число положительное, то в самый старший разряд представления следует записать 0, если отрицательное — то 1.

Перевод целых чисел методом деления

Перевод правильных дробей методом умножения

Оценка точности выполнения арифметических операций.

Причинами погрешностей вычислений на ЭВМ могут быть:

— неточное задание исходных данных, участвующих в выполняемой операции (либо из-за ограниченности разрядной сетки, либо из-за погрешностей перевода информации из одной системы счисления в другую);

— использование приближенных методов вычислений, что дает методическую погрешность;

— округление результатов элементарных операций;

— накапливание погрешностей в последовательности элементарных операций;

— сбои в работе ЭВМ.

Абсолютная погрешность — разность между истинным значением величины, А и ее значением, полученным из машинного изображения АM (или [A]), т. е. ?[A]=A-AM.

Относительная погрешность представления — это величина [A]=?[A]/AM.

Пример преобразования числа в формат расширенной точности.

К примеру возьмём число 45.56

Целая часть 4510 = 1 011 012.

0.5610= 0.1 000 111 101 011 099 972 243 774 085 060 363 970 370 503 039 959 741 497 3442.

45.5610=101 101.10001111010111000010100011110101110000101011100001011100012.

Нормализуем:

1.11 011 000 111 101 011 808 410 366 120 350 065 306 831 522 550 415 564 531 040 256*25.

Характеристика q =16 383+5 = 1 000 000 000 001 002;

S

порядок

мантисса

101 101.10001111010111000010100011110101110000101011100001011100012= 45.560 000 000 000 000 000

Полученное число не равно исходному, потому что мантисса ограниченна.

Абсолютная погрешность: ?[A] = |45.56- 45.560 000 000 000 000 000| =0.2

Относительная погрешность: [A] =? 4.389 815•10-21

4. Разработка алгоритма арифметической операции

Алгоритм умножения двух чисел:

1) Перевод мантисс слагаемых в обратный код;

2) Вычисление произведения мантисс сомножителей в форме с фиксированной запятой

3) Сложение смещенных порядков сомножителей;

4) Нормализация результата.

Перевод мантисс слагаемых в обратный код.

Вычисление произведения мантисс сомножителей в форме с фиксированной запятой

Нормализация результата.

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);

Модифицированный сдвиг

Программная реализация алгоритма выполнения арифметической операции.

Структура программы-эмулятора.

Разработка графического интерфейса

При запуске программы пользователь увидит:

программа алгоритм эмулятор умножение

Введём, А и В сразу

После ввода В

После можно проссмотреть процесс умножения по шагово стрелкой «<�», или результат стрелкой «>»

Нажмём «>»

6. Тестирование программы

1) Введите число А: 18 446 744 073 709 551 616

Введите число А: 1

A (в 2-ой СС): 1 111 111 111 111 111 175 397 733 269 696 633 141 548 198 543 527 822 709 080 719 360

B (в 2-ой СС): 1

A в расширенной точности

0|100 000 000 111 110|1111111111111111111111111111111111111111111111111111111111111111

B в расширенной точности

0|11 111 111 111 111|1000000000000000000000000000000000000000000000000000000000000000

A[обр]: 0|100 000 000 111 110|1111111111111111111111111111111111111111111111111111111111111111

B[обр]: 0|11 111 111 111 111|1000000000000000000000000000000000000000000000000000000000000000

——————————————-;

00|0|1000000000000000000000000000000000000000000000000000000000000000 Z->

00|0|0100000000000000000000000000000000000000000000000000000000000000 Z->

00|0|0010000000000000000000000000000000000000000000000000000000000000 Z->

00|0|0001000000000000000000000000000000000000000000000000000000000000 Z->

00|0|0000100000000000000000000000000000000000000000000000000000000000 Z->

00|0|0000010000000000000000000000000000000000000000000000000000000000 Z->

00|0|0000001000000000000000000000000000000000000000000000000000000000 Z->

00|0|0000000100000000000000000000000000000000000000000000000000000000 Z->

00|0|0000000010000000000000000000000000000000000000000000000000000000 Z->

00|0|0000000001000000000000000000000000000000000000000000000000000000 Z->

00|0|0000000000100000000000000000000000000000000000000000000000000000 Z->

00|0|0000000000010000000000000000000000000000000000000000000000000000 Z->

00|0|0000000000001000000000000000000000000000000000000000000000000000 Z->

00|0|0000000000000100000000000000000000000000000000000000000000000000 Z->

00|0|0000000000000010000000000000000000000000000000000000000000000000 Z->

00|0|0000000000000001000000000000000000000000000000000000000000000000 Z->

00|0|0000000000000000100000000000000000000000000000000000000000000000 Z->

00|0|0000000000000000010000000000000000000000000000000000000000000000 Z->

00|0|0000000000000000001000000000000000000000000000000000000000000000 Z->

00|0|0000000000000000000100000000000000000000000000000000000000000000 Z->

00|0|0000000000000000000010000000000000000000000000000000000000000000 Z->

00|0|0000000000000000000001000000000000000000000000000000000000000000 Z->

00|0|0000000000000000000000100000000000000000000000000000000000000000 Z->

00|0|0000000000000000000000010000000000000000000000000000000000000000 Z->

00|0|0000000000000000000000001000000000000000000000000000000000000000 Z->

00|0|0000000000000000000000000100000000000000000000000000000000000000 Z->

00|0|0000000000000000000000000010000000000000000000000000000000000000 Z->

00|0|0000000000000000000000000001000000000000000000000000000000000000 Z->

00|0|0000000000000000000000000000100000000000000000000000000000000000 Z->

00|0|0000000000000000000000000000010000000000000000000000000000000000 Z->

00|0|0000000000000000000000000000001000000000000000000000000000000000 Z->

00|0|0000000000000000000000000000000100000000000000000000000000000000 Z->

00|0|0000000000000000000000000000000010000000000000000000000000000000 Z->

00|0|0000000000000000000000000000000001000000000000000000000000000000 Z->

00|0|0000000000000000000000000000000000100000000000000000000000000000 Z->

00|0|0000000000000000000000000000000000010000000000000000000000000000 Z->

00|0|0000000000000000000000000000000000001000000000000000000000000000 Z->

00|0|0000000000000000000000000000000000000100000000000000000000000000 Z->

00|0|0000000000000000000000000000000000000010000000000000000000000000 Z->

00|0|0000000000000000000000000000000000000001000000000000000000000000 Z->

00|0|0000000000000000000000000000000000000000100000000000000000000000 Z->

00|0|0000000000000000000000000000000000000000010000000000000000000000 Z->

00|0|0000000000000000000000000000000000000000001000000000000000000000 Z->

00|0|0000000000000000000000000000000000000000000100000000000000000000 Z->

00|0|0000000000000000000000000000000000000000000010000000000000000000 Z->

00|0|0000000000000000000000000000000000000000000001000000000000000000 Z->

00|0|0000000000000000000000000000000000000000000000100000000000000000 Z->

00|0|0000000000000000000000000000000000000000000000010000000000000000 Z->

00|0|0000000000000000000000000000000000000000000000001000000000000000 Z->

00|0|0000000000000000000000000000000000000000000000000100000000000000 Z->

00|0|0000000000000000000000000000000000000000000000000010000000000000 Z->

00|0|0000000000000000000000000000000000000000000000000001000000000000 Z->

00|0|0000000000000000000000000000000000000000000000000000100000000000 Z->

00|0|0000000000000000000000000000000000000000000000000000010000000000 Z->

00|0|0000000000000000000000000000000000000000000000000000001000000000 Z->

00|0|0000000000000000000000000000000000000000000000000000000100000000 Z->

00|0|0000000000000000000000000000000000000000000000000000000010000000 Z->

00|0|0000000000000000000000000000000000000000000000000000000001000000 Z->

00|0|0000000000000000000000000000000000000000000000000000000000100000 Z->

00|0|0000000000000000000000000000000000000000000000000000000000010000 Z->

00|0|0000000000000000000000000000000000000000000000000000000000001000 Z->

00|0|0000000000000000000000000000000000000000000000000000000000000100 Z->

00|0|0000000000000000000000000000000000000000000000000000000000000010 Z->

00|0|0000000000000000000000000000000000000000000000000000000000000001 m (b)(-2)=1: +m (a)

00|1 111 111 111 111 111 175 397 733 269 696 633 141 548 198 543 527 822 709 080 719 360

00|1 111 111 111 111 111 175 397 733 269 696 633 141 548 198 543 527 822 709 080 719 360|0000000000000000000000000000000000000000000000000000000000000001 Z->

00|111 111 111 111 111 117 539 773 326 969 663 314 154 819 854 352 782 270 908 071 936|1000000000000000000000000000000000000000000000000000000000000000

мантисса (Z (обр))=00.111 111 111 111 111 117 539 773 326 969 663 314 154 819 854 352 782 270 908 071 936

P (z)=64+1=65

mantisa (Z (pr.))=00.111 111 111 111 111 117 539 773 326 969 663 314 154 819 854 352 782 270 908 071 936

Сдвиг на 1 влево 00.111 111 111 111 111 117 539 773 326 969 663 314 154 819 854 352 782 270 908 071 936 P (z)=65−1=64

Z=0.111 111 111 111 111 117 539 773 326 969 663 314 154 819 854 352 782 270 908 071 936*264

Z=1 111 111 111 111 111 175 397 733 269 696 633 141 548 198 543 527 822 709 080 719 360

Z=18 446 744 073 709 551 616.000000000000000000

Абсолютная погрешность: 1.5 000 000 000 0000E+0001

Относительная погрешность: 8.1 315 162 936 4128E-0019

Истинное значение: 1.8 446 744 073 7096E+0019

2)

Введите число А: 0.5

Введите число В: 2

A (в 2-ой СС): 0.11 011 011 111 001 101 461 404 778 496

B (в 2-ой СС): 10

A в расширенной точности

0|11 111 111 111 111|0000000000000000000000000000000000011011011111001101111111011001

B в расширенной точности

0|100 000 000 000 000|1000000000000000000000000000000000000000000000000000000000000000

A[обр]: 0|11 111 111 111 111|0000000000000000000000000000000000011011011111001101111111011001

B[обр]: 0|100 000 000 000 000|1000000000000000000000000000000000000000000000000000000000000000

——————————————-;

00|0|1000000000000000000000000000000000000000000000000000000000000000 Z->

00|0|0100000000000000000000000000000000000000000000000000000000000000 Z->

00|0|0010000000000000000000000000000000000000000000000000000000000000 Z->

00|0|0001000000000000000000000000000000000000000000000000000000000000 Z->

00|0|0000100000000000000000000000000000000000000000000000000000000000 Z->

00|0|0000010000000000000000000000000000000000000000000000000000000000 Z->

00|0|0000001000000000000000000000000000000000000000000000000000000000 Z->

00|0|0000000100000000000000000000000000000000000000000000000000000000 Z->

00|0|0000000010000000000000000000000000000000000000000000000000000000 Z->

00|0|0000000001000000000000000000000000000000000000000000000000000000 Z->

00|0|0000000000100000000000000000000000000000000000000000000000000000 Z->

00|0|0000000000010000000000000000000000000000000000000000000000000000 Z->

00|0|0000000000001000000000000000000000000000000000000000000000000000 Z->

00|0|0000000000000100000000000000000000000000000000000000000000000000 Z->

00|0|0000000000000010000000000000000000000000000000000000000000000000 Z->

00|0|0000000000000001000000000000000000000000000000000000000000000000 Z->

00|0|0000000000000000100000000000000000000000000000000000000000000000 Z->

00|0|0000000000000000010000000000000000000000000000000000000000000000 Z->

00|0|0000000000000000001000000000000000000000000000000000000000000000 Z->

00|0|0000000000000000000100000000000000000000000000000000000000000000 Z->

00|0|0000000000000000000010000000000000000000000000000000000000000000 Z->

00|0|0000000000000000000001000000000000000000000000000000000000000000 Z->

00|0|0000000000000000000000100000000000000000000000000000000000000000 Z->

00|0|0000000000000000000000010000000000000000000000000000000000000000 Z->

00|0|0000000000000000000000001000000000000000000000000000000000000000 Z->

00|0|0000000000000000000000000100000000000000000000000000000000000000 Z->

00|0|0000000000000000000000000010000000000000000000000000000000000000 Z->

00|0|0000000000000000000000000001000000000000000000000000000000000000 Z->

00|0|0000000000000000000000000000100000000000000000000000000000000000 Z->

00|0|0000000000000000000000000000010000000000000000000000000000000000 Z->

00|0|0000000000000000000000000000001000000000000000000000000000000000 Z->

00|0|0000000000000000000000000000000100000000000000000000000000000000 Z->

00|0|0000000000000000000000000000000010000000000000000000000000000000 Z->

00|0|0000000000000000000000000000000001000000000000000000000000000000 Z->

00|0|0000000000000000000000000000000000100000000000000000000000000000 Z->

00|0|0000000000000000000000000000000000010000000000000000000000000000 Z->

00|0|0000000000000000000000000000000000001000000000000000000000000000 Z->

00|0|0000000000000000000000000000000000000100000000000000000000000000 Z->

00|0|0000000000000000000000000000000000000010000000000000000000000000 Z->

00|0|0000000000000000000000000000000000000001000000000000000000000000 Z->

00|0|0000000000000000000000000000000000000000100000000000000000000000 Z->

00|0|0000000000000000000000000000000000000000010000000000000000000000 Z->

00|0|0000000000000000000000000000000000000000001000000000000000000000 Z->

00|0|0000000000000000000000000000000000000000000100000000000000000000 Z->

00|0|0000000000000000000000000000000000000000000010000000000000000000 Z->

00|0|0000000000000000000000000000000000000000000001000000000000000000 Z->

00|0|0000000000000000000000000000000000000000000000100000000000000000 Z->

00|0|0000000000000000000000000000000000000000000000010000000000000000 Z->

00|0|0000000000000000000000000000000000000000000000001000000000000000 Z->

00|0|0000000000000000000000000000000000000000000000000100000000000000 Z->

00|0|0000000000000000000000000000000000000000000000000010000000000000 Z->

00|0|0000000000000000000000000000000000000000000000000001000000000000 Z->

00|0|0000000000000000000000000000000000000000000000000000100000000000 Z->

00|0|0000000000000000000000000000000000000000000000000000010000000000 Z->

00|0|0000000000000000000000000000000000000000000000000000001000000000 Z->

00|0|0000000000000000000000000000000000000000000000000000000100000000 Z->

00|0|0000000000000000000000000000000000000000000000000000000010000000 Z->

00|0|0000000000000000000000000000000000000000000000000000000001000000 Z->

00|0|0000000000000000000000000000000000000000000000000000000000100000 Z->

00|0|0000000000000000000000000000000000000000000000000000000000010000 Z->

00|0|0000000000000000000000000000000000000000000000000000000000001000 Z->

00|0|0000000000000000000000000000000000000000000000000000000000000100 Z->

00|0|0000000000000000000000000000000000000000000000000000000000000010 Z->

00|0|0000000000000000000000000000000000000000000000000000000000000001 m (b)(-2)=1: +m (a)

00|11 011 011 111 001 101 461 404 778 496

00|11 011 011 111 001 101 461 404 778 496|0000000000000000000000000000000000000000000000000000000000000001 Z->

00|1 101 101 111 100 110 173 628 268 544|1000000000000000000000000000000000000000000000000000000000000000

мантисса (Z (обр))=00.1 101 101 111 100 110 173 628 268 544

P (z)=1+2=3

mantisa (Z (pr.))=00.1 101 101 111 100 110 173 628 268 544

Сдвиг на 36 влево 00.1 101 101 111 100 110 173 628 268 544 P (z)=3−36=-33

Z=0.1 101 101 111 100 110 173 628 268 544*2^-33

Z=0.1 101 101 111 100 110 173 628 268 544

Z=0.100 000 000

Абсолютная погрешность: 6.3 108 872 417 6809E-0030

Относительная погрешность: 6.3 108 872 417 6809E-0020

Истинное значение: 1.00E-0010

Вывод

В ходе выполнения работы были приобретены навыки выполнения построения логических основ ЭВМ. Так же подробнее изучены форматы представления двоичных чисел с плавающей точкой.

Список использований литературы

1. Савельев А. Я. Основы информатики. М.: Изд-во МГТУ им. Н. Э. Баумана, 2001 г., 328с.

2. Григорьев В. Л., Злобин В. К. Программирование арифметических операций в микропроцессорах. М.: Высш. школа, 1991. 303с.

Листинг программы

{$N+}

program kjhsg;

uses crt;

var n, ai: integer; as, as1, as2,vvs, vvs2, zs1,zs2:string; ach, zn: char;

ch1s1,ch1s2,ch2s1,ch2s2:string; ch1s1dv, ch2s1dv, ch1s2dv, ch2s2dv: string;

ch1n2,ch2n2:longint;

ch1n1,ch2n1:extended;

shag, avto: boolean;

tochn, porx, pory, porx2, pory2:integer;porxs, porys: string;

chpx, chpy: string;

chpminx, chpminy, norzac: boolean;

ma1,ma2,ma3,mb1,mb2,mb3:string;

z1,z2,z3,mz1,mz2,mz3:string;

modula:string;

por1,por2,por, por3, norsdv:longint;

pos1,pos2,pos1i, pos2is, pos2i: string;

pog1,nast, nast1, nast2,abspog:extended;

smeshgen1,smeshgen2:string;

procedure avshag;

var chk: char;

begin

if avto=false then begin

chk:=readkey;

case readkey of

#75:shag:=true;

#77:avto:=true;

end;

end;

end;

procedure DecToBin (const aStr: String;var zs, s1, s2:string;var nst: extended);

const

BaseIn = 10;

BaseOut = 2;

var

i, PosDot, aq, tochnost: Integer;

StrRes, vStr, StrSign, StrDot, as1q, as2q: String;

Num, TmpNum, Weight: Extended; cel: boolean;

begin

if aStr = '' then Exit;

if aStr[1] = '-' then begin

StrSign := '-';

vStr := Copy (aStr, 2, Length (aStr) — 1);

end else begin

StrSign := '';

vStr := aStr;

end;

zs:=StrSign;

PosDot := Length (vStr) + 1;

for i := 1 to Length (vStr) do begin

if vStr[i]='.' then begin

PosDot := i;

Break;

end;

end;

Num := 0;

Weight := 1;

for i := PosDot — 1 downto 1 do begin

case vStr[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;

end;

Weight := Weight * BaseIn;

end;

Weight := 1 / BaseIn;

for i := PosDot + 1 to Length (vStr) do begin

case vStr[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;

end;

Weight := Weight / BaseIn;

end;

nst:=num;

StrRes := '';

tochnost:=64;

TmpNum := Int (Num);

repeat

case Round (TmpNum — Int (TmpNum / BaseOut) * BaseOut) of

0: StrRes := '0' + StrRes;

1: StrRes := '1' + StrRes;

end;

TmpNum := Int (TmpNum / BaseOut);

tochnost:=tochnost-1;

until TmpNum = 0;

i := 0;

cel:=true;

TmpNum := Frac (Num);

while (TmpNum <> 0) and (tochnost> i) do begin

cel:=false;

if i = 0 then StrRes := StrRes + '.';

TmpNum := TmpNum * BaseOut;

case Round (Int (TmpNum)) of

0: StrRes := StrRes + '0';

1: StrRes := StrRes + '1';

end;

TmpNum := Frac (TmpNum);

Inc (i);

end;

aq:=1;

as1q:='';

as2q:='';

if cel=false then begin

while (StrRes[aq]<>'.') do begin

as1q:=as1q+StrRes[aq]; aq:=aq+1; end; aq:=aq+1;

as2q:=copy (StrRes, aq, length (StrRes)-1);

s1:=as1q;

s2:=as2q;

end else begin s1:=StrRes; s2:=''; end;

end;

function Dec2Bin (a:integer):string;

var

i:integer;

as, j: string;

begin

if a=0 then begin Dec2Bin:='0'; exit end;

as:='';

while a<>0 do

begin

i:=a mod 2;

str (i, j);

as:=j+as;

a:=a div 2;

end;

Dec2Bin:=as;

end;

function dr2bin (ds:string):string;

var i: integer; rs, tp: real;

begin

if ds='0' then begin dr2bin:='0'; exit end;

ds:='0.'+ds;

val (ds, rs, i);i:=0;

ds:='';

tp:=rs;

while (tp<>0)and (tochn>i)do begin

tp:=tp*2;

case round (int (tp)) of

0:ds:=ds+'0';

1:ds:=ds+'1';

end;

tp:=frac (tp);

inc (i);

end;

dr2bin:=ds;

end;

function obrcod (os:string;minss:boolean):string;

var i, j, n, k: integer; dos: string;

begin

if minss=false then begin obrcod:=os; exit; end;

n:=length (os);

for i:=1 to n do

if os[i]='1' then os[i]: ='0' else os[i]: ='1';

obrcod:=os;

end;

procedure doraven (var rs1, rs2:string);

begin

while length (rs1)<64 do rs1:=rs1+'0';

while length (rs2)<64 do rs2:=rs2+'0';

end;

function summ (a, b: string):string;

var

c, vume: string;

i, n: integer;

begin

c:='';

vume:='0';

while length (a)<>length (b) do

begin

if length (a)>length (b) then

b:='0'+b;

if length (a)

a:='0'+a;

end;

for i:=length (a) downto 1 do

begin

if (a[i]='0') and (b[i]='0') then

begin

c:=vume+c;

vume:='0';

end

else

if (a[i]='1') and (b[i]='1') then

begin

c:=vume+c;

vume:='1';

end

else

if (a[i]='1') or (b[i]='1') then

begin

if vume='0' then

c:='1'+c

else

c:='0'+c;

end;

end;

if vume<>'0' then c:=vume+c;

summ:=c;

end;

procedure modslog (mpa1,mpa2,mpb1,mpb2:string;var ms1, ms2:string);

var

ch1:char;

n, i: integer;

begin

ms2:=summ (mpa2,mpb2);

ms1:=summ (mpa1,mpb1);

if length (ms2)>length (mpa2) then begin

ms1:=summ (ms1,'1'); delete (ms2,1,1); end;

if length (ms1)>2 then begin ms2:=summ (ms2,'1'); delete (ms1,1,1);end;

end;

procedure sdvig;

var ch1: char; i, n: integer;

begin

val (z1,n, i);

case n of

00:begin z1:='00';ch1:=z2[length (z2)];

delete (z2,length (z2), 1); z2:='0'+z2;

delete (z3,length (z3), 1); z3:=ch1+z3; end;

01: begin

z1:='00';ch1:=z2[length (z2)];

delete (z2,length (z2), 1); z2:='1'+z2;

delete (z3,length (z3), 1); z3:=ch1+z3;end;

10: begin

z1:='11';ch1:=z2[length (z2)];

delete (z2,length (z2), 1); z2:='0'+z2;

delete (z3,length (z3), 1); z3:=ch1+z3;end;

11: begin z1:='11';ch1:=z2[length (z2)];

delete (z2,length (z2), 1); z2:='1'+z2;

delete (z3,length (z3), 1); z3:=ch1+z3; end;

end;

end;

procedure umnog;

var ch, chk: char; i, k, n:integer;shag, avto, mtrue2: boolean;

begin

for n:=1 to length (mb2) do z2:=z2+'0';

z1:='00'; z3:=mb2;

write (z1,'|', z2,'|', z3) ;

if chpminy then begin modslog (z1,z2,ma1,ma2,z1,z2); mz3:=z3;

writeln (' B<0 =>+A*2^(-n)');avshag;

writeln ('+');

writeln (ma1,'|', ma2);

write (z1,'|', z2,'|', z3);

end else avshag;

ch:=z3[length (z3)];

if ch='1' then writeln (' m (b)(-', length (mb2),')=1:+m (a)') else writeln (' Z->');

avshag;

avto:=false;

shag:=false;

k:=length (z3);

for i:=k downto 1 do begin

ch:=z3[k];

if ch='1' then

begin

modslog (z1,z2,ma1,ma2,z1,z2);

writeln ('+');

writeln (ma1,'|', ma2);

writeln (z1,'|', z2,'|', z3,' Z->');

end;

sdvig;

write (z1,'|', z2,'|', z3);

ch:=z3[k];

if i<>1 then begin

if ch='1' then writeln (' m (b)(-', i,')=1: +m (a)') else writeln (' Z->'); end;

if (chpminy) and (i=1) then begin

mtrue2:=true;

if zs1<>'-' then

modula:=obrcod (modula, mtrue2);

if zs1='-' then modslog (z1,z2,'00', modula, z1, z2)

else modslog (z1,z2,'11', modula, z1, z2);

writeln (' B<0 =>+A^(-)');

writeln ('+');

if zs1='-' then writeln ('00','|', modula) else writeln ('11','|', modula);

write (z1,'|', z2,'|', z3);

end ;

avshag;end;

writeln ('');end;

function izdvvdec (s1:string):longint;

var s: string;

i, j, sum, sum2: longint;

begin

s:=s1;

sum:=0;

for i:=length (s)-1 downto 1 do

begin

if s[i]='1' then

begin

sum2:=1;

for j:=1 to length (s)-i do sum2:=sum2*2;

end

else sum2:=0;

sum:=sum+sum2;

end;

if s[length (s)]='1' then inc (sum);

izdvvdec:=sum;

end;

function izdvvdec2(s1:string):string;

var co, i, j, k, n, g, cod:integer; sum, h, e, ns: extended;sr, pos1: string;posd:longint;

begin

sum:=0; e:=1;

for i:=1 to length (s1) do begin

sr:=s1[i];

if sr='1' then begin

ns:=1;

for k:=1 to length (s1)-i do ns:=ns*2; {tut zero !!!}

sum:=sum+(ns);end;

end;

str (sum:0:0,pos1);

izdvvdec2:=pos1;

end;

function dvvdecdrob (s1:string):string;

var co, i, j, k, n, g, cod:integer; sum, h, e, ns: extended;sr, pos2: string;posd:longint;

begin

sum:=0; e:=1;

for i:=1 to length (s1) do begin

sr:=s1[i];

if sr='1' then begin

ns:=1;

for k:=1 to i do ns:=ns*2; {tut zero !!!}

h:=e/ns;

sum:=sum+(h);end;

end;

str (sum:-1:30,pos2);

delete (pos2,1,2);

dvvdecdrob:=pos2;end;

procedure normaliz;

begin

if (nast1<>0)and (nast2<>0) then begin {pri nulE}

if z1='11' then

while z2[1]='1' do begin

delete (z2,1,1); norsdv:=norsdv+1; norzac:=true;

end;

if z1='00' then

while z2[1]='0' do begin

delete (z2,1,1); norsdv:=norsdv+1; norzac:=true;

end;end;end;

procedure posl;

var ch: char; i, k, l:integer; mtrue: boolean;

begin

writeln ('');

writeln ('мантисса (Z (обр))=', z1,'.', z2);

por1:=izdvvdec (porxs);

por2:=izdvvdec (porys);

por:=por1+por2;

writeln ('P (z)=', por1,'+', por2,'=', por);

mtrue:=false ;

if z1='11' then mtrue:=true ;

z2:=obrcod (z2,mtrue);

writeln ('mantisa (Z (pr.))=', z1,'.', z2);normaliz;

if norzac then begin

writeln ('Сдвиг на ', norsdv,' влево ', z1,'.', z2,

' P (z)=', por,'-', norsdv,'=', por-norsdv)end;

if z1='11' then zn:='-';

writeln ('Z=', zn,'0.', z2,'*2^', por-norsdv);

por3:=por-norsdv;

por:=por-norsdv ;

l:=1;

if por>0 then begin

while por<>0 do begin

pos1:=pos1+z2[l]; por:=por-1;l:=l+1;end;

for i:=l to length (z2) do pos2:=pos2+z2[i]; end

else begin

pos1:='0';

pos2:=z2;

while por<>0 do begin

pos2:='0'+pos2; por:=por+1;end;

delete (pos2,63,length (pos2));

{for i:=l to length (z2) do pos2:=pos2+z2[i]; }

end;

if (length (pos1)+length (pos2))=por3 then writeln ('Z=', zn, pos1) else

writeln ('Z=', zn, pos1,'.', pos2);

pos1i:=izdvvdec2(pos1);

pos2i:=dvvdecdrob (pos2);

writeln ('Z=', zn, pos1i,'.', pos2i);

{str (pos2i, pos2is); }

pos1i:=pos1i+'.'+pos2i;

val (pos1i, nast1, n);

abspog:=abs (nast-nast1);

writeln ('Абсолютная погрешность: ', abspog); {TUT OSHIBKA}

writeln ('Относительная погрешность: ', abs (abspog/nast1){nast1:0:5});

if zn<>'-' then

writeln ('Истинное значение: ', nast)

else writeln ('Истинное значение: -', nast);

end;

procedure rastoch;

begin

nast:=nast1*nast2;

porx:=length (ch1s1dv); pory:=length (ch2s1dv);

porx2:=porx-1; pory2:=pory-1;

porxs:=Dec2Bin (porx); porys:=Dec2Bin (pory);

smeshgen1:=summ ('11 111 111 111 111', Dec2Bin (porx2));

smeshgen2:=summ ('11 111 111 111 111', Dec2Bin (pory2));

if ch1s2dv<>'' then writeln ('A (в 2-ой СС): ', zs1, ch1s1dv,'.', ch1s2dv)

else writeln ('A (в 2-ой СС): ', zs1, ch1s1dv) ;

if ch2s2dv<>'' then writeln ('B (в 2-ой СС): ', zs2, ch2s1dv,'.', ch2s2dv)

else writeln ('B (в 2-ой СС): ', zs2, ch2s1dv);

writeln ('');

if zs1='-' then chpminx:=true;

if zs2='-' then chpminy:=true;

ma2:=ch1s1dv+ch1s2dv;

mb2:=ch2s1dv+ch2s2dv;

if chpminx=true then ma1:='11' else ma1:='00';

if chpminy=true then mb1:='11' else mb1:='00';

doraven (ma2,mb2); modula:=ma2;

writeln ('A в расширенной точности');

writeln (ma1[1],'|', smeshgen1,'|', ma2);

writeln ('B в расширенной точности');

writeln (mb1[1],'|', smeshgen2,'|', mb2);

writeln ('');

end;

begin

shag:=false;

avto:=false;

clrscr;

write ('Программа выполняет перевод чисел в формат');

writeln ('расширенной точности, и их умножение');

writeln ('Пример вводимых данных: 22; 22.333;');

write ('Введите число А: ');

Readln (vvS);

DecToBin (vvS, zs1, ch1s1dv, ch1s2dv, nast1);

write ('Введите число B: ');

Readln (vvS2);

DecToBin (vvS2,zs2,ch2s1dv, ch2s2dv, nast2);

rastoch;

ma2:=obrcod (ma2,chpminx);

mb2:=obrcod (mb2,chpminy);

writeln ('A[обр]: ', ma1[1],'|', smeshgen1,'|', ma2);

writeln ('B[обр]: ', mb1[1],'|', smeshgen2,'|', mb2);

writeln ('———————————————');

umnog;

posl;

readln;

end.

Показать весь текст
Заполнить форму текущей работой