Esercizio: codifica binaria in C2 in virgola fissa su 14 bit (8 bit per parte intera e 6 per parte frazionaria) di valore decimale -123,21 Scomponiamo il numero dato come SOMMA di un numero intero e di un numero decimale a parte intera NULLA. -123,21 = -(123) + (-(0,21)) Procediamo ora alla codifica dei due numeri SEPARATAMENTE per poi sommarli in binario alla fine. 1) Codifica binaria in C2 su 8 bit di -123: * Se il numero è positivo: --> Calcolo il suo valore su n-1 bit (7 in questo caso) in binario NATURALE --> Aggiungo uno 0 a sinistra (che rappresenta il segno +) * Se il numero è negativo: --> Ne prendo il modulo ( -123 o abs(-123) ) --> Calcolo il suo valore su n-1 bit (7 in questo caso) in binario NATURALE --> Aggiungo uno 0 a sinistra (che rappresenta il segno +) --> Inverto TUTTI i bit (gli 1 diventano 0 e viceversa) --> Sommo 1 (che si scrive come n-1 zeri e un 1. ES: se n = 8 bit ---> 00000001) Procediamo seguendo i passi appena indicati: Il numero è positivo o negativo? ------> NEGATIVO! (-123). Ne prendo il modulo: 123. Calcolo la sua codifica in binario NATURALE su 7 bit: METODO 1: 123:2 = 61 resto 1 61:2 = 30 resto 1 30:2 = 15 resto 0 15:2 1 7:2 1 3:2 1 1:2 1 0 Quindi 123 ==> 1111011 NB: I bit che si trovano si scrivono da destra a sinistra!!! Cioè il bit a 1 relativo alla divisione intera 123:2 è IL BIT PIU' A DESTRA NELLA CODIFICA!!! METODO 2: Se siete smart sapete che con 7 bit si numera da 0 a 127. 123 = 127-4 Quindi: 127 = 1111111 e 123 = 1111011 (ho messo a zero il terzo bit relativo a 2^2 = 4). Proseguiamo: Aggiungo uno zero a sinistra: 01111011 (8 bit). Inverto i bit: 10000100 (8 bit) Sommo uno (= 00000001) : 10000100 + 00000001 = 10000101 10000101 = -123 in codifica C2. Poiché il numero finale deve avere 14 bit (8+6), scrivo già -123 con le 6 cifre decimali... le quali sono OVVIAMENTE nulle (-123,0). -1-
10000101,000000 2) Codifica binaria in C2 su 6 bit di valore decimale di parte frazionaria -0,21: Codifica binaria in C2 su 6 bit di valore decimale 0,21: I passi per convertire il numero -0.21 in binario C2 sono gli stessi di prima. Per la parte decimale l'algoritmo prevede di MOLTIPLICARE per 2 (e non DIVIDERE, come prima) e associare a tale calcolo un bit che ha come valore la parte intera del risultato della moltiplicazione. 0,21 x 2 0,42 --> 0 0,42 x 2 0,84 --> 0 0,84 x 2 1,68 --> 1 (sottraggo 1 --> 1,68-1 = 0,68) 0,68 x 2 1,36 --> 1 (sottraggo 1 --> 1,36-1 = 0,36) 0,36 x 2 0,72 --> 0 0,72 x 2 1,44 --> 1 (sottraggo 1 --> 1,44-1 = 0,44) 0,44 x 2 0,88 --> 0 0,88 x 2 1,76 --> 1 (sottraggo 1 --> 1,76-1 = 0,76) 0,76 x 2 1,52 --> 1 (sottraggo 1 --> 1,52-1 = 0,52) 0,52 x 2 1,04 --> 1 (sottraggo 1 --> 1,04-1 = 0,04) 0,04 x 2 0,08 --> 0 0,08 x 2 0,16 --> 0... 0,21 -> su 6 bit(-> approssimato, ho troncato a 6 bit!!) vale 001101 NB: In questo caso i bit sono scritti da SINISTRA e DESTRA man mano che vengono trovati! Aggiungo uno zero a sinistra: 0001101 (7 bit... ma il primo 0 cade sulla parte intera quindi OK!). Inverto i bit: 1110010 (7 bit) Sommo uno (= 0000001) : 1110010 + 0000001 = 1110011 Quindi, codifica binaria in C2 di -0,21 è 1,110011 (approssimato!) NOTATE che sono 7 bit di cui 6 di parte decimale, come richiesto. Anche qui scriviamo il numero trovato su 14 bit: 11111111,110011 SI ESTENDE CON 1 perché "replicando in modo progressivo il bit di segno a sinistra il valore del numero non muta". (Slide Cod. Binaria, pag 24) 3) Sommiamo le due componenti. -123,21 = -(123) + (-(0,21)) Quindi allineando i numeri: - 123,0 = 10000101,000000-0.21 = 11111111,110011 (approssimato) ---- -2-
10000100,110011 (approssimato), IMPORTANTE! --> (con riporto perso che non da overflow dato che i due addendi sono tra loro concordi e il risultato è concorde con loro) Quindi, -123,21 in C2 in virgola fissa su 14 bit (8 bit per parte intera e 6 per parte frazionaria) è = 10000100,110011 (approssimato) Calcolare codifica in virgola mobile Standard IEEE 754-1985 a precisione singola dello stesso numero. -123,21. Lo standard in questione si estende su 32 bit di cui il primo indica il SEGNO del numero. Non ha quindi senso, per questa codifica, lavorare in C2, visto che essa serve apposta per rappresentare numeri negativi... La rappresentazione in virgola mobile si basta sulla notazione scientifica: (-2)^(S) * M * 2 ^ E Dove: S = bit di segno (1 bit) M = mantissa, scritta nella forma (binaria) 1,xxxxxxx (23 bit) E = esponente (8 bit) (TOTALE: 32 bit) Pertanto nel nostro caso S = 1, perchè -123,21 è NEGATIVO. Sistemato il segno, da qui in avanti lavoriamo quindi con 123.21. Ancora, come per la codifica precedente, codifichiamo parte intera e decimale SEPARATAMENTE: Notate che in virgola mobile non abbiamo vincoli di bit per la rapprsentazione di parte intera e decimale... cioè, abbiamo dei limiti solo alla fine (perché abbiamo 32 bit), ma non dobbiamo porci limiti DURANTE i calcoli. Per esempio, per rappresentare 123, quanti bit bastano? 7! Quindi 123 lo scivo su 7 bit. 123 --> 1111011 (Se avessi dovuto rappresentare 987 mi sarebbero serviti 10 bit, quindi avrei scritto 987 su 10 bit... in questo senso non c'è un vincolo al momento dei calcoli!) Ecco invece le operazioni per codificare 0.210000: 1) 0.210000 x 2 = 0.420000 --> 0 2) 0.420000 x 2 = 0.840000 --> 0 3) 0.840000 x 2 = 1.680000 --> 1 4) 0.680000 x 2 = 1.360000 --> 1 5) 0.360000 x 2 = 0.720000 --> 0 6) 0.720000 x 2 = 1.440000 --> 1 7) 0.440000 x 2 = 0.880000 --> 0 8) 0.880000 x 2 = 1.760000 --> 1 9) 0.760000 x 2 = 1.520000 --> 1 10) 0.520000 x 2 = 1.040000 --> 1 11) 0.040000 x 2 = 0.080000 --> 0 12) 0.080000 x 2 = 0.160000 --> 0 13) 0.160000 x 2 = 0.320000 --> 0 14) 0.320000 x 2 = 0.640000 --> 0 15) 0.640000 x 2 = 1.280000 --> 1-3-
16) 0.280000 x 2 = 0.560000 --> 0 17) 0.560000 x 2 = 1.120000 --> 1 18) 0.120000 x 2 = 0.240000 --> 0 19) 0.240000 x 2 = 0.480000 --> 0 20) 0.480000 x 2 = 0.960000 --> 0 21) 0.960000 x 2 = 1.920000 --> 1 22) 0.920000 x 2 = 1.840000 --> 1 23) 0.840000 x 2 = 1.680000 --> 1 24) 0.680000 x 2 = 1.360000 --> 1 25) 0.360000 x 2 = 0.720000 --> 0 26) 0.720000 x 2 = 1.440000 --> 1 27) 0.440000 x 2 = 0.880000 --> 0 28) 0.880000 x 2 = 1.760000 --> 1 29) 0.760000 x 2 = 1.520000 --> 1 30) 0.520000 x 2 = 1.040000 --> 1 31) 0.040000 x 2 = 0.080000 --> 0 32) 0.080000 x 2 = 0.160000 --> 0 33) 0.160000 x 2 = 0.320000 --> 0 34) 0.320000 x 2 = 0.640000 --> 0 35) 0.640000 x 2 = 1.280000 --> 1...e si potrebbe andare avanti...visto che il risultato della moltiplicazione non ha ancora fatto 1! OK, quindi 0.21 ==> 001101011100001010001111010111000... (anche qui non mi pongo limiti per ora...) Uniamo le due parti trovate: 1111011, 001101011100001010001111010111000 e otteniamo M, che però non è ancora scritto correttamente... Al fine di arrivare a scrivere il numero nella forma desiderata (M * 2 ^ E), spostiamo la virgola verso dx o verso sx al fine di avere M scritto nella forma corretta cioé 1,xxxxxx. In questo caso spostiamo di 6 a sx, e moltiplichiamo quindi per 2 ^ 6. REGOLA (come in decimale eh...) sposto verso sx --> esponente positivo. Sposto verso dx, esponente negativo. In un colpo solo abbiamo quindi M (scritta correttamente) ed E (che è però ancora in decimale)!! (NB: se non sono necessari spostamenti, ovviamente E = 0) Abbiamo quindi: 1,111011001101011100001010001111010111000 * 2 ^ 6 Codifichiamo E. E va codificata su 8 bit in binario naturale. ATTENZIONE! Al fine di poter ottenere anche esponenti negativi (per numeri 0 < x < 1) non si codifica l'esponente trovato, bensì l'esponente trovato + 127. (Il K nelle slide della lezione) Nel nostro caso l'esponente è 6, quindi codifichiamo: E = 6 + 127 = 133 = 10000101 per cui M = 1,111011001101011100001010001111010111000 E = 10000101 Abbiamo tutto: --- S E M --- 1 10000101 11101100110101110000101 --- -4-
ULTIMA NOTA: Per la mantissa non ho preso l'1 prima della virgola, perché lo standard PREVEDE che la mantissa sia scritta come 1,xxx quindi perché scrivere 1,? Infatti lo si omette e si guadagna un bit di precisione. ;-) (E' un po' come lo 0 prima dei prefissi dei cellulari. Un bel giorno han detto: ma che diamine, tutti i prefissi iniziano con 0, quindi... perché far comporre lo 0 all'utente? E infatti ora lo zero non c'è più...) Sempre sulla mantissa ho preso solo le prime 23 cifre dopo la virgola tra quelle che ho trovato coi calcoli (che erano molte di più). Spero che si capisca ora meglio anche PERCHE durante i calcoli non POSSO pormi vincoli sui numeri di bit da usare. I 23 bit di mantissa si ottengono DOPO aver spostato la virgola, per cui non posso sapere prima di quanto si sposterà... Spero che sia chiaro... Buon lavoro! -5-