Представление чисел с плавающей точкой

Автор работы: Пользователь скрыл имя, 27 Декабря 2011 в 20:21, курсовая работа

Описание работы

Требуется составить программу, расположенную в памяти с ячейки 400016, формирующую следующие четыре числа:
«Знак числа» в ячейке 600016 (однобайтное целое число «+» - 00 и «-» - 01),
«Знак порядка» в ячейке 600116 (однобайтное целое число «+» - 00 и «-» - 01),
Модуль порядка в ячейке 600216 (однобайтное целое число),
Мантисса как трёхбайтное целое число в ячейках 600316-600516.

Содержание работы

Введение…...…………………………………………………………………………..3
Аналитический обзор….…………………………………………………………….3
Описание выбранной программы-эмулятора……………………………………8
Практическая разработка…………………………………………………………..9
Описание использованных средств вычислительной техники………………13
Выводы……………………………………………………………………………………..13
Использованная литература………………………………………………………14

Файлы: 1 файл

Курсовая работа по ОЭС.doc

— 550.50 Кб (Скачать файл)
 

    Не  все двоичные комбинации в форматах, регламентированных стандартом, интерпретируются обычным способом. Крайние значения порядка – все нули (значение 0) и все единицы (значение 255 в формате обычной точности и 2047 в формате удвоенной точности) – представляют особые величины. Стандартом предусматривается представление в заданном формате следующих классов величин.

  • При значениях кода в поле порядка в интервале от 1 до 254 в формате обычной точности и от 1 до 2046 в формате удвоенной точности представляются нормализованные вещественные числа. Используется смещённый формат представления порядка и, следовательно, интервал возможных значений порядка простирается от -126 до +127 в формате обычной точности и от -1022 до +1023 – формате удвоенной точности. Нормализованная мантисса  включает бит, равный 1, слева от разделительной точки, который не хранится в поле мантиссы. Следовательно, в формате обычной точности представляется 24-разрядная мантисса, а в формате удвоенной точности – 53-разрядная.
  • Нулевое значение в поле порядка совместно с нулевым значением в поле мантиссы представляет значение +0 или -0  в зависимости от кода в бите знака мантиссы.
  • Заполнение поля порядка кодом 1 совместно с нулевым значением в поле мантиссы представляет значение +∞ и -∞ в зависимости от кода в бите знака мантиссы. Таким образом, формат позволяет представить на ограниченной разрядной сетке неограниченно большую числовую величину. Пользователь должен решить, трактовать ли переполнение как ошибку или обрабатывать в программе бесконечно большие величины.
  • Нулевое значение в поле порядка совместно с ненулевым значением в поле мантиссы представляет ненормализованные числа. В этом случае считается, что неявный старший разряд мантиссы равен 0, и значение порядка равно – 126 в формате обычной точности или -1022 – в формате удвоенной точности. Код в знаковом бите мантиссы по-прежнему определяет знак числа.
  • Заполнение поля порядка кодом 1 совместно с ненулевым кодом в поле мантиссы представляет так называемые необычные числовые величины (значения типа NaN – Not a Number). Включение в регламентируемые стандартом форматы возможности представлять подобные величины позволяет программисту сигнализировать посредством результата арифметической операции о различных исключительных ситуациях.
 

Представление величин в формате с плавающей точкой в соответствии со стандартом IEEE 754.

      Обычная точность (32 бит) Удвоенная точность (64 бит)
      Знак мантиссы Смещённый порядок Мантисса Значение Знак мантиссы Смещённый порядок Мантисса Значение
Положительный ноль 0 0 0 0 0 0 0 0
Отрицательный ноль 1 0 0 -0 1 0 0 -0
Плюс  бесконеч-ность 0 255 0 +∞ 0 2047 0 +∞
Минус бесконечность 1 255 0 -∞ 1 2047 0 -∞
Простое значение типа NaN 0 или 1 255 ≠0 NaN 0 или 1 2047 ≠0 NaN
Сигнализиру-ющее значение типа NaN 0 или 1 255 ≠0 NaN 0 или 1 2047 ≠0 NaN
Положительное нормализован-ное число 0 0<e<255 f 2e-127∙(1.f) 0 0<e<2047 f 2e-1023∙(1.f)
Отрицательное нормализован-ное число 1 0<e<255 f -2e-127∙(1.f) 1 0<e<2047 f -2e-1023∙(1.f)
Положительное ненормализо-ванное число 0 0 f≠0 2e-126∙(0.f) 0 0 f≠0 2e-1022∙(1.f)
Отрицательное ненормализо-ванное число 1 0 f≠0 -2e-126∙(0.f) 1 0 f≠0 -2e-1022∙(1.f)
 
 

