Adunarea si scaderea cu rotunjire in virgula flotanta
Inainte de a prezenta procedura de adunare, preconizam reluarea
uzitand de exemplu, a problemelor de rotunjire. Reaminitim ca daca
luam in consideratie, de pilda, mantisa de m biti, significand-ul
cu semn avand (
) biti, atunci rezultatul
suma/diferenta Z va avea (
) biti, fiind de forma
unde, de la stanga la dreapta, avem zc
reprezentand potentialul bit de carry-out (COUT in fog. 5.10), zh1 si
zhD reprezinta valoarea rezultata prin operarea
bitilor si de semn ale celor doua numere significand (in
complement de doi, rezultatul sumei (diferentei) are valoarea
cuprinsa in intervalul (-4.4)), zm-1,zm-2,...z0
reprezentand cei m biti alocati mantisei si g, r si s sunt
cunoscutii biti de guard, round si sticky destinati
rotunjirii. Astfel, in fig.5.12 se prezinta diferite potentiale
ipostaze care reclama celor trei biti implicati in procesul de
rotunjire, anume g, r si s.
Se poate remarca egalitatea, constituind dezideratul primar, dintre rezultatele operatiilor efectuate mai intai exact, cu precizie infinita, si ulterior rotunjite (operations realized with infinite precision and then result rounded) si cele ale operatiilor rotunjite in mod direct (operations with rounding), efectuate pe lungimea de biti a unui operand la care se adauga cei trei biti g, r si s. Acestea din urma sunt inportante prin prisma algoritmului care va fi prezentat in continuare, dar mentionam ca in exemple nu s-a respectat ad-literam procedura, concentrandu-ne, cu precadere asupra modificarii pozitiilor bitilor g, r si s. In fig. 5.12, se mai prezinta ultima coloana, erorile ε obtinute
Fig.5.12
ca diferente dintre valorile rezultat rotunjite si cele obtinute la operare exacta, ambele calculate in zecimal, cu respectarea regulilor standardalului IEEE 754, in coloana cu operarea exacta.
Legat de bitul de gardare g, cazurile exemplu a la e pun in evidenta necesitatea acestuia intrucat primul bit al rezultatului devine 0, facand necesara deplasarea acestuia, in vederea normalizarii, cu un bit la stanga in bitul lsb al rezultatului normalizat fiind introdus g. In pozitia vechiului bit g ajunge prin deplasare la stanga, r, iar in pozitia vechiului bit r va ajunge s, iar, la aceste exemple (a la e) sunt prezentate diferite ipostaze de rotunjire efectuate toate dupa modul "toward to nearest even"(fig.5.9). Reamintim ca bitii s sunt obtinuti prin operarea OR a tuturor bitilor care, in procesul de aliniere a numerelor significand (deplasare la dreapta), ajung in afara bitilor operandului nedeplasat exceptandu-l pe g si r. In continuare, cazul exemplu f poate fi folosit pentru a raspunde la o ipotetica intrebare daca este suficient un singur bit de gardare g. Pe masura ce diferenta dintre cei doi operanzi se micsoreaza, se observa ca apar doi biti de 0 in pozitiile cele mai semnificative ale rezultatului si, intr-o prima analiza, aceasta ar reclama doi biti de gardare, aspect care nu se confirma intrucat, atunci cand operanzii devin ca diferenta atat de apropiati valoric, diferenta devine exacta (vezi cazul f, r si s sunt 0 si r devenind bitul lsb al rezultatului rezulta ε = 0, deci rotunjirea nu mai este necesara). Concluzia, pentru a evita pierderea de precizie a rezultatului fata de unul obtinut exact si apoi rotunjit, un bit de gardare g este obligatoriu, dar si suficient.
Cazul exemplu g pune in relief posibilitatea ca la adunarea a doua numere si identificand sa apara carry din rangul msb al rezultatului (cont), ceea ce, in vederea normalizarii, implica deplasarea cu o pozitie la dreapta a sumei. Dar aceasta determina o modificare, in sens invers fata de anterioarele cazuri exemplu, a bitilor r si s, r devenind bitul lsb al rezultatului, iar noul s va fi obtinut operand logic OR vechii biti r si s.
Trecand, in continuare, la descrierea pe pasi, in detaliu, a algoritmului de adunare/scadere in virgula flotanta, vom admite ca operanzi de intrare numerele X si Y rezultate conform standardului IEEE 754.
Pas 1. Ca prima operatie, se prevede,, asa cum prezentam anterior, despachetarea operanzilor, ceea ce implica, pentru fiecare operand, mai intai, separarea semnului, a exponentului si a mantisei cu inserarea, in mod explicit, a bitului hidden 1 de significand, apoi convertirea operanzilor la formatul intern (pot fi apelate formatele extinse, single-extended sau double extended) si, in fine, testarea pentru operanzi speciali de exceptii (spre exemplu, recunoasterea de intrari NaN sau cazuri de bypass-are a adder-ului in cazul unui sau ambilor operanzi egali cu 0).
Pas 2.
Urmeaza calculul diferentelor dintre exponentii si
pentru ca sa determinam cantitatea bazata pe
care sa se efectueze operatia de aliniere a numerelor significand,
si
. Pentru a econimisi circuistica, capacitatea de deplasare
la dreapta pentru aliniere, este asigurata deseori [HePa03] [Parh00] doar
pentru unul dintre doi operanzi. Astfel, admitand ca doar registrul
folosit pentru stocarea initiala a lui
poseda prezentata capacitate de preshift-are, atunci
daca
>
, aceasta implica interschimbarea (swapping)
operanzilor. In acest
mod diferenta exponentilor
si exponentul rezultatului
se seteaza la
valoarea
conform cu (5.1).
Pas 3.
Operatia din acest pas vizeaza doar cazul din semnele celor doi
operanzi, sign (X) si sign (Y), difera, situatie in care
continutul unuia dintre registrele de significand, admitem cel
prevazut cu capacitatea de deplasare la dreapta, este substituit prin
complementul sau de doi. Comentand acest aspect, aratam ca
unele solutii de implementare prevad logica de complementare in mod
selectiv (dupa unii autori [Parh00], pentru operandul care nu este
preshift-ul, acesta pentru a scurta, in termen de timp, calea critica). Daca,
spre exemplu, operandul X este negativ () si este asigurata logica de complementare doar
pentru registrul in care este stocat
, unde
, atunci este complementat de doi
si se ignora
semnul lui X, obtinandu-se rezultatul X - Y in loc de -X + Y, de care se
va tine cont la stabilirea semnului rezultatului final. La procedura in
curs de descriere, admitem ca registrul prevazut cu capacitate de
preshift-are este inzestrat si cu logica de complementare si stabilim
semnul rezultatului, atunci cand
, in final, in pasul 9. Daca semnele operanzilor
coincid, atunci semnul comun este ignorat pana in final cand este
atasat rezultatului.
Pas 4. Registrul
prevazut cu logica de complementare consta din (1 (bit de semn) + 1
(hidden bit) + m (biti alocati mantisei) + 3 (biti de
rotunjire)) ranguri. Significand-ul din acest registru este deplasat cu pozitii
binare inspre stanga, operatie in care, daca a avut loc
complementarea de doi in pasul anterior, prin partea stanga se introduce,
in mod firesc, 1-uri in loc de 0-uri. Drept rezultat al acestei operatii, in primul bit de rotunjire,
cel de gardare g, ajunge ultimul bit
deplasat in exteriorul celor (
) ranguri ale registrului propriu-zis; in al doilea bit de
rotunjire, cel de round r, ajunge
bitul care, prin deplasare, paraseste cei (
) biti ai registrului inaintea bitului devenit g, si in cel de-al treilea bit de
rotunjire, cel de sticky s, ajunge
rezultatul operatiei OR, evaluat in timpul deplasarii, intre
toti bitii care nu parasesc cei (
) ai registrului, exceptandu-i pe cei deveniti g si r.
Pas 5. Acest
pas este dedicat calculului significand-ului rezultat preliminar, , prin adunarea/scaderea continutului celor (
) biti ai registrului cu capacitate de deplasare si
logica de complementare la continutul celor (
) biti ai registrului in care este stocat celalalt
significand. Dar, in cazul in care
si, in plus, msb -ul lui
= 1 si nu se
genereaza carry - out la rezultat, atunci este necesara efectuarea
unei operatii suplimentare de complementare a lui
.
Transpunand in termenii algoritmului descris cazurile exemplu a la f din fig.
5.12, se poate constata ca, de fiecare data se genereaza cout
si msb-ul rezultatului
este 0
(acesta din urma putand rezulta 1 daca primul operand ar fi, spre
exemplu de forma 1.1...). Conditie obligatorie pentru a nu avea cout
este ca msb-ul operandului complementat sa fie 0, ori aceasta implica
sa nu avem preshift-are in pasul 4 sau, altfel exprimat,
. In plus, pentru a respecta conditiile enuntate,
se poate constata in mod facil, ca operandul scazut este in valoare
absoluta mai mare decat descazutul si
rezulta
negativ, situatie in care
trebuie substituit prin complementul sau de doi pentru
a reveni la asteptata form sign
magnitude.
In ceea ce priveste
implementarea sumatorului, este recomandabila o versiune rapida de
tipul carry-lookahead, care sa permita executia operatiei
in complement de doi intr-un interval de timp logaritmic [Parh00].
Potentiala complementare de doi a lui se obtine
uzitand de un wordgate de EXCLUSIVE OR si aplicand un 1 pe intrarea cin
a rangului lsb al sumatorului.
Pas
6. Acest pas este dedicat operatiei de prenormalizare a significand-ului
rezultat . Nu constituie normalizarea definitiva intrucat,
la operatia de rotunjire succesiva acesteia (pas 8), este posibil
sa se genereze carry-out (vezi pasul exemplu a , fig. 5.12), ceea ce revendica o normalizare
suplimentara.
In mod evident daca si daca, la operatia din pasul urmator, a
rezultat carry-out (vezi cazul exemplu g,
fig. 5.12) atunci se shift-eaza
cu o pozitie binara la dreapta, introducand bitul carry-out in msb-ul lui
.De asemenea, se impune ajustarea - prin incrementare -
valorii exponentului rezultat
in consecinta.
In cazul
neincadrarii in situatia de mai sus, se deplaseaza la stanga pana cand se obtine
forma normalizata a significand-ului. Atunci cand shift-area se face cu o
pozitie la stanga, in bitul lsb a lui
se introduce valoarea lui g
(vezi cazurile exemplu a la e fig.5.12). Daca, in vederea
normalizarii, este necesara deplasarea lui
, la stanga cu doua sau mai multe pozitii binare,
atunci "in coada" lui g vor fi
introduse zero-uri (vezi si cazul f,
fig.5.12). In fiecare din aceste situatii se impune ajustarea - prin decrementare
- valorii exponentului rezultat
in mod corespunzator.
Ne vom referi, in cele ce urmeaza, la implementarea mecanismului de deplasare in vederea normalizarii, care, subliniem, este asemanator cu cel pentru alinierea numerelor significand de care se face uz in pasul 4. Cel din urma asigura o deplasare la dreapta, in versiunea de simpla precizie, de la 0 la 31 de biti, pe cand cel dintai trebuie sa asigure fie o deplasare la dreapta de la 0 la 1 bit, fie una la stanga de la 0 la 31 de biti. O optiune de implementare hardware a shifter-ului de normalizare consta in folosirea a doua dispozitive separate, unul destinat deplasarii la dreapta, celalalt destinat deplasarii la stanga, dar exista si solutia combinarii celor doua functiuni prin apelare la un shifter combinational cu mai multe niveluri. Principal, dispozitivul de deplasare, admitem cel de la 0 la 31 de biti, poate fi si mplementat printr-un set de multiplexoare 32 la 1, de tipul celui prezentat in figura 5.13 [Parh00].
Fig.5.13
Multiplexorul care
produce bitul a significand-ului deplasat, selecteaza unul dintre
bitii
la
ai significand-ului intrare aflat in curs de aliniere cu
cantitatea de deplasare (shift amount) data prin 5 biti de diferenta
d ai exponentilor. Dar
aceasta solutie pune probleme dificile de incarcari, atat
de fan-in cat si de fan-out, cu precadere pentru bitul
de semn, care este aplicat la multe intrari a mai multor multiplexoare. O
degrevare a problemei incarcarilor o poate aduce o constructie
multinivel de multiplexoare, care insa aduce intarzieri suplimentare. In
tot cazul, compromisul performanta/cost
mai bun pentru un anumit dispozitiv de deplasare stabileste numarul
de niveluri de multiplexoare, precum si numarul de intrari a
acestora.
O alta
problema specifica procesului de deplasare consta in
determinarea numarului de biti cu care sa se efectueze
shift-area. In ceea ce priveste deplasarea in vederea alinierii numerelor
significand, probleme apar doar atunci cand diferenta exponentilor d este negativa, dar care probleme
sunt surmontate apeland la swapping-ul operanzilor acestuia. Referitor la
deplasarea la dreapta pentru normalizare, aceasta este declansata
atunci cand de starea de 1 a flag-ului de carry-out setat in pasul anterior. In mod evident, daca acest
flag nu este setat si daca hidden bit este 1, nu este necesara
nici o deplasare de normalizare. Daca insa rezultatul din pasul 4
prezinta in pozitii mai semnificative (leading) valori de 0, acestea
trebuie eliminate prin deplasare la stanga pana cand in pozitia
hidden apare un 1. Din punct de vedere tehnic, solutia consta in
apelarea la un numarator (leading zero counter) sau, mai elaborat, prin
predictia pozitiei primului bit de 1 (leading 1) al rezultatului, in
mod concurent cu desfasurarea operatiei, eliminandu-se in acest
din urma caz intarzierea pe care o introduce detectorul de leading 1 pe
cale critica a inplementarii. [ViLG06] [Erha04] [AbSi03].
Ca o ultima remarca legata de solutionarea tehnica a deplasarilor, aratam ca cele doua shifter-e, pentru alinierea numerelor significand si pentru normalizare, pot fi combinate, la o implementare economica, intr-un singur dispozitiv cu capacitatea de deplasare bidirectionala. Daca primeaza deziderate de performanta, cum ar fi aplicarea principiului de pipeline aritmetic , atunci se preconizeaza dispozitive separate, de preshiftare, respectiv de postshiftare [Parh00].
Asa cum am aratat si la
algoritmul de adunare/scadere fara rotunjire (fig. 5.10), prin
shift-are la dreapta in vederea normalizarii si corespunzatoarea
ajustare prin incrementare a exponentului rezultatului , este
posibil ca valoarea sa deplasata (biased) sa atinga valoarea
limita (255 in single - precision, respectiv 2047 in double precision),
ceea ce impune semnalarea starii exceptionale de overflow.
In acelasi context, mentionam
ca daca s-a obtinut drept rezultat o valoare normalizata, se
impune amendarea procedurii in sensul ca operatia de normalizare prin
deplasare la stanga, cu corespunzatoarea ajustare prin decrementare a
exponentului rezultatului,
trebuie realizata doar pana cand se atinge valoarea sa limita 0
(pentru exponentul biased, valoarea 1 fiind ultima tolerata), ceea ce impune
de asemenea semnalarea, de aceasta data, a starii exceptionale
de underflow [ScST05] [Kore02].
Pas 7. Operatiile din acest pas sunt dedicate ajustarii valorilor bitilor de round R si sticky S, in mod pregatitor, pentru rotunjirea din pasul urmator.
Astfel, daca
significand-ul rezultat a fost deplasat, in vederea normalizarii din pasul
anterior, cu o pozitie la dreapta, atunci, conform cu fig. 5.8.a,
(R ia valoarea bitului lsb a lui
de dinainte de deplasare) si
(g, r si s reprezentand valorile bitilor de rotunjire de
dinainte de deplasare) (vezi si cazul exemplu g, fig. 5.11).
Daca insa
significand-ul rezultat nu a necesitat sa fie deplasat in vederea
normalizarii, atunci, conform cu fig. 5.8.d,
si
unde g,r si s sunt vechile valori ale bitilor de
rotunjire.
Daca in pasul de
normalizare a fost deplasat cu o
pozitie la stanga, atunci, conform cu fig. 5.8.b, R si S isi
pastreaza vechile valori, adica
si
(vezi si cazurile exemplu a la e, fig. 5.12).
In fine, daca a fost deplasat in
pasul anterior cu doua sau mai multe pozitii la stanga, atunci,
conform cu 5.8.c,
si
(vezi si cazul
exemplu f, fig. 5.12).
Pas 8 Acest pas este
destinat rotunjirii significand-ului rezultat, care fiind trecut prin normalizare, il notam cu
Aceasta operatie se efectueaza pe baza
tabelului din fig. 5.9, uzitand de valorile R si S determinate in pasul
anterior si consta in adunarea unei unitati binare la
pozitia lsb a lui
. Daca rotunjirea cauzeaza carry - out la rangul
msb, atunci noua valoare a significand-ului trebuie deplasata la dreapta
cu o pozitie binara si, de asemenea, se ajusteaza prin
incrementare valoarea exponentului rezultatului
. Se aplica si in acest caz observatia din
pasul 6 legata de necesitatea testarii potentialei aparitii
a starii exceptionale de overflow.
Pas9. La valorile
definitve ale exponentului si significand-ului din pasul anterior se
ataseaza, in acest pas, semnul rezultatului. In mod evident,
daca operanzii X si Y au acelasi semn (), acesta este si semnul rezultatului (sign(Z)).
Daca, insa, semnele difera (
) si ne
|
|||||||||||||||||||||||||||||||||||
Fig. 5.14 |
referim la adunare, atunci semnul rezultatului
(sign(Z)) se obtine prin intermediul tabelului din fig. 5.14 [HePa03], in
functie de semnele operanzilor, dar si de faptul ca, in pasul 2,
s-a efectuat sau nu interschimbarea operanzilor (coloana swap) si ca,
in pasul 5, s-a realizat sau nu complementarea de doi a significand-ului
rezultat preliminar (coloana compl). Casutele ramase libere din tabel
semnifica lipsa de importanta (don't care) a respectivei
operatii.
Comentand valorile
din acest tabel, ne vom referi, mai intai, la cazurile cand are loc swapping-ul
de operanzi, situatii in care sign(Z) coincide cu semnul operandului al
carui significand nu va fi deplasat in cadrul operatiei de aliniere.
Pe de alta parte, cand nu se realizeaza swapping si nici
complementarea de doi, referindu-ne, spre exemplu la linia a treia din tabel,
significand-ul operandului X va fi complementat de doi in pasul 3, deci va avea
1 in pozitia bitului hidden. Cum significand-ul operandului Y are 1 in pozitia
bitului hidden si nu se realizeaza complementarea de doi in pasul 5,
inseamna ca, la adunare, se genereaza din pozitia
bitului hidden, acesta din urma ramanand pe 0, deci rezultatul este
pozitiv. Prin rationamente similare, pot fi justificate si restul
semnelor de rezultat din tabel.
Pas 10. In ultimul pas al
procedurii este prevazuta impachetarea rezultatului care implica
inlaturarea bitului hidden si combinarea semnului, exponentului
si significand-ului, precum si testarea de valori speciale sau
exceptii (cum ar fi, spre exemplu, rezultat zero, overflow sau undeflow).
Ar mai fi de remarcat faptul ca, spre deosebire de pasul 1 - de despachetare
- , la impachetare nu este prevazuta conversia dintre formatele
intern si extern. Aceasta intrucat convertirea unui significand dintr-unul
cu mai multi biti intr-unul cu mai putini biti
necesita rotunjire care este realizata cel mai bine in pasul de
rotunjire producand rezultatul la nivelul de precizie dorit [Parh00]. Ar mai fi
de remarcat ca daca, in operatiile de normalizare si
rotunjire, valoarea deplasata (biased) a exponentului , bitul hidden al significand-ului
este 1, atunci impachetarea se face, in mod normal, cu
omiterea respectivului bit de 1. Daca insa valoarea bitului din
pozitia hidden este 0, rezultatul este un numar denormalizat si,
la impachetare, campul sau de exponent trebuie setat la 0.
|
|||||||||||||||||||||||||||||||||
Fig. 5.15 |
In cele ce
urmeaza, preconizam aplicarea pasilor algoritmului prezentat,
parcurgand, in paralel, doua exemple (fig. 5.15). Ambele corespund unor
cazuri din fig. 5.12, anume c, respective g. La exemplul 1, se parcurge, de
aceasta data, ad literam procedura de adunare, iar la exemplul
2, fata de cazul g din fig. 5.12, apar schimbate semnele operanzilor.
Mentionam ca, in fig. 5.15, suplimentar fata de
notatiile introduse, mai apar unele, de altfel evidente, cum ar fi reprezentand complementul de doi al significand-ului
reprezentand valoarea
shift-ata in vederea alinierii lui
, precum si
reprezentand valoarea complementului de doi shift-at
a lui
. De asemenea,
reprezinta
lsb-ul significand-ului rezultat normalizat
, bit care intervine in conditia corespunzatoare
modului de rotunjire "toward to nearest even" acceptat pentru exemplele
considerate.
Politica de confidentialitate |
![]() |
Copyright ©
2025 - Toate drepturile rezervate. Toate documentele au caracter informativ cu scop educational. |
Personaje din literatura |
Baltagul – caracterizarea personajelor |
Caracterizare Alexandru Lapusneanul |
Caracterizarea lui Gavilescu |
Caracterizarea personajelor negative din basmul |
Tehnica si mecanica |
Cuplaje - definitii. notatii. exemple. repere istorice. |
Actionare macara |
Reprezentarea si cotarea filetelor |
Geografie |
Turismul pe terra |
Vulcanii Și mediul |
Padurile pe terra si industrializarea lemnului |
Termeni si conditii |
Contact |
Creeaza si tu |