3.3.2   Операция умножение на числа с ПЗ

Operation multiplication

 

 

      Операция умножение на две числа X,Y представени във форма с плаваща запетая се изразява по следния начин:

където q е означена основата на бройната система, в която са изобразени числата.

      Този израз може да бъде преобразуван и записан във видa:

      Очевидно е, че произведението Z ще има мантиса Mz, която ще се получи като резултат от умножението на мантисите на двата операнда, а порядъкът му pz ще се получи като сума от порядъците на двата операнда:

      От казаното следва, че алгоритъмът за изпълнение на операция умножение върху числа с плаваща запетая практически се свежда към този за операция умножение на числа с фиксирана запетая, чиято алгоритмична и структурна реализация беше подробно изложена в пункт  3.2.2.

      Следва да се отбележи, че умножението на мантисите и събирането на порядъците са абсолютно независими операции и те могат да се изпълняват паралелно във времето. Все пак достатъчно общо алгоритъмът на тази операция съдържа следните етапи:

1.  Проверка на значенията на мантисите.

      В случай, че един от съмножителите е числото нула, то за резултат се приема числото нула. Читателят не бива да забравя, че в този случай става дума за машинното представяне на числото нула, т.е. за машинната нула, имаща вида (1.1.6.2.16).

2.  Същинско умножение.

      Ако мантисите на числата са различни от нула то следва да се изпълни същинското умножение, което според (3.3.2.2) се състои от две независими операции. Мантисите се умножават като числа с ляво фиксирана запетая според един от вече разгледаните алгоритми за умножение. Предвид на това, че мантисите са числа представени в прав код те се умножават по модул, а знакът на произведението се формира отделно според (3.2.2.2). Освен това мантисите на съмножителите са нормализирани, така че произведението им

е число, което се намира в диапазон, който за двоична бройна система се формира от минималния

и максималния

модул на съмножителите, т.е. в интервала

което означава, че мантисата Mz към този момент може да има ненормализиран вид с ниво на недостиг не по-голямо от единица (r=1), т.е. предварителната стойност на мантисата на произведението може да се намира в интервала:

±0,01000 ... 00     - вид на лявата граница;

±0,1zzzz … zz      - вид на дясната граница.

      С други думи произведението на мантисите може да бъде нормализирано число или число с ниво на недостиг единица. Този недостиг обаче може да бъде отстранен, ако мантисата се измести на един бит наляво. Изместването, с цел нормализация, трябва да се компенсира с изваждане на една единица от порядъка, с всички възможни при това ситуации в полето на порядъка, т.е. там е възможно да настъпи отрицателно препълване. От казаното следва, че алгоритъмът за умножение трябва да завършва с процедурата за нормализация на резултата.

      В реалния вътрешен формат на числата с плаваща запетая обаче в мантисите се явява скритият бит. Така техниката на скрития бит променя споменатите по-горе величини както следва – минималния модул на мантисата е

а максималния

      От тук възможното произведение на мантисите се определя в следния диапазон

което означава, че стойността на мантисата Mz към този момент може да има ненормализиран вид, т.е. предварителната стойност на мантисата на произведението може да се намира в интервала:

 ±1,zzzzz       - вид на лявата граница;

±1z,zzz ... zz       - вид на дясната граница.

      И в този случай произведението на мантисите може да бъде нормализирано число или число, което следва да се нормализира чрез изместване надясно на един бит. При това младшият бит ще бъде загубен, а порядъкът (характеристиката) трябва да бъде коригиран чрез прибавяне на една единица. При това в полето на характеристиката може да настъпи положително препълване.

      Паралелно с умножението на мантисите може да се извърши събиране на порядъците (характеристиките). Тъй като порядъците са числа със знак това естествено се извършва в допълнителен код. Получената сума е само предварителна стойност на порядъка на резултата. При получаване на тази сума е възможно да настъпи препълване, което следва да се интерпретира във връзка с полученото произведение.

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

      По принцип тази процедура беше вече изложена при разглеждане на операция събиране. Разликата в алгоритъма тук се състои в това, че степента на възможната денормализация в произведението на мантисите е предварително известна и евентуалното изместване на мантисата наляво или надясно е само на един разряд. Освен това при формиране на окончателния резултат се налага да се вземат под внимание още и резултатът от корекция на порядъците и на формáта на резултата, който е възможно да наложи закръгляване на мантисата. Ще припомним, че произведението на мантисите е число с двойна дължина, което е пряко свързано с форматите на съмножителите и заявения такъв за резултата.

      Когато се налага нормализиране на мантисата Mz чрез изместване наляво на един разряд, трябва да се извърши и компенсиране на порядъка pz, чрез изваждане на единица от неговата предварителна стойност. Ако предварителната стойност на порядъка pz е равна на минимално възможната pmin за съответния формат на разрядната мрежа, то следващото компенсиране

( pmin - 1 ) ,