Описание выбранной программы-эмулятора.

    Для решения поставленной задачи воспользуемся эмулятором Смирнова.

Основной  причиной выбора этого эмулятора  было то, что из-за некорректного отображения обоих эмуляторов на ПК с процессором Intel Pentium–IV их размеры окон эмуляторов превышают разрешение монитора пользователя и работа с ними просто невозможна. К тому же у эмулятора Дёмина-Пушкина как бы «срезается» правая часть главного окна программы, и доступ к кнопкам становится невозможен.  

 

Отображение эмуляторов Дёмина-Пушкина  и Смирнова на ПК с процессором  P-IV.

    Однако, из-за того, что эмулятор Смирнова состоит из нескольких окон, «привязанных» друг к другу, и на них доступны все необходимые кнопки управления, то, отменив привязку и удалив окно клавиатуры, можно более-менее комфортно работать с эмулятором. 

Работа  с Эмулятором Смирнова. 
 
 
 
 
 
 

Практическая  разработка программы.

    Для решения поставленной задачи необходимо представить число с плавающей точкой в виде четырёх байт, хранящихся в обратном порядке.

    В 4-м байте, хранящемся по адресу 5003h, находится бит знака числа и 6 бит смещённого порядка числа, а последний (младший) бит смещённого порядка хранится в предыдущем, третьем байте, располагающемся в ячейке 5002h.

    Следовательно, сначала необходимо загрузить в  аккумулятор третий байт числа, а затем, сдвинув байт, записать в аккумулятор 4-й байт числа, содержащий бит знака числа. При этом младший бит смещённого порядка будет располагаться в результате сдвига во флажковом регистре в бите, отвечающем за переполнение.

    Сдвинув 4-й байт числа, скопированный в  аккумулятор, в аккумуляторе мы получим значение смещённого порядка, а во флажке CY – бит знака числа. В зависимости от состояния CY в ячейку 6000h записываем 0h (знак числа – «+») или 1h (знак числа – «-»).

    Далее необходимо получить значение порядка  числа. Так как смещённый порядок  в нашем случае равен 12810 и порядок числа лежит на отрезке [-128; 127], то из полученного значения в аккумуляторе необходимо вычесть это смещение, равно 8016. Однако, если порядок отрицателен, мы не получим нужного нам значения в результате заёма в аккумуляторе при вычитании (значение CY равно 1).

    Например:

=

    То  есть полученное значение даже больше возможного!

    Следовательно, если после вычитания значение CY равно 1, необходимо записать в ячейку 6001h значение 1h (знак порядка – «-») из числа 80h вычесть значение смещённого порядка:

=

    Таким образом, после получения смещённого порядка в аккумуляторе после  второго сдвига необходимо сохранить это значение для последующих вычислений, например, в регистре B.

    После определения знака числа, знака порядка числа и значения самого порядка, сохраняемого в ячейке по адресу 6002h, необходимо проверить, нужно ли восстанавливать старшую единицу мантиссы в третьем байте числа. Если число больше, чем 80h, то старшую единицу восстанавливать не надо, иначе – нужно прибавить к этому байту значение 80h (восстановление старшей единицы). Полученное значение сохраняем по адресу 6005h, а второй и первый байты числа необходимо сохранить по адресу 6004h и 6003h, так как мантисса числа должна храниться в обратном порядке. 

    Перед началом выполнения алгоритма в  ячейки 6000h и 6001h записываются значения 00h для того, чтобы упростить алгоритм программы.

    Для организации диалога с пользователем  внесём в память необходимые строковые  константы, которые будем использовать при вводе и выводе данных. 
 
 
 
 
 
 
 
 
 

Блок-схема  программы.

 

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

Ячейка

4000

4003

4006

4009

400C

400E

4011

4013

4016

4018

401B

401D

4020

4021

4024

4025

4026

4027

402A

402D

4030

4033

4034

4037

4038

4039

403C

403D

403E

4041

4042

4043

4044

4045

4046

4047

4048

4049

404A

404D

404F

4052

4053

4055

4058

405A

405D

405F

4060

4063

4064

4065

4067

406A

406C

406F

4070

