1 Reprezentacija brojeva u računalu Cijeli i realni brojevi implementiraju se u računalu u unaprijed zadanom formatu koji propisuje koliko se binarnih znamenaka (bitova) koristi za prikaz broja i kako se one interpretiraju. Stoga se u računalu može prikazati samo konačan podskup skupa cijelih odnosno realnih brojeva. Ako je za prikaz cijelog broja rezervirano n bitova, onda je na taj način moguće prikazati ili sve pozitivne brojeve od 0 do 2 n 1 ili pozitivne i negativne brojeve npr. od 2 n 1 do 2 n 1 1. Brojevi izvan tih intervala nisu prikazivi u računalu. Računske operacije neće biti točno izvršene ukoliko rezultat izlazi iz intervala prikazivih brojeva. Više detalja o standardnoj implementaciji cijelih brojeva dano je u Dodataku??. Prikaz realnih brojeva u računalu predstavlja složeniji problem. Najjednostavnija ideja sastoji se u tome da se odredi broj binarnih znamenaka za prikaz cjelobrojnog dijela broja (npr. n), te broj binarnih znamenaka za prikaz razlomljenog dijela broja (npr. k). Svaki prikazivi broj u pozicijskom binarnom prikazu tada ima oblik ±d 1 d 2 d n, b 1 b 2 b k, gdje su d i i b i binarne znamenke a, je binarni zarez 1 koji odijeljuje cijeli i razlomljeni dio broja. Brojeve ovog oblika nazivamo brojevima s fiksnim zarezom budući da je broj binarnih znamenaka prije i poslije binarnog zareza fiksiran. Ti su brojevi ravnomjerno rasporedeni po intervalu koji pokrivaju. Ukoliko umjesto binarnog promatramo nama bliži decimalni sustav, onda je primjer broja s fiksnim (decimalnim) zarezom uz n = k = 3 npr. broj 405,234. Alternativni prikaz istog broja je 4, 05234 10 2 što vodi do ideje da se umjesto znamenaka prije i poslije decimalnog zareza pamti skalirana vrijednost broja (4,05234) sa zadanim brojem decimala i eksponent (2), takoder sa zadanim bro- 1 Po pravopisu treba pisati decimalni (binarni) zarez umjesto decimalne (binarne) točke, no mi ćemo u daljnjem tekstu koristiti decimalnu (binarnu) točku iz razumljivih razloga. 1
2 Reprezentacija brojeva u računalu jem decimala. Brojevi tog oblika nose ime brojevi s pokretnim zarezom (jer položaj decimalnog zareza ovisi o eksponentu) i u modernim računalima koriste se gotovo isključivo za prikaz realnih brojeva. 1.1 Brojevi s pokretnim zarezom Brojevi s pokretnim zarezom (engl. floating-point numbers, nadalje fp-brojevi) su realni brojevi koji se mogu prikazati u obliku gdje je: ( 1) s x β e (1.1) β baza brojevnog sustava (β N, β > 1). Baza je redovito paran broj; x mantisa fp-broja. To je realan broj u granicama 0 x < β, koji zapisan u bazi β ima najviše p znamenki; e eksponent fp-broja. To je cijeli broj koji se kreće u granicama e min e e max za neke zadane e min i e max ; s {0, 1} odreduje predznak broja. Skup svih brojeva s pokretnim zarezom je konačan podskup skupa realnih brojeva odreden s četiri parametra: β, p, e min i e max. U računalima se gotovo isključivo koristi baza β = 2 premda je korištena i baza β = 16. Za kalkulatore je pogodnija baza β = 10 jer se time izbjegava konverzija broja iz binarnog u decimalni zapis. Što je veći broj znamenaka p to je veća preciznost sustava fp-brojeva pa stoga broj p nazivamo i preciznost brojevnog sustava. Brojeve s pokretnim zarezom je pogodnije zapisivati u obliku sa znamenkama. Svaki fp-broj x ima oblik x = ±d 1.d 2 d 3 d p β e gdje su d 1,..., d p znamenke u bazi β, dakle cijeli brojevi u granicama 0 d i < β, (i = 1, 2,...,p). Značenje tog izraza je sljedeće: x = ±(d 1 + d 2 β 1 + d 3 β 2 + + d p β p+1 ) β e. (1.2) Primjer 1.1 a) Neka je β = 10, p = 3. Broj 0.1 možemo prikazati kao 1.00 10 1 ili 0.10 10 0 ili 0.01 10 1. Tu vidimo da prikaz fp-broja nije jedinstven. b) Ako je β = 2, p = 24 tada se decimalno 0.1 može samo aproksimirati fp-brojem 1.10011001100110011001101 2 4. U binarnom zapisu taj broj ima beskonačno mnogo decimala. Radna verzija
1.1 Brojevi s pokretnim zarezom 3 Općenito postoje dva razloga zbog kojih se realan broj ne može prikazati kao broj s pokretnim zarezom: potrebno je više od p znamenaka u mantisi za prikaz broja. U slučaju broja 0.1 i baze β = 2 potrebno je beskonačno mnogo znamenaka; broj se nalazi izvan područja koje prekrivaju fp-brojevi, tj. on je prevelik ili premalen da bi bio zapisan kao fp-broj. U Primjeru 1.1 vidjeli smo da prikaz broja s pokretnim zarezom nije jedinstven. Da bi se izbjegla ta mnogostrukost prikaza uvodi se pojam normaliziranog broja s pokretnim zarezom: broj s pokretnim zarezom je normaliziran ukoliko je vodeća znamenka u mantisi različita od nule. To znači da u zapisu (1.2) mora vrijediti d 1 0. Tako je npr. broj 1.00 10 1 normaliziran dok broj 0.01 10 +1 nije. U skupu normaliziranih fp-brojeva prikaz broja u obliku (1.2) je jedinstven ali više nije moguće prikazati nulu. Ta se poteškoća rješava uvodenjem posebne konvencije za prikaz nule. Primjer 1.2 Zadan je fp-sustav sa sljedećim parametrima: β = 2, p = 3, e min = 1, e max = 3. Pozitivni normalizirani fp-brojevi su sljedeći: 0, 0.5, 0,625, 0.750, 0.875,1.0, 1.25, 1.50, 1.75, 2.0, 2.5, 3.0, 3.5, 4.0, 5.0, 6.0, 7.0, 8.0, 10.0, 12.0, 14.0 1.00 2 1 0.5 0 1 2 3 4 5 6 7 8 10 12 14 1.00 2 0 1.11 2 3 Iz ovog primjera vidimo da fp-brojevi nisu jednoliko rasporedeni po intervalu koji pokrivaju. Kod brojeva manjih po modulu razmak izmedu susjednih fp-brojeva je manji, dok je kod brojeva većih po modulu taj razmak veći. To je poželjno svojstvo budući da kod velikih brojeva obično trebamo manju apsolutnu preciznost i obratno. Lako se pokazuje da se normalizirani fp-brojevi ˆx kreću u rasponu β e min ˆx (1 β p )β emax+1. (1.3) Dio brojevnog pravca od β e min do β e min nije prekriven normaliziranim fp-brojevima. Da bi se to izbjeglo uvode se tzv. denormalizirani fp-brojevi koji su oblika ±0.d 2 d 3...d p β e min i koji ravnomjerno prekrivaju interval ( β e min,β e min ). Najmanji denormalizirani fp-broj je β e min p+1. M. Jurak 5. listopada 2004.
4 Reprezentacija brojeva u računalu Primjer 1.3 Ispitivanje baze brojevnog sustava računala, odnosno odredivanje brojeva koji se mogu u računalu egzaktno prikazati. Zadana je funkcija f(x) = (n + 1)x 1, gdje je n N zadani parametar. Njena fiksna točka je 1 n. Generirajmo niz brojeva sljedećim postupkom: { x0 = 1 n x k+1 = f(x k ) k = 0,1,2,... Ukoliko je 1 n broj koji se može egzaktno reprezentirati u računalu, onda gornji postupak generira stacionaran niz. U suprotnom je x 0 = 1 n + ε 0 za neki ε 0 0. Stoga će jednostavne iteracije dati x k+1 = f(x k + ε k ) = (n + 1)(x k + ε k ) 1 = f(x k ) + (n + 1)ε k. tj. ε k+1 = (n+1)ε k = (n+1) k+1 ε 0. Dakle za sve takve brojeve greška će vrlo brzo rasti što nam omogućava da odredimo brojeve koji pripadaju skupu normaliziranih fp-brojeva. Indirektno, na taj način možemo prepoznati bazu računala. 1.2 Greška aproksimacije. Strojni epsilon Apsolutna greška aproksimacije realnog broja x fp-brojem ˆx jednaka je x ˆx dok je relativna greška jednaka x ˆx x (relativna greška nije definirana za x = 0). Relativna greška je invarijantna obzirom na skaliranje x αx i ˆx αˆx i stoga je pogodnija za analizu algoritama u kojima vrijednosti x mogu jako varirati. U radu s normaliziranim fp-brojevima grešku aproksimacije je prirodno mjeriti u jedinicama na posljednjem mjestu. Ako je npr. zadana baza β = 10 i preciznost p = 3 i ako je rezultat računanja u tom fp-sustavu jednak ˆx = 3.14 10 2, dok je točan rezultat x = 0.0312 = 3.12 10 2, onda ćemo reći da je učinjena greška od dvije jedinice na posljednjem mjestu. Slično, ako je realan broj x = 0.0314159 = 3.14159 10 2 aproksimiran fp-brojem ˆx = 3.14 10 2, onda je greška jednaka 0.159 jedinica na posljednjem mjestu. Ovako definiranu jedinicu greške označavat ćemo s ulp što je skraćenica od engl. units in the last place. Ukoliko je rezultat računanja fp-broj najbliži točnom rezultatu, onda znamo da je greška aproksimacije najviše 1 ulpa. Da bismo se u to uvjerili uzmimo 2 realan broj x koji se nalazi u području prekriveno normaliziranim fp-brojevima. Tada postoji eksponent e, e min e e max, takav da je x [β e,β e+1 ). Svi normalizirani fp-brojevi u tom intervalu imaju oblik d 1.d 2 d p β e (d 1 0) i stoga je razmak izmedu dva susjedna broja jednak 0.0 01 β e (jedan na p-tom mjestu); u našoj terminologiji razmak je jednak jednoj jedinici na posljednjem mjestu. Budući a se broj x nalazi izmedu dva susjedna fp-broja u intervalu [β e,β e+1 ), ili izmedu posljednjeg od njih i broja β e+1, zaključujemo da je njegova Radna verzija
1.2 Greška aproksimacije. Strojni epsilon 5 udaljenost do najbližeg normaliziranog fp-broja manja ili jednaka 1 0.0 01 βe 2 (jedan na p-tom mjestu), a to je 1 jedinice na posljednjem mjestu. 2 Precizno imamo sljedeću definiciju: Neka je ˆx = d 1.d 2 d 3...d p β e (d 1 0) normaliziran fp-broj koji aproksimira realan broj x. Tada kažemo da je greška aproksimacije jednaka d 1.d 2 d 3...d p x β e βp 1 jedinica na posljednjem mjestu (odnosno ulpa). Primjer 1.4 Npr., u slučaju da je x = 0.0314159 = 3.14159 10 2 a ˆx = 3.14 10 2 (β = 10, p = 3) imamo 3.14 0.0314159 10 2 10 2 = 3.14 3.14159 10 2 = 0.159. Ocijenimo sada relativnu grešku koja odgovara grešci od 1 ulpa. Ukoliko je 2 x realan broj koji se nalazi u području koje prekrivaju normalizirani fp-brojevi onda smo već vidjeli da postoji eksponent e takav da je x [β e,β e+1 ). Njemu najbliži normalizirani fp-broj je oblika ˆx = d 1.d 2 d 3...d p β e, pa za apsolutnu grešku imamo ocjenu x ˆx 1 2 0.00...1 }{{} β e = 1 2 β p+1 β e = 1 2 βe p+1, p puta u kojoj vrijedi jednakost ako je greška točno 1 ulpa. Budući da je x 2 [βe,β e+1 ), relativnu grešku od točno 1 ulpa možemo ocijeniti na sljedeći način: 2 odnosno 1 2 βe p+1 β e+1 1 2 β p x ˆx x x ˆx x 1 2 βe p+1 d 1 β e, 1 2d 1 β p+1. Dakle, relativna greška koja odgovara grešci od 1 ulpa može varirati za faktor 2 β ovisno o položaju broja x u intervalu [β e,β e+1 ). S tim u vezi uvodimo ovu definiciju: Strojni epsilon je broj 2 Uočimo da je u binarnom sustavu (β = 2) ɛ = 1 2 β p+1. (1.4) ɛ = 2 p. Prema gornjem izvodu imamo zaključak da je relativna greška koja odgovara jednoj polovici jedinice na zadnjem mjestu manja ili jednaka strojnom epsilonu. Stoga, ako je realan broj aproksimiran najbližim fp-brojem, relativna greška aproksimacije je manja ili jednaka ɛ. 2 Neki autori definiraju strojni epsilon kao β p+1 (dva puta naš strojni epsilon). On tada ima interpretaciju udaljenosti izmedu 1 i prvog većeg fp-broja. M. Jurak 5. listopada 2004.
6 Reprezentacija brojeva u računalu 1.3 Preciznost aritmetičkih operacija Računske operacije zbrajanja (+), oduzimanja (-), množenja ( ) i dijeljenja (/) u nekom sustavu brojeva s pokretnim zarezom moraju dati rezultat u tom istom sustavu brojeva. Stoga se te operacije razlikuju od uobičajenih operacija i da bismo naglasili tu razliku označavamo ih s,, i. Za računsku operaciju nad fp-brojevima kažemo da je ispravno zaokružena ako je njen rezultat jednak onom kojeg bismo dobili da smo operaciju izvršili u beskonačnoj točnosti i zatim rezultat zaokružili na najbliži fp-broj. Sustav brojeva s pokretnim zarezom u kojem su sve aritmetičke operacije ispravno zaokružene olakšava analizu grešaka. Tada naime znamo da je, npr. za zbrajanje, x y (x + y) ɛ, x + y pa stoga možemo pisati (δ je relativna greška) x y = (x + y)(1 + δ) gdje je δ ɛ. (1.5) Analogni izrazi vrijede i za ostale aritmetičke operacije i oni nam omogućavaju ocjenu relativne greške i u složenijim aritmetičkim izrazima. Pri tome uvijek pretpostavljamo da ostajemo u području normaliziranih fp-brojeva. 1.3.1 O realizaciji ispravno zaokruženih operacija Aritmetičke operacije u fp-sustavu vrše se s konačnim brojem znamenaka. Kod operacija zbrajanja i oduzimanja dvaju normaliziranih brojeva s različitim eksponentima potrebno je prvo poravnati eksponente operanada, a zatim izvršiti operaciju nad mantisama, koristeći konačan broj znamenaka. Pri tome se manjem broju eksponent poveća, a decimalni (binarni) zarez se time pomakne ulijevo. Budući da se pamti konačan broj znamenaka dešava se da se pri pomaku decimalnog zareza dio znamenaka izgubi. To je važan izvor grešaka pri zbrajanju i oduzimanju. Ilustrirajmo to na jednom primjeru. Primjer 1.5 Neka je β = 10, p = 3 te x = 1.32 10 4 i y = 9.15 10 1. Točan zbroj je x+y = 1.32915 10 4 koji ispravno zaokružen daje 1.33 10 4 dok operacija zbrajanja pri kome radimo s 3 znamenke daje rezultat 1.32000 10 4 + 0.00915 10 4 1.32000 10 4 pri čemu su sve znamenke drugog pribrojnika izgubljene. Relativna greška u rezultatu je približno 1.38ɛ. Da smo zbrajanje vršili s 4 znamenke rezultat bi bio ispravno zaokružen. Iz ovog primjera vidimo da operacije izvedene s p znamenaka ne mogu biti ispravno zaokružene (vidi još zadatak Z.1.6). Stoga računala za aritmetičke Radna verzija
1.3 Preciznost aritmetičkih operacija 7 operacije koriste dodatne znamenke, tzv. zaštitne znamenke, kako bi postigle traženu preciznost. S jednom zaštitnom znamenkom bi npr. manji broj bio odsječen na p + 1 znamenku, a rezultat zbrajanja bio bi zaokružen na p znamenaka. Da bismo mogli analizirati greške aritmetičkih operacija moramo poći od pretpostavke o preciznosti kojom se one izvršavaju. Razuman zahtjev je da su sve aritmetičke operacije ispravno zaokružene. To znači da ako su operandi točni (tj. bez grešaka zaokruživanja), onda je relativna greška rezultata najviše ɛ (odn. 1 ulpa). Time je zadana preciznost aritmetičkih operacija. U gornjem smo 2 primjeru vidjeli da je pri operacijama zbrajanja i oduzimanja potrebno koristiti zaštitne znamenke kako bi se takva preciznost postigla. Računala u tu svrhu koriste tri bita (vidi [3]). 1.3.2 Propagiranje grešaka kroz aritmetičke operacije Kako su operandi koji ulaze u aritmetičku operaciju i sami rezultati nekih prethodnih aritmetičkih operacija oni u sebi nose odredenu grešku. Postavlja se stoga pitanje kako ovisi greška rezultata aritmetičke operacije o greškama u operandima. Pokazat ćemo da odgovor na to pitanje može biti vrlo različit, ovisno o veličini operanada. Oduzimanje bliskih brojeva Ukoliko oduzimamo dva vrlo bliska broja koji sadrže odredenu grešku u sebi može se desiti da se većina ili sve točne znamenke pokrate i u rezultatu ostanu samo znamenke kontaminirane greškom. Npr. ako u sljedećem primjeru pretpostavimo da je samo prvih pet decimala točno, onda je 0.1234567 0.1234111 0.0000456 = 4.560000 10 5 i u rezultatu su sve znamenke pogrešne. Taj efekt nazivamo dokidanje značajnih znamenaka. Primjer 1.6 Analizirajmo dokidanje značajnih znamenaka u formuli b 2 4ac uz pretpostavku da su sve operacije ispravno zaokružene. Uzmimo β = 10, p = 3; a = 1.22, b = 3.34 i c = 2.28. Egzaktno je b 2 4ac = 0.0292 = 2.92 10 2. S druge strane je b 2 = 11.1556 11.2 (zaokruženo) 4ac = 11.1264 11.1 (zaokruženo) b 2 4ac = 11.2 11.1 = 0.1 (egzaktno). Dobivena greška je 0.1 0.0292 = (1.00 0.292) 10 1 = 0.708 10 1 = 70.8 ulpa. 3 U ovom slučaju vidimo da oduzimanje nije uvelo novu grešku (jer je izvršeno egzaktno) ali je rezultat pogrešan za 70 ulpa. 3 Uočite da je kod izražavanje greške u jedinicam na zadnje mjestu porebno uzeti aproksimativnu vrijednost u normaliziranom obliku. M. Jurak 5. listopada 2004.
8 Reprezentacija brojeva u računalu Ponekad je malom promjenom formule moguće izbjeći oduzimanje bliskih brojeva i time dokidanje značajnih znamenaka. Npr. u formulama za nultočke kvadratnog polinoma r 1 = b + b 2 4ac, r 2 = b b 2 4ac 2a 2a doći će do dokidanja značajnih znamenaka bude li b 2 >> 4ac, jer u tom slučaju imamo b 2 4ac b. Ako je pri tome b > 0, onda možemo formulu za r 1, u kojoj dolazi do oduzimanja bliskih brojeva, zapisati u obliku r 1 = 2c b + b 2 4ac ; u ovoj formuli više nema problema s dokidanjem značajnih znamenki. U slučaju b < 0 transformira se na isti način formula za r 2. Ponekad nije evidentno koja je od dvije ekvivalentne formule bolja u odnosu na dokidanje značajnih znamenaka. Pogledajmo npr. izraze x 2 y 2 i (x y)(x+y). Ukoliko su sve operacije ispravno zaokružene znamo da je x y = (x y)(1 + δ 1 ), δ 1 ɛ, x y = (x + y)(1 + δ 2 ), δ 2 ɛ gdje je ɛ strojni epsilon. Tada imamo (δ 3 dolazi od množenja) (x y) (x y) = ((x y)(x + y)(1 + δ 1 )(1 + δ 2 )) (1 + δ 3 ) Stoga je relativna greška = (x y)(x + y)(1 + δ 1 )(1 + δ 2 )(1 + δ 3 ) (x y) (x y) (x 2 y 2 ) x 2 y 2 = (1 + δ 1 )(1 + δ 2 )(1 + δ 3 ) 1 S druge strane je pa imamo (δ 6 dolazi od oduzimanja) = δ 1 + δ 2 + δ 3 + δ 1 δ 2 + δ 1 δ 3 + δ 2 δ 3 3(ɛ + ɛ 2 ) = 3ɛ(1 + ɛ) x x = x 2 (1 + δ 4 ), y y = y 2 (1 + δ 5 ) (x x) (y y) = ( x 2 (1 + δ 4 ) y 2 (1 + δ 5 ) ) (1 + δ 6 ) Relativna greška je stoga = [ (x 2 y 2 )(1 + δ 4 ) + (δ 4 δ 5 )y 2] (1 + δ 6 ) (x x) (y y) (x 2 y 2 ) = δ x 2 y 2 4 + δ 6 + δ 4 δ 6 + (δ 4 δ 5 )(1 + δ 6 ) x 2 y 2. Budući da je član y 2 /(x 2 y 2 ) velik za x blisko y zaključujemo da se formula (x y)(x+y) ponaša bolje od x 2 y 2 u odnosu na dokidanje značajnih znamenaka. y 2 Radna verzija
1.3 Preciznost aritmetičkih operacija 9 Sumacija Računanje sume S = n i=1 a i vrši se u jednoj petlji u kojoj se prethodno sumiranim brojevima dodaje novi sumand (rekurzivna sumacija). Budući da kod zbrajanja brojeva jako različitih veličina dolazi do gubitka znamenki manjeg broja (zbog poravnavanja eksponenata) zaključujemo da će suma pozitivnih članova biti točnija ako sumande prvo poredamo po veličini, a zatim ih sumiramo od najmanjeg prema najvećem. Taj zaključak možemo opravdati analizom grešaka. Suma se formira dodavanjem novog sumanda prethodnoj parcijalnoj sumi. Stoga imamo: s 1 = a 1, s 2 = s 1 a 2 i općenito za i = 2, 3,...,n s i = s i 1 a i. Ako je operacija zbrajanja ispravno zaokružena vrijedi Sada indukcijom dobivamo s i = (s i 1 + a i )(1 + δ i ), δ i ε. s n =(s n 1 + a n )(1 + δ n ) = ((s n 2 + a n 1 )(1 + δ n 1 ) + a n )(1 + δ n ) =s n 2 (1 + δ n 1 )(1 + δ n ) + a n 1 (1 + δ n 1 )(1 + δ n ) + a n (1 + δ n ) = n n =a 1 (1 + δ i ) + a 2 (1 + δ i ) + + a n (1 + δ n ). i=1 i=2 Zanemarujući članove reda ε 2 dobivamo s n s a 1 (δ 1 + δ 2 + + δ n ) + a 2 (δ 2 + + δ n ) + + a n δ n. Odavde vidimo da je greška najmanja ukoliko je a 1 a 2 a n. Osnovni uzrok grešaka pri sumaciji je gubitak znamenaka koji se dešava kada se velikom broju pribraja relativno malen broj. Pri rekurzivnoj sumaciji velikog broja sumanada to je redovita situacija jer se novi član sume dodaje parcijalnoj sumi koja nakon nekog vremena postane puno veća od pojedinih sumanada. Algoritam kompenzirane sumacije koji ćemo sada opisati pokušava kompenzirati grešku koja tako nastaje. Objasnimo postupak pomoću jedne ilustracije. Ako je S parcijalna suma, a Y novi sumand koji joj se dodaje, onda imamo sljedeću situaciju u kojoj pravokutnici predstavljaju mantise brojeva: + S T Y n Y l = Y M. Jurak 5. listopada 2004.
10 Reprezentacija brojeva u računalu Kako je Y << S jedan je dio znamenaka broja Y, koji smo označili s Y l, pri poravnavanju eksponenata izgubljen i nije ušao u sumu T. Ideja algoritma je izračunati izgubljeni dio Y l i dodati ga varijabli Y prije sumacije. Budući da je T = S + Y n, a ne S + Y, oduzimanjem T i S dobivamo Y n. T S Y n Ako sada od T S oduzmemo Y dobit ćemo Y l, što ćemo označiti s C. To će biti naša korekcija. Y n Y n Y l Y l = C Tako izračunatu korekciju oduzet ćemo od narednog sumanda prije no što ga pribrojimo parcijalnoj sumi. Cijeli algoritam računanja sume S = n i=1 x i glasi: S=X(1) C=0 for i=2,3,...,n Y=X(i)-C T=S+Y C=(T-S)-Y S=T end Ovdje je bitno da programski jezik poštuje zagrade jer bi promjena poretka računanja obezvrijedila algoritam. 1.4 IEEE standard IEEE standard je danas široko prihvaćen standard koji definira sustav brojeva s pokretnim zarezom. Standard definira njihovo kodiranje, preciznost osnovnih operacija, načine zaokruživanja itd. Svrha standarda je olakšati pisanja robusnog i prenosivog (hardware-ski neovisnog) fp-koda. Radna verzija
1.4 IEEE standard 11 Postoje dva različita IEEE 4 standarda. IEEE 754 standard (v. [5]) koji opisuje binarni sustav brojeva s pokretnim zarezom (β = 2) i IEEE 854, generalniji standard koji dozvoljava binarni i decimalni brojevni sustav. Mi ćemo se zadržati na standardu IEEE 754 koji ćemo nadalje jednostavno zvati IEEE standard. IEEE standard propisuje dva formata fp-brojeva: brojevi jednostruke i dvostruke preciznosti. Pored toga standard preporučuje još dva formata fp-brojeva. To su brojevi jednostruke proširene preciznosti i dvostruke proširene preciznosti. Brojevi jednostruke preciznosti (β = 2, p = 24). Kodiraju se u četiri okteta (32 bita) 5 : u prvom bitu kodira se predznak broja, u sljedećih 8 bitova eksponent, a preostalih 23 zauzima mantisa. Preciznost brojeva je p = 24 zbog skrivenog bita (vidi niže). 0 1 8 9 31 s eksponent mantisa duljina = 32 b, eksponent = 8 b, mantisa = 23 b, ε = 2 24 5.9 10 8. Brojevi dvostruke preciznosti (β = 2, p = 53). Kodiraju se u osam okteta (64 bita): u prvom bitu kodira se predznak broja, u sljedećih 11 bitova eksponent, a preostalih 52 zauzima mantisa. Preciznost brojeva je p = 53 zbog skrivenog bita (vidi niže). 0 1 11 12 31 s eksponent mantisa 32 63 mantisa duljina = 64 b, eksponent = 11 b, mantisa = 52 b, ε = 2 53 1.1 10 16. Interpretacija IEEE formata. Predznak: Za s = 0 predznak je pozitivan, a za s = 1 negativan. Mantisa: Binarne znamenke d 1 d 2...d p 1 kodirane u mantisi predstavljaju zapis broja x = 1.d 1 d 2...d p 1 [1, 2) (u bazi 2). Vodeća jedinica se ne pamti čime je uštedena jedna binarna znamenka koju nazivamo skriveni bit. Primjer 1.7 U jednostrukoj preciznosti sljedeća 23 bita 011 0100 0000 0000 0000 0000 predstavljaju broj x = 1 + 2 2 + 2 3 + 2 5 = 1.40625 (1 dolazi od skrivenog bita). 4 IEEE je kratica za Institite of Electrical and Electronics Engineers. 5 Jedan bit predstavlja jednu binarnu zamenku; skraćeno ćemo ga označavati sa b. Kolekciju od osam bita nazivat ćemo oktet (engl. byte). M. Jurak 5. listopada 2004.
12 Reprezentacija brojeva u računalu Eksponent: U k bitova može se kodirati 2 k pozitivnih cijelih brojeva e = 0, 1,...,2 k 1. Za prikaz negativnih brojeve uvodi se tzv. pomak (engl. bias), koji iznosi 2 k 1 1. Binarni broj e kodiran u polju za eksponent interpretira se kao broj e = e (2 k 1 1). Pomaknuti eksponent e kreće se u rasponu e = 2 k 1 + 1,..., 1, 0, 1,...,2 k 1. U jednostrukoj preciznosti pomak iznosi 2 7 1 = 127, a u dvostrukoj preciznosti 2 10 1 = 1023. Krajnje vrijednosti eksponenta ne koriste se za prikaz normaliziranih brojeva. Najmanji eksponent (e = 0 odnosno e = 2 k 1 +1) koristi se za prikaz denormaliziranih brojeva i nule dok se najveća vrijednost eksponenta (e = 2 k 1 odnosno e = 2 k 1 ) koristi za prikaz beskonačnih vrijednosti i vrijednosti koje ne predstavljaju brojeve. Stoga su normalizirani brojevi oni koji u polju za eksponent nemaju niti same jedinice niti same nule. Minimalne i maksimalne vrijednosti (pomaknutog) eksponenta su stoga sljedeće: Jednostruka preciznost: e min = 126, e max = 127; Dvostruka preciznost: e min = 1022, e max = 1023. Primjer 1.8 U jednostrukoj preciznosti imamo sljedeće zapis u polju za eksponent: 01011001. Time je kodiran broj 2 6 + 2 4 + 2 3 + 1 = 64 + 16 + 8 + 1 = 89. Taj se broj interpretira kao eksponent 89 127 = 38. Prikaz nule. Nula se prema IEEE standardu prikazuje samim nulama u eksponentu i mantisi. Time se dobiva pozitivna i negativna nula što može biti korisno u računima s višeznačnim funkcijama. Standard zahtijeva da u svim logičkim izrazima bude 0 = +0, tj. da izrazi oblika if(x= 0).. ne ovise o predznaku nule. Nadalje, nula s predznakom u aritmetičkim operacijama mora se ponašati isto kao i svaki drugi broj s predznakom; npr. +0/ 5 = 0 itd. (vidi zadatak 14). Beskonačne vrijednosti. U IEEE formatu fp-broj koji se sastoji od samih jedinica u eksponentu (e = 2 k 1 ) i samih nula u mantisi predstavlja beskonačnu vrijednost. Ovisno o predznaku imamo + i. Mi ćemo te vrijednosti označavati s +Inf i -Inf. Primjer 1.9 U jednostrukoj preciznost +Inf ima sljedeći binarni zapis: 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ili = (7F800000) 16 heksadecimalno. Osnovna uloga +Inf i -Inf je da signaliziraju pretek (engl. overflow). Pretek se dešava kada je rezultat aritmetričke operacije suviše velik da bi mogao biti Radna verzija
1.4 IEEE standard 13 prikazan kao fp-broj. Standard propisuje da u takvim situacijama rezultat mora biti +Inf ili -Inf, ovisno o predznaku. Nadalje, dijeljenje s nulom generira ±Inf, poštujući uobičajena pravila o predznacima (vidi zadatak 16): +1/ + 0 =+Inf, +1/ 0 = Inf, itd. Dijeljenje s ±Inf daje ±0 tako da će za x = ±Inf vrijediti 1/(1/x) = x i neće doći do gubitka predznaka varijable. Nedefinirane vrijednosti. Računske operacije koje nisu dobro definirane kao što su to 0/0, Inf/Inf, 1 itd., prema IEEE standardu generiraju posebne vrijednosti koje se skraćeno nazivaju NaN-ovi (od engl. Not a Number). Takve se vrijednosti kodiraju na ovaj način: u eksponentu imaju same jedinice, a mantisa im je različita od nule. Pravila za rad s NaNovima su sljedeća: svaka aritmetička operacija kojoj je jedan od operanada NaN daje kao rezultat NaN. Ukoliko se NaN nade u logičkom izrazu rezultat će biti laž. Tako će test if(x=x) dati neistinu za x=nan. To je ujedno najjednostavniji test kojim se NaN može identificirati. Denormalizirani brojevi. Do sada su ostale neiskorištene one vrijednosti fp-brojeva za koje je polje eksponenta ispunjeno nulama (e = 2 k 1 + 1) a mantisa je različita od nule. Brojevi s takvim rasporedom bitova nazivaju se denormalizirani brojevi i interpretiraju se drukčije od normaliziranih brojeva. Naime, normalizirani brojevi imaju skriveni bit koji se dodaje mantisi pa se oni interpretiraju kao ( 1) s 1.d 1 d 2...d p 1 2 e, gdje je s = 0, 1 bit predznaka, d 1,...,d p 1 su bitovi mantise a e [e min,e max ] je pomaknuti eksponent. Nasuprot tome denormalizirani brojevi interpretiraju se kao ( 1) s 0.d 1 d 2...d p 1 2 e min, te se oni stoga kontinuirano nastavljaju na normalizirane brojeve i ispunjavaju prostor izmadu 2 e min i 2 e min. Denormalizirani brojevi generiraju se kao rezultat aritmetičkih operacija ako je stvarni rezultat manji od najmanjeg normaliziranog broja. Takva se situacija naziva engl. underflow. Ulaskom u područje denormaliziranih brojeva brzina izvršavanja programa će na većini modernih računala biti usporena jer se oni uglavnom emuliraju programski. Značaj denormaliziranih brojeva je u tome što oni osiguravaju x y 0 ukoliko je x y (zadatak 21). Granice fp-brojeva. Najmanji normalizirani fp-broj je 1.0 2 e min dok je najveći normalizirani broj (1 2 p )2 emax+1. U jednostrukoj preciznosti imamo 1.17549 10 38 2 126 x (1 2 24 ) 2 128 3.40282 10 38, dok u dvostrukoj 2.225 10 308 2 1022 x (1 2 53 ) 2 1024 1.798 10 308. Preciznost fp-brojeva. Ukoliko imamo pred sobom decimalni zapis jednog binarnog fp-broja postavlja se pitanje koliko je decimala u tom broju značajno. M. Jurak 5. listopada 2004.
14 Reprezentacija brojeva u računalu Značajne su pri tome one decimale koje se pri konverziji tog broja u binarni zapis i ponovo iz binarnog u decimalni zapis ne bi promijenile. Sve ostale decimale (a to će biti posljednje) ne nose bitnu informaciju o binarnom fp-broju. Da bismo odredili broj značajnih decimala trebamo vidjeti za koji će broj decimala transformacija decimalni zapis binarni zapis decimalni zapis biti identiteta. Odgovor se lako dobiva ako na realnom pravcu skiciramo sve decimalne brojeve sa zadanim brojem decimala te sve binarne fp-brojeve. Vidi se da će transformacija biti identiteta ako je u cijelom području binarnih fpbrojeva razmak izmedu dva susjedna binarna broja manji od razmaka izmedu dva susjedna decimalna broja. Na primjer, na sljedećoj slici su točkom označeni decimalni brojevi, a crticom binarni. Očito 6 da ako aproksimiramo decimalni broj najbližim binarnim brojem i zatim njega ponovo najbližim decimalnim brojem dobivamo polazni decimalni broj. Suprotna situacija je prikazana na sljedećoj slici: Ukoliko uzmemo jedan decimalni broj (kružić) koji nije neposredan susjed binarnog broja, njegovom konverzijom u binarni i ponovom konverzijom u decimalni zapis nećemo dobiti isti broj. Jedan je dio decimala pri prijelazu u binarni format promijenjen. Problem nalaženja optimalnog broja decimala nije sasvim jednostavan. Stoga ćemo problemu pristupiti na pojednostavljen način kako bismo došli do približnog rješenja. Uzmimo da binarni fp-brojevi imaju preciznost p te da decimalni fpbrojevi imaju preciznost k. U p binarnih znamenki možemo kodirati 2 p brojeva, što znači da u svakom intervalu oblika [2 m, 2 m+1 ) ima 2 p 1 različitih binarnih brojeva. Pove analogno, u k decimalnih znamenki možemo kodirati 10 k brojeva odnosno u svakom intervalu oblika [10 n, 10 n+1 ) ima 9 10 k 1 različitih decimalnih brojeva. Nadalje, unutar svakog intervala [10 n, 10 n+1 ) nalaze se barem dva intervala oblika [2 m, 2 m+1 ) pa ćemo stoga pretpostaviti da u njima ima više brojeva negu u čitavom [10 n, 10 n+1 ). Time dolazimo do nejednakosti 2 2 p 1 9 10 k 1, ili jednostavnije 2 p 10 k. 6 Ovdje zanemarujemo situaciju u kojoj se decimalni broj nalazi točno na sredini izmedu dva susjedna binarna broja. Radna verzija
1.5 FP-sustav i programski jezik C 15 Iz te ocjene dobivamo k p log 2. Za p = 24 dobivamo p log 2 7.2, dok za p = 53 dobivamo p log 2 16. Stoga zaključujemo da je u jednostrukoj preciznosti značajno 7 decimala, dok je u dvostrukoj značajno 16 decimala. Može se postaviti pitanje kada je transformacija binarni zapis decimalni zapis binarni zapis identiteta. To je bitno kada želimo binarne fp-brojeve pohraniti u ASCII datoteki bez gubljenja točnosti. Pokazuje se da je jednostrukoj preciznosti za to potrebno najmanje 9 decimalnih znamenki a u dvostrukoj 17. Načini zaokruživanja. Kada se realan broj ne može prikazati kao fp-broj u danoj točnosti aproksimira se najbližim fp-brojem. Taj se postupak naziva zaokruživanje. IEEE standard propisuje da se u slučaju jednake udaljenosti od dva fp-broja zaokruživanje vrši prema fp-broju koji ima nulu na najmanje značajnom mjestu. Drugim riječima, zaokružuje se prema parnom broju. Ilustrirajmo to u slučaju β = 10, p = 3. Broj 12.46 bio bi zaokružen na 12.5, a broj 12.41 na 12.4. U slučaju broja 12.45 koji je jednako udaljen od 12.4 i 12.5, zaokruživanje se vrši na 12.4 jer taj broj ima parnu decimalu (u slučaju β = 2 to bi značilo nulu) na najmanje značajnom mjestu. S druge strane 12.55 bi bio zaokružen na 12.6. Takvim se pravilom postiže pravilnija razdioba grešaka zaokruživanja. 1.5 FP-sustav i programski jezik C Konstante vezane uz fp-sustav mogu se naći u datoteci zaglavlje <float.h>. 1.6 Napomene Izlaganje u ovom poglavlju uglavnom slijedi članak [3]. Elementarniji pristup IEEE standardu može se naći u [9]. Više detalja o analizi grešaka zaokruživanja može se naći u [4]. 1.7 Zadaci Z1.1. Pokažite da se svaki fp-broj može prikazati u obliku ±m β e p+1 gdje je 0 m < β p cijeli broj. Z1.2. Pokažite da se fp-brojevi mogu kodirati u log 2 (e max e min +1) + log 2 (β p ) + 1 bitova. Z1.3. Napraviti 30 iteracija algoritma opisanog u Primjeru 1.3 za brojeve n = 1, 2, 3,... 16 te ispisati vrijednosti tridesete iteracije. M. Jurak 5. listopada 2004.
16 Reprezentacija brojeva u računalu Z1.4. Pokažite da je u fp-sustavu s bazom β i točnošću p razmak izmedu broja 1.0 i prvog većeg fp-broja jednak β p+1 = 2ɛ. Z1.5. Imamo fp-sustav s bazom β = 10 i preciznošću p = 3. Zadan je realan broj x = 12.35 koji aproksimiramo s ˆx = 1.24 10 1 ; greška aproksimacije je 0.5 ulpa. Pokažite da je relativna greška jednaka 0.8ɛ. Pokažite zatim da se 8 ˆx i 8x razlikuju za 4 ulpa dok je relativna greška 0.8ɛ. Z1.6. Zadana su sljedeća dva broja: x = 1.00...0 }{{}, y = 0.ρρ...ρ, }{{} ρ = β 1 p 1 p Točan rezultat oduzimanja je x y = β p dok je rezultat oduzimanja s p znamenki jednak x y = β p+1. Relativna greška je β 1. Sve znamenke u rezultatu su pogrešne. Ukoliko se koristi jedna zaštitna znamenka dobiva se točan rezultat. Z1.7. Na sljedećem primjeru oduzimanja x y uvjerite se da jedna zaštitna znamenka nije dovoljna da bi operacije bile ispravno zaokružene: β = 10, p = 3, x = 110, y = 8.59. Z1.8. (Sumiranje alternirajućih redova) U formuli e 5 = 1 + 5 1! + ( 5)2 2! + ( 5)3 3! + ( 5)4 4! + doći će do oduzimanja bliskih brojeva u višim članovima razvoja. Pokažite eksperimentalno da je bolje koristiti formulu e 5 = 1 e 5, e5 = 1 + 5 1! + 52 2! + 53 3! + 54 4! + Z1.9. U formuli f(x) = 1 cos x x 2 dolazi do oduzimanja bliskih brojeva kad su vrijednosti argumenta bliske nuli. Iskoristite Taylorov razvoj da biste izbjegli dokidanje značajnih znamenaka. Koliko članova u razvoju treba uzeti da bi f(x) bilo aproksimirano s točnošću 10 10 za x 0.1? Z1.10. Neka su ˆx i ŷ fp-brojevi koji aproksimiraju x odnosno y. Pokažite da se relativna greška u izrazu ˆx/ŷ može ocijeniti na sljedeći način: ˆx/ŷ x/y x/y y xŷ x ˆx + 1 y ŷ. ŷ Ova ocjena pokazuje da će pri djeljenju s malim ŷ greška koju on sadrži biti multiplicirana s 1/ŷ. Nadite odgovarajuću ocjenu za operaciju množenja. Radna verzija
1.7 Zadaci 17 Z1.11. Napisati FORTRAN program koji ispisuje binarni zapis fp-broja. Z1.12. Napisati C program koji ispisuje binarni zapis fp-broja. Z1.13. Napišite program koji generira +0 i -0. Z1.14. Napišite program koji verificira da li su na vašem računalu zadovoljena sljedeća pravila za rad s nulom s predznakom: +0 0, +0 ± (+0) = +0, 0 ± ( 0) = 0, +0 ( 0) = 0, 0 = 0. Z1.15. Ispišite binarni zapis (heksadecimalno) +Inf i -Inf. Z1.16. Testirati sljedeća pravila za rad s ±Inf: ±Inf ± konačna vrijednost =±Inf; +Inf + -Inf = operacija nije definirana; ±Inf * konačna vrijednost = ±Inf (ovisno o predznaku drugog množitelja); ±Inf / konačna vrijednost = ±Inf (ovisno o predznaku djelitelja); ±Inf * 0 nije definirano, ±Inf / ±Inf nije definirano, +Inf =+Inf. Z1.17. Provjerite eksperimentalno da u IEEE aritmetici ne vrijedi x = y 1 x = 1 y. Z1.18. Ispitajte na vašem računalu aritmetiku s NaNovima. Z1.19. Pokazati da je strojni epsilon u binarnom sustavu jednak 2 p gdje je p preciznost. U IEEE formatu je ε 5.96 10 8 u jednostrukoj preciznosti i ε 1.11 10 16. Z1.20. Pokažite da je najmanji denormalizirani broj u IEEE formatu jednak 2 e min p+1. U jednostrukoj preciznosti to je približno 1.4 10 45 a u dvostrukoj 0.5 10 323. Z1.21. Nadite primjer dva normalizirana fp-broja x i y za koje je x y po modulu manje od najmanjeg normaliziranog broja. Pokažite da x y nikad nije po modulu manje od najmanjeg denormaliziranog broja tako da u sustavu s denormaliziranim brojevima imamo da x y povlači x y 0. Z1.22. Pokažite da u sustavu fp-brojeva nema asocijativnosti osnovnih operacija. Npr., u jednostrukoj preciznosti je (1.0 10 10 ) 10 10 = 10 10 10 10 = 0.0, 1.0 (10 10 10 10 ) = 1.0. Provjerite. M. Jurak 5. listopada 2004.
18 Reprezentacija brojeva u računalu Z1.23. (Overflow) Formula z = x 2 + y 2 će za x 2 emax/2+1 dati rezultat +Inf. Taj je rezultat potpuno pogrešan ako y nije izuzetno velik. Reorganizirajte formulu tako da se izbjegne pretek. Z1.24. (Overflow) Pokažite da je formula y = x/(x 2 + 1) osjetljiva na pretek. Pokažite da se pretek eliminira ako se formula napiše u obliku 1 x + x 1. Ovaj izraz u IEEE standardu daje dobar rezultat i za x = 0 i za x = ±Inf. Z1.25. Zadane su sljedeće sume: n j=1 1 j(j + 1) = n n + 1, n j=1 1 j(j + 2) = 3 4 2n + 3 2(n + 1)(n + 2). Izračunajte ih za velike vrijednosti n sumirajući od 1 do n te od n prema 1. Koja je suma točnija? Z1.26. Ispitajte efikasnost algoritma kompenzirane sumacije u jednostrukoj preciznosti. Z1.27. Pokazati da konverzija fp-broja jednostruke preciznosti u decimalni fp-broj preciznosti 8 i ponovo u binarni format jednostruke preciznosti nije identiteta. Uputa: promatrati broj binarnih i decimalnih brojeva u intervalu [10 3, 2 10 ). Z1.28. Pokazati da je udaljenost susjednih binarnih fp-brojeva jednostruke preciznosti veća od udaljenosti susjednih decimalnih fp-brojeva preciznosti 9 (s devet decimala). Radna verzija
Bibliografija [1] J. L. Buchanan, P. R. Turner, Numerical Methods and Analysis, McGraw-Hill, Inc.,New York, 1992. [2] M. Crouzeix, A. L. Mignot, Analyse numérique des équations différentielles, drugo izdanje, Masson, Paris, 1989. [3] D. Goldberg, What Every Computer Scientist Should Know About Floating-Point Arithmetic, ACM Computing Surveys, Vol. 23, No. 1, March 1991. [4] N. J. Higham, Accuracy and Stability of Numerical Algorithms, SIAM, Philadelphia, 1996. [5] IEEE Standard for Binary Floating-Point Arithmetic, ANSI/IEEE Standard 754-1985. Institute of Electrical and Electronics Engineers, New York, 1985. Reprinted in SIGPLAN Notices, 22(2):9-25, 1987. [6] E. Isaacson, H. B. Keller, Analysis of Numerical Methods, Wiley, 1966. [7] D. Kincaid, W. Cheney, Numerical Analysis, Mathematics of Scientific Computing, Brooks/Cole Publishing Company. Pacific Grove, California, 1991. [8] S. Kurepa, Funkcionalan analiza, Tehnička knjiga, Zagreb, 1980. [9] M. L. Overton, Numerical Computing with IEEE Floating Point Arithmetic, SIAM, Philadelphia, 2001. [10] S. Mardešić, Matematička analiza 1, Školska knjiga, Zagreb, 1980. [11] N. Sarapa, Teorija vjerojatnosti, Tehnička knjiga, Zagreb, 1980. 19