Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
4
Добавлен:
22.02.2016
Размер:
247.74 Кб
Скачать

Лабораторна робота № 5

ПРОГРАМНЕ МОДЕЛЮВАННЯ МАШИННИХ АЛГОРИТМІВ ДОДАВАННЯ ТА ВІДНІМАННЯ ЧИСЕЛ З ПЛАВАЮЧОЮ КРАПКОЮ

Мета роботи: Розглянути машинні алгоритми виконання операцій додавання та віднімання над числами у форматі з плаваючою крапкою.

Теоретичні відомості:

Будь-яке число Х в позиційній однорідній системі числення з основою р можна записати як X = M*PK, де М називають мантисою числа Х, а К – порядком цього числа (наприклад, X = 0,4*108, то М = 0,4, Р = 10 , К = 8). Інакше порядок числа називають експонентою. Власне кажучи, число PK є масштабним коефіцієнтом, на який необхідно помножити число М для того, щоб уникнути переповнення розрядної сітки.

У форматі представлення чисел з плаваючою крапкою, виділяються 3 частини: знак числа (представляється вкрай лівим бітом формату); мантиса числа (представляється у вигляді правильного або неправильного двійкового дробу); порядок числа (представляється в загальному вигляді як ціле число зі знаком). Значення числа А з плаваючою крапкою, представляється у виді :

Апк=(sign A)-1*Ma*SPa

де sign A - знак 0 - «+», 1 - «-»

SPa - порядок числа А, S - підстава порядку.

Число з плаваючою крапкою, називається нормалізованим, якщо старша цифра його мантиси значуща (не 0), у противному випадку число називається не нормалізованим.

Основними особливостями представлення чисел з плаваючою крапкою, у сучасних ЕОМ є :

  1. Мантиса числа незалежно від його знака представляється в прямому коді

  2. Порядок числа представляється не в явному виді як знакове ціле, а зі зсувом у виді беззнакового цілого числа.

Ця особливість полегшує обробку порядку при виконанні арифметичних операцій. Величина зсуву дорівнює або вазі старшого розряду порядку, або на одиницю менше. Зміщений порядок прийнятий називати характеристикою числа.

  1. Як основа порядку використовується значення S=2.

  1. У переважній більшості випадків прийняте використання нормалізованих чисел з метою підвищення їхньої точності.

  2. При використанні основи порядку, рівній двом, нормалізоване число містить обов'язкову одиницю в старшому розряді мантиси. Це дозволяє не представляти його в явному виді у форматі, що дозволяє збільшити точність числа. Подібне приховання старшого розряду мантиси називається схованим розрядом (схованою одиницею).

  1. В ЕОМ для представлення чисел з плаваючою крапкою, прийнято використовувати кілька форматів (як правило, щоб задовольнити суперечливим вимогам підвищення точності чисел і підвищення швидкості їхньої обробки).

Ці формати мають найменування :

а) короткий (одинарної точності) - 32 біта;

б) довгий (подвійної точності) - 64 біта;

в) розширений (розширеної точності) - 80 біт.

Перехід від короткого формату до розширеного супроводжується підвищенням розрядності як мантиси так і порядку.

Короткий формат (В мові програмування PASCAL має назву SINGLE):

31 30 24 23 0

sign

характеристика

Мантиса

Подвійний формат (В мові програмування PASCAL має назву DOUBLE):

63 62 53 52 0

sign

характеристика

Мантиса

Розширений формат (В мові програмування PASCAL має назву EXTENDED):

79 78 64 63 0

Sign

характеристика

Мантиса

У мові програмування Pascal існує ще один тип даних з плаваючою крапкою REAL, який має довжину 6 байт і відрізняється від типу SINGLE тим, що має мантису на 2 байти довшу.

47 46 40 39 0

sign

характеристика

Мантиса

Схована одиниця має місце в короткому і довгому форматах, у розширеному форматі вона представляється в явному виді. Величина зсуву визначається як вага старшого розряду характеристики, зменшена на одиницю.

Додавання чисел з плаваючою крапкою. Нехай задано два числа у нормалізованому вигляді:

де, - мантиси у формі з фіксованою крапкою перед старшим розрядом у нормалізованій формі ,

знакові числа з фіксованою крапкою після молодшого розряду.

Треба знайти результат алгебраїчного додавання цих чисел: С=А+В, при цьому, зрозуміло, що С=ср – число з плаваючою крапкою, оскільки для того, щоб знайти суму двох чисел з різними порядками їх треба попередньо звести до спільного порядку, тобто перетворити один з доданків, наприклад, В таким чином

(mзаг-mа)

Після цього можна степінь основи системи числення у загальному степені винести за дужки і виконати лише додавання мантис:

Наприклад.