4071

4074

4075

4076

4079

407C

407F

4082

4085

4086

4089

408A

408B

408E

408F

4090

4093

4094

4097

4098

4099

409A

409D

409E

409F

40A2

40A5

40A8

40AB

40AE

40B0

40B3

16-й  код.

31 00 50

01 00 41

CD 4C 00

CD 52 00

3E 1B

CD 58 00

3E 48

CD 58 00

3E 1B

CD 58 00

3E 4A

CD 58 00

AF

21 00 60

77

2C

77

01 00 46

CD 4C 00

21 00 50

CD 67 00

77

CD 67 00

2C

77

CD 67 00

2C

77

CD 67 00

2C

77

2D

7E

17

7E

17

47

D2 53 40

3E 01

32 00 60

78

D6 80

D2 60 40

3E 01

32 01 60

3E 80

90

32 02 60

2D

7E

FE 80

D2 6C 40

C6 80

32 05 60

2D

7E

32 04 60

2D

7E

32 03 60

CD 49 00

01 20 46

CD 4C 00

21 00 60

7E

CD 61 00

2C

7E

CD 61 00

2C

7E

CD 61 00

2C

7E

CD 61 00

2C

7E

CD 61 00

2C

7E

CD 61 00

CD 49 00

01 40 46

CD 4C 00

CD 55 00

FE 59

CA 0C 40

C3 40 00

Код ассемблера.

LXI SP, 5000h;

LXI B, 4100h;

CALL 4Ch;

CALL 52h;

MVI A, 1Bh;

CALL 58h;

MVI A, 48h;

CALL 58h;

MVI A, 1Bh;

CALL 58h;

MVI A, 4A;

CALL 58h;

XRA A;

LXI H, 6000h;

MOV M, A;

INR L;

MOV M, A;

LXI B, 4600h;

CALL 4Ch;

LXI H, 5000h;

CALL 67h;

MOV M, A;

CALL 67h;

INR L;

MOV M, A;

CALL 67h;

INR L;

MOV M, A;

CALL 67h;

INR L;

MOV M, A;

DCR L;

MOV A, M;

RAL;

INR L;

MOV A, M;

RAL;

MOV B, A;

JNC 4053h;

MVI A, 1h;

STA 6000;

MOV A, B;

SUI 80h;

JNC 4060h;

MVI A, 1h;

STA 6001h;

MVI A, 80h;

SUB B;

STA 6002;

DCR L;

MOV A, M;

CPI 80h;

JNC 406Ch;

ADI 80h;

STA 6005h;

DCR L;

MOV A, M;

STA 6004h;

DCR L;

MOV A, M;

STA 6003h;

CALL 49h;

LXI B, 4620h;

CALL 4Ch;

LXI H, 6000h;

MOV A, M;

CALL 61h;

INR L;

MOV A, M;

CALL 61h;

INR L;

MOV A, M;

CALL 61h;

INR L;

MOV A, M;

CALL 61h;

INR L;

MOV A, M;

CALL 61h;

INR L;

MOV A, M;

CALL 61h;

CALL 49h;

LXI B, 4640h;

CALL 4Ch;

CALL 55h;

CPI 59h;

JZ 400Ch;

CALL 40h;

Комментарий к команде.

Создание стека программы по адресу 5000h;

Вывод заставки на ВТА; 
 

Очистка экрана и перевод курсора в начало экрана; 
 
 
 
 
 
 

Очистка аккумулятора;

Получение адреса знака числа;

Засылка в память значения 0h;

Получение адреса знака порядка числа; 

Вывод приглашения для ввода 16-го числа; 
 

Ввод 1-го байта числа;

Сохранение 1-го байта по адресу 5000h;

Ввод 2-го байта числа; 

Сохранение 2-го байта по адресу 5001h;

Ввод 3-го байта числа; 

Сохранение 3-го байта по адресу 5002h;

Ввод 4-го байта числа; 

Сохранение 4-го байта по адресу 5003h;

Получение адреса 3-го байта (5002h);

Копирование 3-го байта в аккумулятор;

Высвобождение младшего бита порядка числа в  CY;

Получение адреса 4-го байта;

Копирование 4-го байта в аккумулятор;

Сдвиг 4-го байта (получение знака числа в CY, порядка числа в аккумуляторе);

Сохранение значения смещённого порядка в регистре B;

Переход на 4053h, если CY=0 (знак числа - плюс);

