У вас вопросы?
У нас ответы:) SamZan.net

Лабораторна робота 5 ПРОГРАМНЕ МОДЕЛЮВАННЯ МАШИННИХ АЛГОРИТМІВ ДОДАВАННЯ ТА ВІДНІМАННЯ ЧИСЕЛ З ПЛАВАЮ

Работа добавлена на сайт samzan.net: 2016-03-05

Поможем написать учебную работу

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

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

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 14.3.2025

Лабораторна робота № 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.
  2.  У переважній більшості випадків прийняте використання нормалізованих чисел з метою підвищення їхньої точності.
  3.  При використанні основи порядку, рівній двом, нормалізоване число містить обов'язкову одиницю в старшому розряді мантиси. Це дозволяє не представляти його в явному виді у форматі, що дозволяє збільшити точність числа. Подібне приховання старшого розряду мантиси називається схованим розрядом (схованою одиницею).
  4.  В ЕОМ для представлення чисел з плаваючою крапкою, прийнято використовувати кілька форматів (як правило, щоб задовольнити суперечливим вимогам підвищення точності чисел і підвищення швидкості їхньої обробки).

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

а) короткий (одинарної точності) - 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.  нормалізованою;
  2.  денормалізованою вправо;
  3.  денормалізованою вліво (переповнення).

Треба відмітити, що додані нормалізовані числа завжди мають 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.




1. Логика
2. вариант больше выход сыра Домашнее цельное молоко 15 л магазинные натуральные животного происхождения
3. Республіканська форма правління
4. КОНТРОЛЬНАЯ РАБОТА по дисциплине- маркетинг
5. реферату- Юність СтендаляРозділ- Образотворче мистецтво Юність Стендаля Стендаль відкриває галерею вели
6. РЕФЕРАТ дисертації на здобуття наукового ступеня кандидата технічних наук Рівне ~ 2002 Д
7. 050201 ldquo;Системна інженеріяrdquo; Затверджено на засіданні кафедри автоматизації виробничих про
8. Аналіз керівництва на підприємстві
9. Источником энергии здоровья и трудоспособности человека по праву являются продукты питания
10. Мне нужно начать учить билеты по анатомии и физиологии но мне неохота