Мантиса числа В після перетворення повинна бути правильним дробом з тим, щоб при додаванні нічим не відрізнятися від звичайних (неперетворених) мантис. Тому перетворенню підлягає завжди менший доданок, оскільки у протилежному випадку відбувається переповнення розрядної сітки мантиси числа, яке перетворюється.

При цьому треба зробити "перенесення" крапки вліво на ma–mb – позицій (зсув мантиси вправо). При цьому частина розрядів мантиси може втратитись. Тому арифметичні дії над числами з плаваючою крапкою по своїй суті є наближеними, а не точними. При додаванні чисел в нормальній формі можна виділити 4 етапи.

Етапи алгебраїчного додавання чисел з плаваючою крапкою:

1. Урівноваження порядків доданків.

Менший порядок збільшується до більшого, а мантиса перетвореного числа зсувається вправо на відповідну кількість розрядів:

Знак і модуль різниці будуть визначати відповідно, який з доданків треба перетворити і на скільки розрядів слід зсунути їх мантису.

Якщо Z=0, то нічого не перетворюється, а при Z>0 перетворюється число В, інакше перетворюється число А.

При цьому молодші розряди числа, що перетворюється, можуть пропадати, в наслідок чого в доданок, зсунутий вправо, вноситься похибка.

2. Відбувається перетворення мантис доданків в один з спеціальних кодів (додатковий або обернений).

3. Виконується додавання мантис за правилами додавання чисел з фіксованою крапкою у відповідному спеціальному коді.

4. Потім результат переводиться в прямий код відбувається нормалізація результатів (при необхідності) до нього додається загальний порядок доданків і виконується округлення мантиси результату.

В залежності від абсолютних величин мантис доданків сума може одержуватися:

  • нормалізованою;

  • денормалізованою вправо;

  • денормалізованою вліво (переповнення).

Треба відмітити, що додані нормалізовані числа завжди мають 1 в р-1 розряді, а від'ємні в оберненому та додатковому кодах 0 в р-1.

Приклади. Нехай для подання чисел з плаваючою крапкою буде: n=8, m=4.

Знаковий розряд мантиси

Знаковий розряд порядка

-1

-2

-3

-4

-5

-6

-7

2

1

0

Sa

-1

-2

-3

-4

-5

-6

-7

Sm

m 2

m 1

m 0

n=8

m=4

і всі операції будуть виконуватися в додатковому коді.

а) А=-0,101012101

В=0,110012011

Апр=1|1010100||0|101

Впр=0|1100100||0|011

Z=ma-mb=102=2>0.

mзаг=0|101, ma>mb, необхідно зробити зсув мантіси числа B вправо на два розряди:

Впр=0|0011001||0|101

b'пр=0|0011001=в'дод

адод= 1|0101100

+

співпадання числа в знаковому розряді і в старшому розряді – ознака денормалізації вправо.

в’дод= 0|0011001

сдод = 1|1000101

соб=1|1000110

спр=1|0111011

спр=1|0111011||0|101 – мантиса денормалізована вправо на один розряд, тому необхідно зробити корекцію порядку:

m’=mзаг-1=101-1=100

відсікання, оскільки в результаті значущих цифр на одну більше ніж у вхідних даних!

Тоді спр=1|111011||0|100

С=-0,1110112100

б) А=-0,101012101

В=-0,110012100

mзаг=101, тому в мантисі В треба зробити зсув на 1 порядок вправо.

Апр=1|1010100||0|101

Впр=1|1100100||0|100

Впр'=1|0110010||0|101

адод= 1|0101100

