Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

Подписываем
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Предоплата всего
Подписываем
Лабораторна робота № 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), у противному випадку число називається не нормалізованим.
Основними особливостями представлення чисел з плаваючою крапкою, у сучасних ЕОМ є :
Ця особливість полегшує обробку порядку при виконанні арифметичних операцій. Величина зсуву дорівнює або вазі старшого розряду порядку, або на одиницю менше. Зміщений порядок прийнятий називати характеристикою числа.
Ці формати мають найменування :
а) короткий (одинарної точності) - 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заг-mа)
Після цього можна степінь основи системи числення у загальному степені винести за дужки і виконати лише додавання мантис:
Наприклад.
Мантиса числа В після перетворення повинна бути правильним дробом з тим, щоб при додаванні нічим не відрізнятися від звичайних (неперетворених) мантис. Тому перетворенню підлягає завжди менший доданок, оскільки у протилежному випадку відбувається переповнення розрядної сітки мантиси числа, яке перетворюється.
При цьому треба зробити "перенесення" крапки вліво на mamb позицій (зсув мантиси вправо). При цьому частина розрядів мантиси може втратитись. Тому арифметичні дії над числами з плаваючою крапкою по своїй суті є наближеними, а не точними. При додаванні чисел в нормальній формі можна виділити 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 |
m=4
n=8
і всі операції будуть виконуватися в додатковому коді.
а) А=-0,101012101
В=0,110012011
Апр=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,1110112100
б) А=-0,101012101
В=-0,110012100
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,100012110
Зауваження.
1. Слід відмітити, що додатні нормалізовані числа завжди мають 1 у розряді , а відємні числа записані в інтервальному коді (додатковому або оберненому), мають 0 в розряді . Тому у нормалізованих чисел значення цифр розрядів з вагою р0 і р-1 не співпадають ні для додатних чисел, ні для зображень від'ємних чисел. В наслідок цього неспівпадання цифр у знакових розрядах свідчить про денормалізацію вліво (переповнення), а співпадання цифр знакового і старшого розрядів мантиси про денормалізацію вправо.
2. При денормалізації результата вліво, мантиса результата (разом із знаковим розрядом) зсувається на один розряд вправо, а порядок збільшується на один розряд, оскільки сума двох мантис може бути денормалізована вліво не більше ніж на один розряд.
3. При денормалізації вправо мантиса зсувається вліво (без знакового розряду) до появи в старшому розряді 1, при с>0, або 0 при с<0, а з порядку віднімається число одиниць, яке дорівнює кількості зсувів мантиси.
4. Кількість зсувів, як правило обмежується кількістю розрядів суматора, оскільки процес зсуву може бути нескінченним, якщо с=0. (мантиса =0). В цьому випадку після (n-1) зсувів результат покладається рівним машинному 0. Обнулення відбувається і тоді коли порядок числа внаслідок зсуву мантиси вліво зменшиться до числа меншого ніж допустиме число.
5. При додаванні може відбутися справжнє переповнення розрядної сітки числа, тобто переповнення розрядної сітки порядку. В даному випадку в ЕОМ формується сигнал про переповнення порядку.
Віднімання чисел у форматі з плаваючою крапкою відбувається шляхом додавання першого доданка до другого зі знаком мінус. Тобто потрібно змінити знак другого доданку на протилежний і виконати вищеописаний алгоритм додавання.
В системах команд сучасних ЕОМ є великій набір команд на виконання операцій додавання і віднімання як з довгими, так і з короткими операндами, з нормалізацією і без нормалізації.
Хід роботи
Варіант: Перше число: 12.890, друге число: 6;
Блок-схема:
Блок-схема процедури Sum:
j:=n до 1; i:=i-1
Вхід
r:=0;
ord(b[j])+ord(c[j])-96+r>1
c[j]:='0';
c[j]:='1'
+
+
-
ord(b[j])+ord(c[j])-96+r=1
ord(b[j])+ord(c[j])-96+r>2
c[j]:='0';
c[j]:='1'
+
+
-
-
r:=0;
r:=1;
Вихід
-
Блок-схема функції Dod:
Вхід
a:=b;
i:=length(a);
a[i]<>'1'
+
dec(i);
-
-
i:=i-1 до1;i:=i-1
a[i]:='1'
a[i]:='0';
a[i]='0'
+
-
+
DOD:=a;
Вихід
Блок-схема функції ERROR:
Вхід
ERROR:=FALSE;
i:=1 до length(a); i:=i+1
(a[i]<>'1')and(a[i]<>'0')
+
ERROR:=TRUE
-
+
-
Вихід
Блок-схема функції Plus:
Вхід
a1:=copy(a,2,8);
c:=a1;
a1:=b1;
b1:=c;
c:=a;
a:=b;
b:=c;
insert('000',a1,1); sum('01110000000',a1,11); delete(a,2,8); insert('0000000000000000000000000000',a,25); insert('01',a,2);
delete(b,2,11); insert('01',b,2);
b1:=copy(b,2,11);
a1<b1
+
-
a1<>b1
Sum('00000000001',b1,11); insert('0',b,2); delete(b,55,1);
+
a[1]='1'
-
a:=DOD(a);
+
-
b[1]='1'
b:=DOD(b);
+
-
1
1
a[1]='1'
DOD(a);
+
-
sum(b,a,55);
a[2]='1'
Plus:=a;
+
-
delete(a,2,1); delete(a,53,1); sum('00000000001',a1,11);
(a[3]<>'1')and(a1>'00000000000')
delete(a,2,1); insert('0',a,55); sum('11111111111',a1,11);
delete(a,2,2);
insert(a1,a,2);
Вихід
Блок-схема процедури Input:
Вхід
1| Vvodutu v rychny
2| Vvodutu yak konstanty
k:=readkey;
f:=True;
1
1
K=1
A -->
+
a
Error(a))or(length(a)<>64
'Ne pravulno!'
f:=False;
Error(b))or(length(b)<>64
_
B -->
b
+
'Ne pravulno!'
+
f:=False;
a:=x1;
b:=x2;
Вихід
Блок-схема програми Lab5:
Вхід
Input(a,b,f);
1
1
f
plus(a,b)
+
-
Кінець
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.