Запись в аккумулятор 1h (минус числа);

Сохранение минуса числа в ячейку 6000h;

Восстановление  значения смещённого порядка числа;

Вычитание из аккумулятора порядка смещения (80h);

Переход на 4060h, если CY=0 (знак порядка - плюс);

Запись в аккумулятор1h (минус порядка);

Сохранение 1h в ячейке 6001 (сохранение знака числа «-»);

Запись в аккумулятор  порядка смещения (80h);

Вычитание значения смещённого порядка, хранящегося в B;

Сохранение порядка  числа в ячейке 6002;

Получение адреса 3-го байта (5002h);

Копирование 3-го байта в аккумулятор;

Сравнение 3-го байта  с 80h (проверка старшего бита на единицу);

Переход на 406Ch, если результат больше нуля (единицу восстанавливать не надо);

Добавление 80h (восстановление старшей единицы мантиссы);

Сохранение 3-го байта числа с восстановленной  единицей;

Получение адреса 2-го байта числа (5001h);

Копирование 2-го байта в аккумулятор;

Сохранение 2-го байта числа в ячейке 6004h;

Получение адреса 1-го байта числа (5000h);

Копирование 1-го байта числа в аккумулятор;

Сохранение 1-го байта числа в ячейке 6003h;

Перевод курсора  на новую строку ВТА;

Вывод строки результата преобразования; 

Получение адреса знака числа;

Вывод знака  числа на дисплей; 

Получение адреса знака порядка числа;

Вывод знака  числа на дисплей; 

Получение адреса порядка числа;

Вывод порядка  числа на дисплей; 

Получение адреса 3-го байта мантиссы;

Вывод 3-го байта  мантиссы на дисплей; 

Получение адреса 2-го байта мантиссы;

Вывод 2-го байта  мантиссы на дисплей; 

Получение адреса 1-го байта мантиссы;

Вывод 1-го байта  мантиссы на дисплей; 

Перевод курсора  на новую строку ВТА;

Вывод строки подтверждения  повтора программы; 

Ожидание нажатия клавиши;

Сравнение нажатой  клавиши с “Y”;

Переход на 400Ch если нажата клавиша “Y” (повтор программы);

Выход в монитор, ожидание команды;

 

Контрольный пример.

    Для проверки правильности работы программы  приведём контрольный пример.

    В диалоге ввода числа наберём  константу 79A35E71. Представим это шестнадцатеричное число в двоичном виде:

    Содержимое  памяти:  01111001b 10100011b 01011110b 01110001b

    Ячейка  памяти:                   5000h         5001h       5002h        5003h

    Так как число хранится в обратном порядке, то бит, отвечающий за знак числа  – старший бит в ячейке 5003h. Это «0», следовательно, знак числа – «+».

    Следующие семь бит и старший бит в ячейке 5002h составляют значение смещённого порядка. В данном случае это 11100010b. При вычитании из этого значения порядка смещения мы получим: = 01100010b=62h. Знак порядка числа – «+».

      В ячейке 5002h хранится первый байт мантиссы числа. Так как его старший бит не содержит старшей единицы, необходимо восстановить её. При этом мы получим значение 11011110b=DEh.

    Два оставшихся байта должны быть скопированы  без изменения. 

    В результате выполнения программы получим следующий результат:

    Содержимое  памяти:       00h      00h      62h     79h     A3h     DEh

    Ячейка  памяти:           6000h  6001h  6002h 6003h  6004h  6005h 

    Чего  и следовало ожидать. Следовательно, программа работает верно. 

Использованные  средства вычислительной техники.

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

    Процессор: Intel Pentium IV, 1.5 GHz.

    Оперативная память: 256 MB.

    Жёсткий диск: 40GB.

    Видеокарта: 1024x768, 32-Bit Color, Radeon 7500/7500LE.

    Операционная  система: Windows Millennium Edition. 

Выводы  по работе.

    В результате разработки создана программа, позволяющая наиболее быстро решить поставленную задачу. Данный алгоритм преобразования числа с плавающей точкой, по моему мнению, является самым быстрым в работе, несмотря на то, что дополнительно используется регистр B. Единственным недостатком программы можно считать большой размер текстовых констант, использованных в программе. Однако использование диалога значительно упрощает работу с программой, она становится понятной на интуитивном уровне, а анализ результата на ошибки происходит гораздо быстрее. 

Информация о работе Представление чисел с плавающей точкой