ще доведе до отрицателно препълване в полето на порядъка. Тогава като резултат следва да се формира числото нула (машинна нула). Ако потребителят желае да не загуби значещата част на произведението, то той може да остави за порядък числото pmin и да установи условието за денормализиран резултат, т.е. в този случай произведението ще има вида:

      Естествено, отрицателно препълване в полето на порядъка може да настъпи още при събиране на порядъците ако двата порядъка са достатъчно малки числа, т.е. тяхната сума може да бъде реално число много по-малко от pmin. В този смисъл евентуалната нормализация на мантисата на произведението само ще засили това отрицателно препълване. В случаите на отрицателно препълване в полето на порядъка режимът за работа с недостиг (r>1) може да бъде въведен от потребителя умишлено. Тогава принудителното денормализиране на мантисата Mz чрез изместването й надясно може да повиши порядъка pz до минимално възможната за него стойност pmin. Последното обаче има смисъл само в случаите, при които степента на отрицателно препълване не е висока, т.е. не повече от (m-1) порядъка, в резултат на което няма да се изхвърлят всичките (m-1) значещи цифри на произведението Mz. Подобен резултат би имал следния общ вид:

      Отрицателното препълване може да надхвърли двойно възможностите на полето на порядъка, т.е. реалната сума на двата порядъка може да достигне стойността 2.pmin. В този случай е безсмислено изпълнението на същинското умножение на мантисите и за резултат от операцията може да се приема отново числото нула. Именно тази ситуация дава основания за известна преднина (преднина в реда oт микрооперации) на събирането на порядъците пред умножението на мантисите. Това съображение ще бъде отчетено по-късно при синтеза на логическата структура на устройствота за работа с ПЗ и съответният алгоритъм за операция умножение.

      При събиране на порядъците, освен отрицателно препълване, напълно възможно е и положително препълване, при това в същата степен, т.е. реалната сума на двата порядъка може да достигне стойността 2.pmax. Положителното препълване в полето на порядъка е причина за окончателно препълване на разрядната мрежа и се сигнализира с отделен признак "препълване при плаваща запетая". В този случай същинското умножение на мантисите също е безсмислено и може да се предотврати, a за резултат може да се приеме абстракцията безкрайност.

      Интерес представлява частният случай, когато предварителната сума от порядъците pz е с положително препълване вследствие на само една излишна единица, т.е.

и когато в същото време произведението от мантисите Mz е с ниво на недостиг r=1. При тази ситуация процедурата за нормализация на мантисата (изместване наляво на 1 бит) би довела до предотвратяване на окончателното препълване, тъй като при компенсиране на порядъка ще се получи

      Така окончателното произведение става представимо число, ето защо не бива да се бърза със заключението, че поради положителното препълване в полето на порядъка, следва окончателно препълване при плаваща запетая. Препълването на полето на порядъка с повече от една единица не може да се отстрани по никакъв начин и операцията завършва с резултат +∞ или -∞.

 

Забележка.  Всичко казано до момента се изпълнява при условие, че произведението се дефинира в интервала (3.3.2.3). Съществува обаче вероятност съмножителите да имат мантиси, които са получени като резултат от предидущи операции в условията на недостиг, т.е. мантисите на операндите могат да не са нормализирани. Това означава, че е възможно произведение от мантиси, което е силно денормализирано, т.е. имащо вида:

0,000 ... 00zzz … zz  .

Тази възможност не е разгледана в регулярния случай, ето защо реалният алгоритъм се усложнява допълнително и ако читателят желае може да изследва това негово разклонение, което няма да представлява съществено затруднение, тъй като всички основни ситуации бяха вече изяснени. Освен това тук определена отговорност носят разработчиците на компилатор от съответния програмен език.

 

      Отношението на математическите закони към операция умножение на числа представени във форма с плаваща запетая е също не съвсем регулярно, което би следвало да се очаква, като се има предвид определението за операция умножение, явяваща се производна от операция събиране. Все пак са в сила следните тъждества:

FLOAT(a.b)  =  round(a.b, v)   ;                (3.3.2.7)

FLOAT(a.b)  =  FLOAT(b.a)     ;                (3.3.2.8)

FLOAT(-a.b)  = -FLOAT(a.b)    ;                (3.3.2.9)

FLOAT(1.b)   =  b      ;                               (3.3.2.10)

      Очевидно комутативният закон за операция умножение е в сила, но асоциативният закон ще се изпълнява не винаги. Що се отнася до дистрибутивния закон, в случаите когато свързва операции умножение и събиране, той също може да се нарушава, при това в значителна степен. Нека например да изчислим стойността на израза

(a.b+a.c)

и стойността на еквивалентния му вид

a.(b+c)

при стойностите:

n=8[разряда] ;    a = 20000,000  ;    b = -6,0000000  ;    c = 6,0000003  .

      Ето какво се получава от първия израз:

FLOAT [ FLOAT(a.b) + FLOAT(a.c) ]  =

=  FLOAT [-120000,00 + 120000,01]  =  0,01000000  .

и съответния резултат по втория израз:

FLOAT [ a.FLOAT(b+c) ]  =

=  FLOAT [ 20000,000 . 0,0000003 ]  =   0,00600000  ,

т.е. резултатите не съвпадат, с което показахме, че дистрибутивният закон не се изпълнява в пределите на зададената разрядност. Всичко това показва колко внимателно следва да се отнася програмистът към програмиране на изрази и съчетаване на формите и форматите на операндите.

      Илюстрацията на алгоритъма за умножение на числа представени във форма с плаваща запетая както без, така и с техниката на скрит бит е изложена по-късно тук. Казаното по-горе ще бъде допълнено с още пояснения, свързани с логическата структура на устройствата за работа с плаваща запетая. Числени примери, илюстриращи тези техники, както и самите алгоритми и възможните за тях ситуации, читателят може да намери в книга [2].

 

 

Следващият раздел е:

3.3.3   Операция деление   ( Operation division )