Програмирање 2/К1 2019
Prvi kolokvijum 2019. godine održan je 18. marta. Zadaci i rešenja su dostupni sa stranice predmeta.
Pitanja
Pitanje 1
Na nekom računaru, realni brojevi se predstavljaju na širini od 11 bita u formatu seeeeemmmmm, gde je s predznak broja, eeeee su 5 bitova za eksponent u kodu sa viškom 15 i mmmmm su 5 bitova normalizovane mantise sa skrivenim bitom (1≤M<2). Sva zaokruživanja se obavljaju prema pravilima ANSI/IEEE standarda za realne brojeve. Neka se u lokaciju A učita broj čija je vrednost 11.510, a u lokaciju B broj čija je vrednost najveća moguća tako da prilikom sabiranja brojeva A i B ne dođe do greške veće od 1 prilikom zaokruživanja. Kolika je vrednost zbira A i B na datom računaru?
Postavka
Ovo je malo teži zadatak. Traži se najveći broj B tako da kad se sabere sa A greška u zaokruživanju ne bude veća od 1.
Ovaj zadatak ćemo rešiti tako što predstavimo A, i povećavamo eksponent od normalizovanog dok ne dođemo do eksponenata dovoljno velikih da se mora desiti zaokruživanje. Onda računame pojedinačno grešku za svako zaokruživanje i biramo onu koja je manja od 1, a ima najveći eksponent. Onda osmislimo broj B tako što mantisu postavimo na sve jedinice (najveći broj) i damo taj eksponent koji smo našli.
- w = 11, k = 5, v = 15, p = 5
- IEEE mantisa
Broj A
A = 11.510 = 1011.12 = 1.01110 * 23
Tražimo najveći eksponent
Tražimo najveći eksponent na koji možemo da postavimo A, a da greška u zaokruživanju ne bude veća od 1.
A = 1.01110 * 23
A = 0.10111 0 * 24 - Nema greške
A = 0.01011 10 * 25 - Zaokružujemo tako što dodamo 1 na krajnju cifru mantise (Pravilo 3b)
Az5 = 0.011000 * 25. Greška = Az5 - A = (0.0110000 - 0.0101110)*25 = 0.0000010 * 25 = 0.1
Greška je manja od 1, znači možemo još.
A = 0.00101 110 * 26.
Zaokružuje se pravilom 2.
Az6 = 0.00110 * 26
Greška = Az6 - A = 0.00000010 * 26 = 0.1
Idemo dalje.
A = 0.00010 1110 * 27
Az = 0.00011 * 27 (Pravilo 2)
Greška = Az7 - A = (0.00011 0000 - 0.00010 1110) * 27 = 0.1
Idemo dalje...
A = 0.00001 01110 * 28
Az8 = 0.00001 (Pravilo 1).
Greška = Az8 - A = (0.00001 00000 - 0.00001 01110) * 28 = 100.1 = 8.510
Sa 8 smo ga preterali, tako da je 7 najveći eksponent koji možemo da uzmemo.
Pravimo broj B
Najveća mantisa je 11111, tako da broj B = 1.11111 * 27 = 1111 1100 = 25210.
Odatle A + B = 11.5 + 252 = 263.5 što je najbliže 264 (A). (Imajte u vidu da je A sabrano sa povećanim eksponentom sa greškom 0.12 tj 0.5 tako da je pravi zbir 12 + 252 = 264 tačno na računaru)
Pitanje 2
Na jednom računaru, realni brojevi se predstavljaju na širini od 11 bita u formatu seeeemmmmmm, gde je s bit predviđen za kodiranje predznaka broja, eeee su 4 bita za eksponent u kodu sa viškom 8, a mmmmmm su biti normalizovane matise sa skrivenim bitom (0.5≤M<1). Celi brojevi na ovom računaru se predstavljaju u drugom komplementu na širini od 7 bita. Vrednost realnog broja na lokaciji X je 32.510. Predstava celog broja na lokaciji Y je 1228. Koji je sadržaj realne promenljive Z nakon što se na ovom računaru obavi operacija Z = X + Y? Sva zaokruživanja se obavljaju prema pravilima ANSI/IEEE standarda za realne brojeve.
Postavka
- w = 11, k = 4, v = 8, p = 6
- VAX mantisa
Broj Y
Y = 1228 = 001 010 010 = 0101 0010.
Komplementiramo, Y = -10 1110 (-46).
Normalizujemo mantisu da bude u formatu 0.1mmmmmm.
Y = -011110 = -0.1011100 * 26. Nema zaokruživanja.
Broj X
X = 32.5 = 10 0000.1
Normalizujemo:
X = 10 0000.1 = 0.1000001 * 26
Sabiranje
Z = X + Y = 0.1000001 * 26 - 0.1011100 * 26 = -(0.1011100 * 26 - 0.1000001 * 26) = -0.0011011 * 26.
Normalizujemo.
Z = -0.1101100 * 24
Mantisa = 101100
Eksponent E = 4. e = E + v = 4 + 8 = 12 = 11002.
Znak je negativan.
Sastavljamo 1 1100 101100 = 0111 0010 1100 = 72C16 (A).