переповнення (від'ємне) розрядної сітки, тому має місце денормалізація результата вліво.

в’дод= 1|1001110

сдод=10|1111010

При цьому треба мантису результату зсунути на один розряд вправо, а порядок збільшити на 1.

Сдод=1|0111101||0|110

Соб= 1|0111100

Спр= 1|1000011 (є відсікання)

С=-0,100012110

Зауваження.

1. Слід відмітити, що додатні нормалізовані числа завжди мають 1 у розряді , а відємні числа записані в інтервальному коді (додатковому або оберненому), мають 0 в розряді . Тому у нормалізованих чисел значення цифр розрядів з вагою р0 і р-1 не співпадають ні для додатних чисел, ні для зображень від'ємних чисел. В наслідок цього неспівпадання цифр у знакових розрядах свідчить про денормалізацію вліво (переповнення), а співпадання цифр знакового і старшого розрядів мантиси – про денормалізацію вправо.

2. При денормалізації результата вліво, мантиса результата (разом із знаковим розрядом) зсувається на один розряд вправо, а порядок – збільшується на один розряд, оскільки сума двох мантис може бути денормалізована вліво не більше ніж на один розряд.

3. При денормалізації вправо мантиса зсувається вліво (без знакового розряду) до появи в старшому розряді 1, при с>0, або 0 при с<0, а з порядку віднімається число одиниць, яке дорівнює кількості зсувів мантиси.

4. Кількість зсувів, як правило обмежується кількістю розрядів суматора, оскільки процес зсуву може бути нескінченним, якщо с=0. (мантиса =0). В цьому випадку після (n-1) зсувів результат покладається рівним машинному 0. Обнулення відбувається і тоді коли порядок числа внаслідок зсуву мантиси вліво зменшиться до числа меншого ніж допустиме число.

5. При додаванні може відбутися справжнє переповнення розрядної сітки числа, тобто переповнення розрядної сітки порядку. В даному випадку в ЕОМ формується сигнал про переповнення порядку.

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

В системах команд сучасних ЕОМ є великій набір команд на виконання операцій додавання і віднімання як з довгими, так і з короткими операндами, з нормалізацією і без нормалізації.

Хід роботи

Варіант: Перше число: 12.890, друге число: 6;

Блок-схема:

Блок-схема процедури Sum:

Блок-схема функції Dod:

Блок-схема функції ERROR:

Блок-схема функції Plus:

Блок-схема процедури Input:

Блок-схема програми Lab5:

Program LAB_5;

uses crt;

const x1='010010110011101011100000000000000000000000000000000000000000000';

x2='110000110000000000000000000000000000000000000000000000000000000';

var a,b:string;

f:boolean;

procedure SUM(b:string; var c:string;n:integer);

var j,r:integer;

begin

r:=0;

for j:=n downto 1 do

begin

if ord(b[j])+ord(c[j])-96+r>1 then

begin

if ord(b[j])+ord(c[j])-96+r>2 then c[j]:='1'

else c[j]:='0';

r:=1;

end

else

begin

if ord(b[j])+ord(c[j])-96+r=1 then c[j]:='1'

else c[j]:='0';

r:=0;

end;

end;

end;

Function DOD(b:string):string;

var i:integer;

a:string;

Begin

a:=b;

i:=length(a);

while a[i]<>'1' do dec(i);

for i:=i-1 downto 2 do if a[i]='0' then a[i]:='1'

else a[i]:='0';

DOD:=a;

end;

Function ERROR(a:string):boolean;

var i:integer;

begin

ERROR:=FALSE;

for i:=1 to length(a) do if (a[i]<>'1')and(a[i]<>'0') then ERROR:=TRUE;

end;

Function Plus(a,b:string):string;

var a1,b1,c:string;

begin

(*A*) a1:=copy(a,2,8);

insert('000',a1,1);

sum('01110000000',a1,11);

delete(a,2,8);

insert('0000000000000000000000000000',a,25);

insert('01',a,2);

(*B*) b1:=copy(b,2,11);

delete(b,2,11);

insert('01',b,2);

if a1<b1 then

begin

c:=a1;

a1:=b1;

b1:=c;

c:=a;

a:=b;

b:=c;

end;

while a1<>b1 do

begin

Sum('00000000001',b1,11);

insert('0',b,2);

delete(b,55,1);

end;

if a[1]='1' then a:=DOD(a);

if b[1]='1' then b:=DOD(b);

sum(b,a,55);

if a[1]='1' then DOD(a);

(* Normalizazzia *) if a[2]='1' then

begin

delete(a,2,1);

delete(a,53,1);

sum('00000000001',a1,11);

end

else

begin

while (a[3]<>'1')and(a1>'00000000000') do

begin

delete(a,2,1);

insert('0',a,55);

sum('11111111111',a1,11);

end;

delete(a,2,2);

end;

insert(a1,a,2);

Plus:=a;

end;

Procedure Input(var a,b:string;var f:boolean);

var k:char;

begin

writeln('1| Vvodutu v rychny');

writeln('2| Vvodutu yak konstanty');

k:=readkey;

f:=True;

case k of

'1' : begin

Write('A --> '); readln(a);

if (Error(a))or(length(a)<>32) then

begin

writeln('Ne pravulno!');

f:=False;

end

else

begin

Write('B --> '); Readln(b);

if (Error(b))or(length(b)<>64) then

begin

writeln('Ne pravulno!');

f:=False;

end;

end;

end

else begin

a:=x1;

b:=x2;

end;

end;

end;

begin

clrscr;

Input(a,b,f);

if f then writeln(plus(a,b));

readkey;

end.

Ця програма призначена для додавання в двійковій системі в форматі DOUBLE з плаваючою крапкою. Ввівши свої дані до програми я отримав такі результати:

Висновок. Виконуючи лабораторну я ознайомився з програмним моделюванням машинних алгоритмів додавання та віднімання чисел з плаваючою крапкою. Також я проаналізував програму, до якої ввів свої дані в форматі DOUBLE.

Соседние файлы в папке печать кн лабы