1 SISTEMI DI RAPPRESENTAZIONE DI NUMERI indice sistemi posizionali rappresentazione di numeri sistema unario storia dei sistemi di numerazione il sistema latino codici posizionali in varie basi un quiz somme numeri in base 2, 3, .. prodotto in binario base sedici (esadecimale) cambio base esercizi frazioni 0,1 da base 10 a base due limiti e overflow 2 indice capitolo numeri con segno: NUMERI CON SEGNO numeri con segno numeri in complemento a uno somme con segno complemento a due rappresentazione in eccesso di k esercizi sui numeri con segno 3 indice capitolo numeri in virgola mobile : NUMERI IN VIRGOLA MOBILE rappresentazione di n.i grandi/piccoli precisione limiti esercizio somma in floating point overflow standard IEEE 754 floating point esercizi fine parte numeri 4 rappresentazione di numeri codifica dei numeri 5 rappresentazione di numeri 6 i primi codici numerici codificavano un numero = il dato numerico in "unario": per rappresentare n si usa un simbolo ripetuto n volte (unario: c’e’ un solo simbolo, l’uno) uno due tre quattro cinque dieci I II III IIII IIIII III II III II venti ||||| ||||| ||||| ||||| trenta ||||| ||||| ||||| ||||| sei sette otto nove III III IIII III IIII IIII III III III e poi? ||||| ||||| ma... per “scrivere” cento oppure mille ... e’ un’impresa !! rappresentazione di numeri 7 unario: per codificare n uso un solo simbolo ripetuto n volte: uno I sei III III ... ... quattro IIII nove III III III cinque IIIII … la rappresentazione unaria va bene per numeri piccoli, oppure per situazioni teoriche (casi particolari di alcune macchine di Turing … lo vedremo in seguito) non va bene per la scrittura abituale non va bene per il calcolatore ... e l'umanita' se ne e' accorta abbastanza presto ! rappresentazione di numeri 8 per semplificare la rappresentazione di numeri circa 5000 anni fa in Egitto, Mesopotamia, poi India, Cina, piu’ tardi in America (centro e sud), per evitare la ripetizione eccessiva nel caso di numeri maggiori di 10 si introdusse una codifica piu' economica: si usarono dei simboli diversi per indicare un gruppo di 10, 20, 30, 100, 500, 1000 simboli ecc Il sistema inizialmente non prevedeva un simbolo per indicare il numero zero, ne' per indicare la cifra zero; per un sistema posizionale la cifra zero e' importante (indica la mancanza di numeri di quel peso) e fu introdotto abbastanza presto nel sistema babilonese (600 anni p.c.), poi reinventato in india, e poi ritornato nei paesi arabi e in Europa. rappresentazione dei numeri : i sumeri e i babilonesi sono considerati i piu' antichi i sistemi sumero-babilonesi e egiziani anche perche' poco e'rimasto delle prime civilta' indu' preindoeuropee wedge=cuneo 9 numeri egiziani 10 numeri egizi 11 bastone osso del tacco rotolo di corda girino numeri egizi 12 un esempio di scrittura di un numero grande: 46206 = 4 x 10.000 (dito indice ripetuto 4 volte) + 6 x 1000 (6 fiori di loto) + 2 x 100 ( 2 rotoli di corda) + 6 unita' (6 barre) (nessuna decina) (scritto da destra verso sinistra, ma si legge anche se cambia l' ordine di scrittura: quello che conta e' il simbolo,non la posiz) 13 codifica numeri nell'antichita' i numeri erano usati per memorizzare quantita' di oggetti e date di trattati o donazioni e eventi memorabili, e - dove richiesto - posizioni e date di eventi astronomici (a uso di predizione per agricoltura o per uso del re...) molti popoli hanno sviluppato piu' o meno autonomamente vari sistemi di numerazione, di cui ci interessano alcuni: * babilonesi (base sessanta, posizioni in gradi sessagesimali delle stelle e misura del tempo in ore, minuti e secondi) * egiziani (da cui poi i greci e poi i..) ==>> romani ... di seguito cenni dei sistemi di numerazione * greci e romani * maya (i primi a inventare lo zero, senza effetti successivi sul resto del mondo) * indu' (brahmi->devanagari->arabi occidentali->europa numerazione greca 14 gli antichi Greci erano bravissimi in geometria, ma usavano un sistema di scrivere numeri non posizionale; Euclide, Archimede, Tolomeo ecc scrivevano i numeri con il sistema greco (da cui il sistema romano); i numeri "importanti" erano indicati con le lettere iniziali della parola usata per indicare tale numero (penta,deka,hekta, ... vedi pagina seguente i matematici greci non usarono il sistema posizionale: un sistema di numerazione efficiente non era importante per gli studi di geometria; gli astronomi greci adottarono dai babilonesi l'uso dello zero (lo zero nel sistema posizionale Babilonese, usato come marcatore di posizione zero, esso era noto a Ptolomeo, ma non era considerato un numero, e fu dimenticato) numerazione greca 15 numerazione greca 16 in seguito, per economia di scrittura, furono adottati in Grecia dei simboli singoli per indicare i numeri "piu' usati", da 1 a 1000; i simboli usati erano semplicemente quelli dell'alfabeto; per i numeri dopo il 1000 si usava una codifica per il peso mille e una codifica diversa per il peso 10.000 ma il sistema non era posizionale, e cosi' rimase per i latini numerazione greca 17 numerazione greca 18 per scrivere numeri molto grandi i greci usavano un sistema misto del simbolico non posizionale puro e con due pesi (mille e diecimila)... rappresentazione di numeri 19 Dai sistemi di numerazione babilonesi ... greci deriva il sistema di numerazione romano. Il sistema latino e' un codice non posizionale (ibrido): il valore numerico associato ad un simbolo dipende in minima parte dalla sua posizione ed e' in gran parte fisso: (nota semplificazione 4: da IIII a IV) 1 2 3 4 5 20 30 40 50 I II III IV V 6 7 8 9 10 XX XXX XL L VI VII VIII IX X e, ancora, -> 11 12 13 14 15 XI XII XIII XIV XV rappresentazione di numeri sistema romano: 1 I 4 IV 10 X 20 XX 30 XXX 40 XL 50 L 100 200 300 400 500 .... C CC CCC CD D 20 5 V 60 70 80 90 LX LXX LXXX XC 600 700 800 900 1000 DC DCC DCCC CM M numeri - il sistema romano 21 le operazioni aritmetiche con il sistema di numerazione romano o latino sono "piuttosto scomode" … Si provi ad es. verificare che MCMXCVI piu’ IV = MM (*) oppure : X LVI I I ________ volte XIX = CMXII (*) 1000+900+90+6 piu' 4 = 1996 piu' 4=2000 (+) 48 * 19 = 912 (+) rappresentazione di numeri per semplificare le operazioni di addizione (e le altre operazioni aritmetiche) si ricorreva al pallottoliere (abaco) il pallottoliere e' rimasto in uso in molti paesi fino a pochi decenni fa (Russia, Cina, Giappone) dove il suo uso era insegnato a scuola (talvolta lo e' ancora) il sistema romano era una via poco praticabile e fu abbandonato anche se solo dopo piu' di mille anni ... tracce di uso rimangono in varie situazioni e in vari paesi ... 22 numeri indiani 23 Il sistema posizionale decimale fu inventato in India: duemila anni prima il sistema di numerazione posizionale fu inventato dai sumeri e babilonesi, ma con base 60; gli indu' ripresero il sistema posizionale, con base 10 (non noto se lo ripresero dai babilonesi attraverso le prime culture proto-indu' di Harappa e Mohendjo Daro, (culture distrutte dagli indo-europei) o se lo reinventarono) Laplace scrive: Laplace sul sistema indo-arabo 24 Laplace: il sistema ingegnoso di esprimere ogni numero possibile con l'uso di soli dieci simboli (assegnando ad ogni simbolo un valore di posizione e un valore assoluto) nasce in India. Oggi l' idea sembra tanto semplice che il suo significato e la sua profonda importanza non sono piu' apprezzati. Il sistema ha portato ad una tale semplificazione dei calcoli da portare l'aritmetica tra le invenzioni piu' utili per l'umanita'. Si comprende l'importanza di questa invenzione se si considera che essa non fu alla portata dei matematici maggiori dell'antichita' come Euclide, Archimede o Apollonio... (a difesa di quelli si ricorda che gli interessi dei matematici dell' antichita' era volto verso la geometria, meno verso i calcoli numerici) numeri indiani 25 nota l'evoluzione del 2 da || e del 3 da ||| numeri indiani 26 Sulle origini dei numeri Brahmi (da cui derivano i numeri Devanagari, i numeri arabi (piu'varianti) e infine i numeri come oggi li usiamo) si sa poco; poco si sa anche sulle cause che portarono all'invenzione del sistema posizionale; gli studi numerologici in India furono motivati dall'astrologia e dal fascino per i numeri grandi tipico della cultura dell'India ( racconto del 2 secolo d.c. sul dialogo tra Boddishatva e il suo maestro di matematica su come si ottengono dei numeri molto grandi; Boddishatva arriva ad un dato dell' ordine di grandezza di 10^450 ! ) numeri indo-arabi 27 numeri cinesi 28 numeri giapponesi 29 numeri ... si potrebbe continuare l'elenco di sistemi di numerazione, menzioniamo solo un esempio ancora, che e' circa contemporaneo ai numeri Brahmi, ma di tutt'altra regione ... 30 Numerazione Maya 31 le culture del continente africano erano a contatto con l'area mediterranea e dell'india; le culture del continente australiano (condizioni climatiche diverse) non hanno dato luogo a organizzazioni statali complesse che richiedessero archivi e corrispondenza... le culture del continente americano hanno avuto uno sviluppo separato nell'arco di 10.000 anni (seconda ondata di popolazione del continente, attraverso la Siberia e l'Alasca), e sono arrivate alla scrittura e ai sistemi di numerazione con uno sviluppo autonomo; la maggior parte del sapere delle culture del continente americano e' stata distrutta dai colonizzatori spagnoli. segue un cenno al sistema di numerazione Maya, sviluppato molti secoli prima dell'arrivo degli spagnoli. Numerazione Maya 32 Numerazione Maya proviamo scrivere 508: ricorda che la base e' 20, quindi 508 va pensato e riscritto come: 8 unita' (=8 decimale) 5 ventine (=100 decimale) 1 ventina al quadrato (=20*20 = 400 decimale) quindi 50810 = 158 20 che in Maya scriviamo . ... 33 numeri maya qualche esempio di numeri maya: 34 sullo zero L'introduzione del sistema posizionale porto' alla scoperta dello zero; si noti che i sistemi "additivi" come l'antico egiziano o il sistema romano non richiedono l'uso dello zero: 2040 si scrive MMXL, 24 si scrive XXIV ... in un sistema posizionale lo zero e' importante: devo distinguere tra 24, 204, 240, 2004, 2040, 2400, 20004, 200400, 24000 ... quindi come codice di "posizione vuota" lo zero appare assieme al sistema posizionale, mentre il NUMERO ZERO appare secoli dopo, con la generalizzazione delle regole di aritmetica di somma, prodotto, moltiplicazione e divisione ... 35 storia numeri indu' 36 200 d.c.: cifre Brahmi, 500: sistema posizionale e introduzione della cifra zero (non come numero, ma come marcatore di posizione vuota), 630: zero come numero: il matematico Brahmagupta si occupa dell'uso dello zero nelle operazioni aritmetiche: Br. scrive [[se z sta per zero, n per negativo, p per positivo, nn per numero negativo, np per numero positivo]] : addizione: la somma di z e di un nn e' n, la somma di un np con z e' p, la somma di z con z e' z; sottrazione: un nn (o np) sotratto dallo z e' p (o n), z sotratto da un np (o nn) e' p (o n), z sotratto da z e' z; moltiplicazione: ... np moltiplicato per z e' z, ..., divisione: z diviso un np o un nn e' zero, z diviso z e' z, (!!) np o nn diviso zero e' una frazione con zero come denominatore (tautologia !!) -> non riesce a risolvere il x/0 ... 1130 Bhaskara: un np diviso per z e' una frazione chiamata frazione infinita, che e' tale che f.i.+n e' f.i., e f.i.-n e' f.i. ... numeri cinesi 37 il sistema di numerazione indu', posizionale decimale, con lo zero, era ben sviluppato nel 800 d.c., e dall' India si diffuse all'est - in Cina: i matematici Cinesi del 1200 descrivono il sistema posizionale decimale con l'uso della cifra e anche del numero zero; e sempre dall'India si diffuse all'ovest, nei paesi arabi, e quindi in Italia: Fibonacci, "Liber abaci" dove usa anche il "segno" zero (ma non il numero zero) il numero zero entro' nell'uso comune dei matematici Europei appena dopo il rinascimento (1600); ... Gli autori J.J. O'Connor, E.F.Robertson, dell' articolo sullo zero, scrivono: ma lo zero e'ancora problematico ;-) si consideri ad esempio la data del "millenio", 1 gennaio 2000, che era la fine di 1999 anni del nostro sistema di contare gli anni, e non di 2000 anni... (vedi: http://www-history.mcs.st-andrews.ac.uk/HistTopics/Zero.html) numeri indo-arabo-europei: I numeri standardizzati con l'introduzione della stampa (1500-1600): 38 rappresentazione di numeri 39 CODICI NUMERICI POSIZIONALI Un numero e' codificato (rappresentato) da una sequenza di simboli, dove ogni simbolo ha un valore numerico definito dalla posizione del simbolo nella sequenza: 1984 rappresenta un valore dato dalla somma di 1 migliaia 9 centinaia 8 decine 4 unita' 1984 rappresenta 1000 * 1 + 100 * 9 + 10 * 8 + 1 rappresentazione di numeri 40 CODICI NUMERICI POSIZIONALI Un numero e' codificato (rappresentato) da una sequenza di simboli, dove ogni simbolo ha un valore numerico definito dalla posizione del simbolo nella sequenza. Es: codice numerico posizionale con 4 simboli (cifre) : abcd (o qualunque altri 4 simboli) Ad ogni simbolo si associa un valore numerico, ad es.: a =3, b = 2, c = 1, d = 0, Una stringa di tali simboli e' un codice di un numero: ad esempio abbac: abbac rappresenta un valore numerico dato da: n = a * p1 + b * p2 + b * p3 + a * p4 + c * p5 dove p1, p2, p3, p4 e p5 sono valori numerici o "pesi" associati alle posizioni nella stringa. rappresentazione di numeri - un codice ... strano : 41 cont. es 4 simboli, a b c d a cui associamo i valori numerici a =3, b = 2, c = 1, d = 0, una stringa di tali simboli: abbac rappresenta un valore numerico ottenuto dai simboli (cifre) moltiplicando ogni cifra per un peso diverso (i pesi sono convenzionali) e poi sommando: n = r * p1 + t * p2 + r * p3 + r * p4 + s * p5 es. con i pesi (NON usuali! - anzi, decisamente strani...) p1 = 222, p2 = 55, p3 = 17, p4 = 6, p5 = 1 il codice abbdc ovvero 32201 con tale sistema vale 3*222 + 2*55 + 2*17 + 0*6 + 1*1 = 666+110+34+0+1 = 811 (sistemi simili sonostati usati per le monete di antichi paesi) rappresentazione di numeri 42 esempio: rappresentazione di numeri con 4 cifre a,b,c,d (leggi: zero, uno, due, tre) ca rappresenta il valore c * peso1 + a * peso0 bacabb rappresenta un valore numerico ottenuto dai simboli (cifre) moltiplicando ogni cifra per un peso diverso e poi sommando: scelta abituale: i pesi associati alle posizioni sono convenzionali ma NON sono arbitrari: sono le potenze di una costante detta base del sistema, in un sistema a 4 cifre, base 4, si assume convenzionalmente peso0 = uno, peso1 = quattro ca = c * peso1 + a * peso0 quindi ca = c * quattro + a * uno rappresentazione di numeri nel sistema in base 4 o "quaternario" abbiamo 4 cifre: a,b,c,d (leggi : zero, uno, due, tre), la codifica abbac rappresenta un valore numerico ottenuto dai simboli (cifre) moltiplicando ogni cifra per un peso diverso (i pesi sono convenzionali) e poi sommando: n = a * p1 + b * p2 + b * p3 + a * p4 + c * p5 per il nostro sistema, una scelta e': p5 (ultimo peso a destra)vale 1 (unita') cioe' 4 alla 0 p4 (penultimo peso a destra) vale 10 (quartine) = 4 alla 1 p3 vale 100 (sedicine) = 4 alla due, ecc ba (vale b*p4+a*p5 = una quartina,zero unita') bd (vale b*p4+d*p5 = una quartina,tre unita') bac (vale b*p3 + a*p4 + c*p5= una sedicina + zero quartine + due unita') 43 rappresentazione di numeri sistema "quaternario", base 4, con 4 cifre: a(zero), b(uno), c(due), d(tre) scelta abituale: i pesi associati alle posizioni sono le potenze di una costante detta base del sistema, per il nostro sistema, con n= a*p1+b*p2+b*p3+a*p4+c*p5 una scelta potrebbe essere p5 vale 1 (unita'); p4 vale 10 (quartine), p3 vale 100(sedicine) ecc; 0) a 1) b 2) c 3) d i primi 20 numeri 4) ba 5) bb 6) bc 7) bd si scrivono 8) ca 9) cb 10) cc 11) cd cosi' (es. cinque cioe' 12) da 13) db 14) dc 15) dd un 4 piu' un 1 si scrive 16)baa 17)bab 18)bac 19)bad bb , 12 cioe' tre 4 piu' 20)bba 21)bbb 22)bbc 23)bbd zero 1 si scrive ca, ecc) ancora: bbd =b*sedicine+b*quartine+d*unita' = scritto in decimale: 16+4+3 = 23 44 rappresentazione di numeri 45 riscriviamo il sistema quaternario, base 4, con 4 cifre: al posto di a, b, c, d scrivo 0 1 2 3 per il nostro sistema, una scelta dei pesi (abituale): p5 vale 1 (unita'); p4 vale 4 (quartine), p3 vale 16(sedicine) diremo il sistema posizionale con base 4, e per contare in base 4 avremo: 0) 0 4) 10 8) 20 12) 30 16)100 20)110 1) 1 5) 11 9) 21 13) 31 17)101 21)111 2) 2 3) 3 6) 12 7) 13 10) 22 11) 23 14) 32 15) 33 18)102 19)103 22)112 23)113 i primi 20 numeri si scrivono cosi' ... ad es : 113 =1*sedicine+1*quartine+3*unita' = riscritto in base dieci abituale: 113 = 16+4+3 = 23 rappresentazione di numeri 46 il nostro sistema numerico e' posizionale con base dieci: 1187 rappresenta 1*10^3 +9*10^2 +8*10^1 +7*10^0 = 1*1000 +1*100 +8*10 +7* per un codice numerico posizionale in base b uso un insieme di b cifre (simboli): { s1,s2,s3,... sb } Un dato di n+1 cifre c(n) c(n-1) c(n-2) c(n-3)...c(1) c(0) rappresenta il numero (indico con b^k = b elevato alla k) c(n)*b^n + c(n-1)*b^(n-1) + ... + c(1)*b^1 + c(0)*b^0 cioe’ (in base b): c n * 10..00 + .. + c 2 * 100 + c 1 * 10 + c 0 * 1 rappresentazione di numeri 47 si noti che nel sistema numerico posizionale con base dieci: 1187 rappresenta 1*10^3 +9*10^2 +8*10^1 +7*10^0 = 1*1000 +1*100 +8*10 +7* 1 questo si puo' scrivere anche cosi' (con basi a fattore comune) : ( ( ( ( ( 1*10 ) + 1 ) * 10 + 8 ) * 10 ) + 7 ) rappresentazione di numeri riprendiamo il sistema con 4 simboli (cifre), e i pesi saranno le potenze di 4: p4..p0= 256 64 16 4 48 base = 4, 1 e quindi d b d d c con (d =3, c = 2, b = 1, a = 0) rappresenta: 3*p4 + 1*p3 3 * 10000 + 1 * 1000 3*4^4 + 1*4^3 3*256 + 1*64 + 3*p2 + 3 * 100 + 3*4^2 +3*16 + 3*p1 + 2*p0 = + 3 * 10 + 2 * 1 (in base 4) = + 3*4^1 + 2*4^0 = (base 10) + 3*4 + 2*1 = 768 + 64 + 48 + 12 + 2 = 832 + 62 = 894 in base 10 rappresentazione di numeri 49 I primi venti numeri sono rappresentati in base 4 come segue (riportati numero in decimale e in base quattro): 0 1 2 3 4 5 6 7 8 9 10 0 1 2 3 10 11 12 13 20 21 22 <- <- 11 12 13 14 15 16 17 18 19 20 23 30 <31 32 33 100 <- (non 40! ;-) 101 102 103 110 <- rappresentazione di numeri 50 es: base 4: 1323 rappresenta (e' la codifica di) : 1 * base^3 + 3 * base^2 + 2 * base ^1 + 3 * base^0 1 * 4*4*4 + 3 * 4*4 +2* 4 +3*1 ovvero: 1*64 + 3 * 16 + 2 * 4 + 3 …. e 1987 cosa rappresenta in base 4 ? ;-) <<== rappresentazione di numeri ... in base quattro il numero 51 1987 ... ... non rappresenta nulla perche' 9,8,7 non sono cifre in base quattro in base b le cifre vanno da 0 a b-1 !! in ogni caso la base si scrive 10 e rappresenta il numero b (tranne in unario) Es. in ottale ovvero con base otto le cifre sono: 0 1 2 3 e la base otto si scrive 10 !! 4 5 6 7 rappresentazione di numeri ancora, in ottale (base otto) il valore numerico della base e' otto, dove otto in base 8 si scrive 10 in genere in ogni sistema posizionale con base b, la base b si scrive 10 otto in base 8 si scrive 10, e si indica con: 108 dato che si indica otto in base 10 con 810 quindi 108 = 810 come 103 = 310 , e 106 = 610 e 107 = 710 e 1016 = 1610 52 rappresentazione di numeri 53 in ottale (base otto) si conta: 0 1 10(*) 11 20 21 30 2 3 4 5 6 7 12 22 13 23 14 24 15 25 16 26 17 (*) 108 = 810 27 65 66 67 75 76 77 ... ... ... ... 73 74 a cui segue -> 70 71 72 -> 7*8+7 =63 100 101 102 107 110 .... 111 112 117 -> 64+8+7 =79 rappresentazione di numeri 54 ad es. in base 12 ho dodici cifre, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B dieci e undici in base 12 sono cifre, indicate con A e B ! quindi i primi 36 numeri - conto da 0 a 35 (35 in base 10): 0 10 20 30 40 50 60 1 11 21 31 41 ... ... 2 12 22 32 42 3 13 23 33 43 4 5 6 7 8 9 A B ( B vale 11) 36 ... 19 1A 1B (1B vale 23) 35 ... 29 2A 2B (2A vale 34) 34 ... 39 3A 3B (39 vale 45) 44 ... 49 4A 4B (4B vale 4*12+B=48+11) rappresentazione di numeri 55 ad es. in base 16 ho sedici cifre, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F dieci, undici,.. quindici in base 16 sono cifre, indicate con A,B,.. F quindi i primi 20 numeri - conto da 0 a 20 (20 in base 10): 0 1 2 3 4 5 8 9 A B C D 10 11 12 13 14 15 18 19 1A 1B 1C 1D 6 E 16 1E 7 (da 0 a 7 come in decimale) F (B vale 11, F vale 15) 17 (10 vale 16 in base 10) 1F (1E vale 30 in base 10) rappresentazione di numeri CONVERSIONE da base b generica a base 10, e da base 10 a base generica 56 rappresentazione di numeri CONVERSIONE da base b generica a base 10, esempio: da base 8 a base 10, per definizione: 17 = 1*8+7 =15, 20 = 2*8 = 16, 76 = 7*8+6 = 62, 100 = 1*64 = 64 ecc Per decodificare in base 10 un numero rappresentato in base 8 basta ricordare la definizione: ad es. 5 1 5 ( in base 8) vale in base 10: 5*100 + 1*10 + 5*1 (in base 8) 5 * 64 + 1 * 8 + 5*1 (in base 10) = 320 + 8 +5 = 333 (in base 10) 57 rappresentazione di numeri ancora un es: il numero 3 7 1 3 in base 8 diventa in base 10: 3 * 1000 + 7 * 100 + 1 * 10 + 3 * 1 tutto in base 8, che in base 10 diventa: = 3*512 + 7 * 64 + 1 * 8 + 3 * 1 = 1536 + 448 + 8 + 3 = 1995 10 58 rappresentazione di numeri un es. in base 3 ... (cifre 0,1,2 ): come si conta in base tre ? 0 1 2 10 11 12 che sono tre, quattro e cinque, cioe' una terna piu' zero, uno e due, poi 20 21 22 che sta per sei, sette e otto, ovvero due terne piu' zero, uno e due, cui segue nove ovvero tre terne cioe' una (terna)2 piu'zero terne piu' zero unita' 100 e poi? 59 rappresentazione di numeri 60 in base tre ... (cifre 0,1,2 ): contare in base tre: 0 1 2 100 101 102 200 201 202 1000 … 10 110 210 11 111 211 12 112 212 20 120 220 21 22 121 122 221 222 che corrispondono ai numeri in base 10: 0 9 18 27 1 10 19 … 2 11 20 3 12 21 4 13 22 5 14 23 6 15 24 7 16 25 8 17 26 rappresentazione di numeri 61 esercizio: quanto vale 1 2 2 1 0 1 (dato in base 3) = in base dieci ? 122101= in base tre il significato e' noto: 1 * 100000 + 2* 10000 + 2 * 1000 + 1 * 100 + 0 * 10 + 1 * 1 tutto in base tre ... vediamo di riscrivere in base dieci ricorda come si conta in base tre: 0 1 2 10 11 12 20 0 1 2 3 4 5 6 21 7 22 100 ovvero, 8 9 in base 10, rappresentazione di numeri 62 esercizio: quanto vale 1 2 2 1 0 1 (dato in base 3) = in base dieci ? in base tre il significato e' noto: 122101= 1 * 100000 + 2* 10000 + 2 * 1000 + 1 * 100 + 0 * 10 + 1 * 1 che diventa in base dieci: 1*35 +2*34 +2*33 +1*32 +0*31 +1*30 = 1 * 243 + 2 * 81 + 2 * 27 = 243 + 162 + 54 = 469 10 = 122101 3 + 1*9 +9 + 0 * 3 + 1* 1 +1 63 e finalmente arriviamo al sistema usato dai calcolatori: numeri in base 2 due cifre sole, 0 e 1 rappresentazione di numeri In base due abbiamo due cifre 0 1 (cifre binarie,BInary digiT = BIT) per rappresentare i due numeri zero e uno, e 10 per rappresentare il numero due; i primi 20 numeri in binario: 1 1 11 10112 2 102 12 11002 3 112 13 1101 4 100 14 1110 5 101 15 1111 6 110 16 10000 7 111 17 10001 8 1000 18 10010 9 1001 19 10011 10 10102 20 101002 nota: 101 = 4 +1=5; 110 = 4+2=6; 1101 = 8+4+1=13 ecc 64 rappresentazione di numeri 65 ricorda alcune potenze di due in binario: 2 = 2 alla 1; 16 = 2 alla 4; 128 = due alla 7; 1024 = 2 alla 10; 32768 = 2 alla 15; 4= 2 alla 2; 32 = 2 alla 5; 256 = 2 alla 8; 2048=2 alla 11; 65536 = 2 alla 16; ... 1024 = 2 alla 10 ... = 1 Kilo 1 048 576 = 2 alla 20 = 1 Mega 1 073 741 824 = 2 alla 30 = 1 Giga 8 = due alla 3; 64 = 2 alla 6; 512 = 2 alla 9; 4096=2 alla 12; ... e un Tera ? in base due scrivo le potenze di due come: 2 ->102 4->100 2 8->1000 2 16->10000 2 32->10 00002 64->100 0000 2 128->1000 0000 2 256->1 0000 0000 2 ecc rappresentazione di numeri 66 es. il numero 1011012 rappresenta (tutto in binario): 1*1000002 + 0*100002 + 1*10002 + 1*1002 + 0 *102 + 12 ovvero (in decimale): 1* 3210 = 4510 + 0*1610 + 1* 810 + 1 * 410 + 0 * 210 + 1 rappresentazione di numeri 67 conversione da base 2 a base 10 -basta ricordare le potenze di due ed il significato del codice, 4096 2048 1024 512 256 128 64 32 16 8 2^12 2^11 2^10 2^9 2^8 2^7 2^6 2^5 2^4 2^3 4 2 2^2 2^1 1 2^0 ad es 10000 2 = 2 alla 4 = 16 per cui 10100 = 1*2^4 +0*2^3 +1*2^2 +0*2^1 +0*2^0 rappresenta 1*16 +0*8 +1*4 +0*2 +0*1 = 20 rappresentazione di numeri conversione da base 2 a base 10 -basta ricordare le potenze di due ed il significato del codice, 4096 2048 1024 512 256 128 64 32 16 8 2^12 2^11 2^10 2^9 2^8 2^7 2^6 2^5 2^4 2^3 4 2 2^2 2^1 1 2^0 esercizio ... convertire in base dieci il numero dato in base due (qui inseriti tre spazi per migliore lettura): 101 0110 0110 01012 68 rappresentazione di numeri 69 soluzione esercizio " convertire in base dieci il numero dato in base due " 101 0110 0110 0101 onm lkji hgfe dcba ricordando i pesi che sono: 1 per l’ultima cifra a destra, a, poi due per la penultima cifra b, poi 4 per c, poi 8 per d, ecc, e 1024 per la decima cifra k, 2048 per l, 4096 per m(12a cifra) 8192 (13.a cifra n), 16384 per la 14.a cifra o, quindi (tolte le cifre zero, restano le cifre uno), in notazione mista: o +m + k +j +g +f +c +a 16384 +4096 +1024 +512 + 64 + 32 + 4 + 1 = 22117 rappresentazione di numeri 70 soluzione esercizio " convertire in base dieci il numero dato in base due " 101 0110 0110 0101 un po' piu' veloce se raggruppo a 4 a 4 i bit, e ricordando i pesi di questi gruppi, che sono le potenze di 16 (un gruppo di 4 cifre binarie permette di contare da 0 a 15), 1 per l’ultimo a destra, 16 per il penultimo a destra, 256 per il terzultimo a destra (il secondo) e infine 4096 per il primo quindi (in notazione mista): 101*4096 + 0110*256 + 0110*16 + 0101*1 ricordando la tabellina dei primi 16 numeri in binario, 101 = 5, 0110 = 6, 0101 = 5, quindi: 5*4096 + 6*256 + 6*16 + 5 = 20480 + 1536 + 96 + 5 = 22117 esercizio (quiz) quale numero segue nella sequenza, e perche' ? (ovvero: come e’ costruita questa sequenza?) 10 11 12 13 14 20 22 101 ? 71 quiz un aiuto ... dieci in base dieci si scrive dieci piu' zero, cioe' 10, dieci in base nove si scrive nove piu' 1, cioe' 11 dieci in base otto come si scrive? 72 rappresentazione di numeri - tabella di corrispondenza num\ base 2 3 4 5 6 7 ---------------------------------------------------------------------------------------- uno 1 1 1 1 1 1 due 10 2 2 2 2 2 tre 11 10 3 3 3 3 quattro 100 11 10 4 4 cinque 101 12 11 10 5 sei 110 20 12 11 10 sette 111 21 13 12 11 otto 1000 22 20 13 12 nove 1001 23 21 14 13 dieci 1010 101 22 20 14 73 nota: in base 4 quattro scrivo 10, cinque scrivo 11 ecc nota la diagonale 4 in tabella in cor5 rispondenza della 6 riga = colonna = base, 10 e le diagonali 11 immediatam. sopra e sotto... 12 13 rappresentazione di numeri 74 aritmetica elementare, date tabelle di addizione base 2 e 3 : 0 1 0 1 2 ------------0 0 1 0 0 1 2 1 1 10 1 1 2 10 2 2 10 11 0+1=1 1+1=10 (binario) 1+1=2 2+1=10 (ternario) da cui le somme in base 2,3,10 (stessi dati in basi diverse): 1 1 0 1 1 1 1 1 3 + 1 0 + 2 + 2 --------------1 1 1 1 1 2 0 1 5 2 3 10 rappresentazione di numeri ... ancora somme: nove piu' cinque (decimale) in base 2 e 3: 1 0 0 1 1 0 1 ------1 1 1 0 2 1 0 0 1 2 ----1 1 2 9 5 -14 3 10 ---------------------------------------------------------------------------------------------------- undici e cinque (decimale) in base 2 e 3: 1 0 1 1 1 0 2 11 1 0 1 1 2 5 -----------1 0 0 0 0 1 2 1 16 2 3 10 - 75 rappresentazione di numeri ... ancora somme: quindici piu' uno (decimale) in binario e ternario : 1 1 1 1 1 -------1 0 0 0 0 2 1 2 0 1 ----1 2 1 3 15 1 -16 10 76 rappresentazione di numeri 77 addizione in base otto ----------------------------------------------------- 0 1 2 3 4 5 6 7 0 1 2 3 1 2 3 4 2 3 4 5 3 4 5 6 4 5 6 7 5 6 7 10 6 7 10 11 7 10 11 12 1 5 + 2 --1 7 8 13 + 2 -15 10 4 5 6 7 10 11 12 13 5 6 7 10 11 12 13 14 6 7 10 11 12 13 14 15 1 3 5 --2 0 8 7 10 11 12 13 14 15 16 da cui ad es. 7+1=10 11 5 -16 10 ottale / decimale rappresentazione di numeri PRODOTTO: base 2 e 3: 0 1 --0 0 0 1 0 1 0 1 2 ----------0 0 0 0 1 0 1 2 2 0 2 11 base 2 1*0=0 1*1=1 base tre 1*2 = 2 2*2 =11 78 rappresentazione di numeri PRODOTTO:base 2 e 3: 0 1 --- 0 1 2 --------- 0 0 0 0 0 0 0 1 0 1 1 0 1 2 2 0 2 11 79 es. (12*13=156) in base due: 1 1 0 0 * 1 1 0 1 -----------------1 1 0 0 1 1 0 0 0 0 0 0 1 1 0 0 --------------1 0 0 1 1 1 0 0 in base 10: 128 +16+8+4 = 156 rappresentazione di numeri PRODOTTO: base 2 e 3: 0 1 --0 0 0 1 0 1 0 1 2 ----------0 0 0 0 1 0 1 2 2 0 2 11 base 2 1*0=0 1*1=1 base tre 1*2 = 2 2*2 =11 80 base 3 [ 12*16=192 ] 1 1 0 * 1 2 1 ---------------1 1 0 2 2 0 1 1 0 ----------2 1 0 1 0 che e' 2*81+1*27+0*9+1*3+0*1 = =162+27+3 = 192 esercizio: prodotto 81 esercizio: calcolare 18 * 5 in base due ( 18 * 5 = 9 * 10 = 90 in base 10, in base 2: 90 = 64 + 16 + 8 + 2 = = 1*64 + 0*32 +1*16 +1*8 +0*4 +1*2 + 0*1 ovvero 1 0 1 1 0 1 0 con i pesi 64 32 16 8 4 2 1 ) se passo prima in binario, e poi faccio il prodotto in binario: 18 = 16 + 2 = (in base 2) = 10000 + 10 = 10010 5 = 4 + 1 = (in base 2) = 101 cont.esercizio prodotto 82 continua esercizio: calcolare 18 * 5 in base due 18 = 16 + 2 = (in base 2) = 10000 + 10 = 10010 5 = 4 + 1 = (in base 2) = 101 quindi 10010 x 101 -----------1 0 0 1 0 0 0 0 0 0 1 0 0 1 0 ---------------------1 0 1 1 0 1 0 = 64 + 16 + 8 + 2 rappresentazione di numeri tavola delle moltiplicazioni in base otto: PRODOTTO: 2*4=10,3*5=17 1 2 3 4 5 6 7 -------------------------0 0 0 0 0 0 0 0 1 1 2 3 4 5 6 7 2 2 4 6 10 12 14 16 3 3 6 11 14 17 22 25 4 4 10 14 20 24 30 34 5 5 12 17 24 31 36 43 6 6 14 22 30 36 44 52 7 7 16 25 34 43 52 61 ========================== 83 1 4 * 1 5 ------(base 8) 1 4 7 4 (o) -----2 3 4 (o) nb: 4*58=248 ho 48, riporto 28,poi 1*58=5+2(rip)=7.. (in base 10: 12 * 13 = 36 ------156 esadecimale (base 16) 84 In base 16 si usano 16 cifre, normalmente indicate con: 0 1 2 3 4 5 6 7 8 9 A B C D E F leggi: zero, uno, .. nove, dieci, undici, dodici, ... quindici) I primi 20 numeri in base 16 sono(base10/base16): 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 A base 10 base 16 11 12 13 14 15 16 17 18 19 B C D E F 10 11 12 13 20 14 base 10 base 16 esercizi: 1) quanto vale C * D in base 16 ? 2) costruire la tabella di moltiplicaz. per base 16. CAMBIO DI RAPPRESENTAZIONE (rip.) per decodificare in base 10 un numero scritto in una base generica e' sufficiente ricordare la definizione. Es: dato (in binario): 1 0 0 0 7 6 5 4 128 64 32 16 = = 1*2^7 + + 1*128 + + 1 1 3 2 8 4 0*2^6 1*2^2 0*64 1*4 + + + + 1 1 (cifre) 1 0 (rango) 2 1 (peso) .. 1^2^3 1*2^1 + 1*2^0 = .. + 1*8 1*2 + 1*1 = 143 anche cosi': = ((( ((( 1*2+0)*2+0)*2+0)*2 +1)*2+1)*2+1)*2+1 dove il primo 1 viene moltiplicato per 2^7, il secondo (zero) per 2^6 ecc 85 CAMBIO DI RAPPRESENTAZIONE - dal BINARIO-> 86 Raggruppando le cifre binarie (bit) a tre a tre, partendo da destra verso sinistra, si converte la rappresentazione da base due a base otto: il dato di partenza 143 (base 10) ovvero in base due 10 00 11 11 vale (cifre bin. a tre a tre): 010 001 111 (1*2+0) * 2^6 + = 2 * 64 = 2 * 8^2 (0*4+0*2+1) * 2^3 + + 1 * 8 + 1 * 8^1 (1*4+1*2+1) * 2^0 + 7 *1 = + 7 * 8^0 = 2 1 7 in base 8, che vale = 2 * 64 + 1 * 8 + 7 = 128 + 8 + 7 = 143 in base dieci CAMBIO DI RAPPRESENTAZIONE - dal BINARIO-> 87 per passare da base due a base sedici e' sufficiente raggruppare i bit a quattro a quattro: lo stesso dato 143 che in base due si scrive: 10 00 11 11 vale 1000 1111 (1*8+0*4+0*2+0) * 2^4 + = 8 * 16 + 15 * 1 = = 8 F in base sedici (1*8+1*4+1*2+1*0) * 2^0 = 8 * 16 + 15 = 128 + 15 = 143 in base 10 NOTA: l’esadecimale si usa solo come rappresentazione piu’ concisa del binario [ raggruppiamo il binario a 4 a 4 cifre partendo da destra e abbiamo l’ esadecimale ] .. il binario perche’ e’ usato dal calcolatore ... CAMBIO DI RAPPRESENTAZIONE Ricordiamo ancora la tabella di corrispondenza dei codici numerici da 1 a 15 nelle basi (10)(16)(8)(2): 0 0 0 000 8 8 10 1000 1 1 1 001 9 9 11 1001 2 2 2 010 10 A 12 1010 3 3 3 011 11 B 13 1011 4 4 4 100 12 C 14 1100 5 5 5 101 13 D 15 1101 6 6 6 110 14 E 16 1110 7 7 7 111 15 F 17 1111 ________________________________ 88 il numero 10 (base 10) in base otto si scrive 12, e in base 2 si scrive 1010; il numero 14 in base 8 e' 16 e in base 2 e' 1110 ... RAPPRESENTAZIONE BIN ... ultimi 4 esempi ... 89 - due es da base 2 a base 8 o 16: per passare da base 2 a base 8 prendo i bit a tre a tre, da base 2 a base 16 prendo i bita a 4 a 4 (sempre da destra verso sinistra): dato 10 00 11 11 = = 10 001 111 = 2 1 7 base 8 = 1000 1111 = 8 F base 16 nota: il raggruppamento inizia da destra verso sin. dato 10 10 10 10 10 = = 1 010 101 010 = 1 2 5 2 base 8, bit a tre a tre; = 10 1010 1010 = 2 A A base 16, bit a 4 a quattro RAPPRESENTAZIONE BIN ... ultimi 4 esempi ... ... e due es. da base 16 a base 8 (uso base 2): 7B5C dato in base 16 = = 0111 1011 0101 1100 cambio raggruppamento: = 0 111 101 101 011 100 = 0 7 5 5 3 4 (in base 8) 1991 dato in base 16 = = 0001 1001 1001 0001 cambio raggruppamento: = 0 001 100 110 010 001 = 0 1 4 6 2 1 (in base 8) 90 CAMBIO DI RAPPRESENTAZIONE DA DECIMALE ... 91 procedimento per passare da base 10 ad altra base: richiede un po' piu' lavoro, ma e' ancora basato sulla definizione: L'ultima cifra di un codice numerico posizionale in base b e' sempre il resto della divisione per b [“cio’ che resta dopo aver raggruppato gli oggetti a b a b"], quindi: dato un numero in base 10 ad es. 152, l'ultima cifra "a" della sua rappresentazione in base b , ...fedcba, e' data da (13 MOD 5 = resto di 13 diviso 5 = 3 !!): n MOD b = 152 MOD b = (...fedcba) MOD b = a ad es. se b=8 allora la cifra a = n MOD 8; CAMBIO DI RAPPRESENTAZIONE DA DECIMALE ... 92 (ripeto..) dato numero n in base 10, l'ultima cifra "a" della sua rappresentazione in base b , ...fedcba, e' data dal resto della divisione di n per la nuova base b: n MOD b = (...fedcba) MOD b = a per passare da codifica da base 10 (es. 152) in base 8, calcolo le singole cifre (dall'ultima in poi) dividendo ripetutamente (ad ogni passo prendo come dividendo il quoziente del passo precedente) per la base nuova (qui otto) e mi segno i resti (ottengo per prima l'ultima cifra) 152 = 19 * 8 + 0 -> 19 = 2 * 8 + 3 -> 2 = 0 * 8 + 2 -> 0 = 0 * 8 + 0 -> a questo punto smetto, quindi 15210 = 2308 resto resto resto resto 0 3 2 0 -> -> -> -> "a" "b" "c" "d" =0, =3, =2, =0, CAMBIO DI RAPPRESENTAZIONE DA DECIMALE ... 93 ancora, lo stesso dato in base 4: 152 38 9 2 0 = 38 * 4 + 0 = 9 * 4 + 2 = 2 * 4 + 1 = 0 * 4 + 2 = 0 * 4 + 0 quindi 152 10 = 2120 4 -> -> -> -> -> resto resto resto resto resto 0 2 1 2 0 -> -> -> -> -> "a" "b" "c" "d" "e" = = = = = 0, 2, 1, 2, 0, ... ricordiamo che era: 152 = 230 10 8 verifica (da ottale in base 4, passando per il binario): 2 3 0 = 010 011 000 = 0 10 01 10 00 = 2120 8 2 2 4 esercizi: 94 calcolare 11011 + 110111 in base 2 <<< quanto fa 322 + 123 in base 4 ? quanto fa 322 + 123 in base 5 ? <<< quanto fa 304 + 552 in base 6 ? calcolare 701 + 77 in base 8 calcolare 1202 x 22 in base 3 <<< esercizi: calcolare 11 011 + 110 111 in base 2 1 1 0 1 1 addendo 1 1 0 1 1 1 addendo ------------ passo 1 1 0 1 1 0 0 somme1 1 1 1 riporti1 1 0 1 1 0 0 somme2 1 1 1 riporti2 ------------ passo 2 0 0 1 0 1 0 somme3 1 0 0 1 0 0 riporti 3 0 0 1 0 1 0 somme3 1 0 0 1 0 0 riporti 3 ------------ passo 3 1 0 0 0 0 1 0 somme4 1 riporti4 1 0 0 0 0 1 0 somme4 1 riporti4 ------------ passo 4 1 0 1 0 0 1 0 somma finale riporti finali verifica: 110112 = 16+8+3=2710 ; 110 111 = 32+16+7=5510 ; 27+55= 8210 ; 8210 = 64+16+2=1 010 010 95 esercizi: 96 quanto fa 322 + 123 in base 4 ? 322 1 2 3 (n.b: 2+3=11) | -----| in breve: 0 0 1 somme parziali | 3 2 2 1 1 1 riporti | 123 -----| ------1 1 1 0 somma finale | 1 1 1 1 quanto fa 322 + 123 in base 5 ? in breve: 322 123 -----1000 esercizi: 97 quanto fa 304 + 552 in base 6 ? 304 552 1300 Ricorda (parto dalla colonna a destra): 4+2 = 610 , quindi 106 , scrivo cifra 0 riporto 1 0+5+1 = 610 , quindi cifra 0 e riporto 1, 3+5+1=910 = 136 , scrivo cifra 3 riporto 1 0+0+1=110 = 16 , e abbiamo finito verifica: 3046 = 3*36+4 = 108+4=11210; 5526=5*36+5*6+2=180+30+2=21210; quindi 11210+21210 = 32410 = 1*216+ 3*36+0*6+0*1 = 13006 esercizi: 98 calcolare 701 + 77 in base 8 701 77 1000 (7018 = 7*6410 +1 = 44810 +1=449; 77 = 8*7+7 = 56+7 = 6310, 44910+6310 = 51210 = 10008 ) calcolare 1202 x 22 in base 3 1 3 9 27 81 243 .. 1 8 64 512 4096 (0, 3, 6, 9, 12 bit) 1202x22 10111 10111 111221 verifica: 12023=27+2*9+2=4710; 223=6+2=810; prodotto: 47*8= 37610 376:3=125,r 1; 125:3=41,r 2; 41:3=13,r 2; 13:3=4,r 1; 4:3=1,r 1; 1112213 =1*243+1*81+1*27+2*9+2*3+1=243+81+27+18+6+1=37610 esercizi 99 verificare: 1a) 1984 (base 10) 1b) = 2201111 (base 3) = 3700 (in base 8) 2) 2576 in base 8 = 010101111110 (in base 2) 3) 14 + 15 4) C*D = = 31 (base 8) 9C (base 16) (segue soluzione) 1a) 1984 (base 10) = 2201111 (base 3) 1984/3 = 661 resto 1 18 04 661/3 = 220 resto 1 1 6 01 220/3 = 73 resto 1 10 1 73/3 = 24 resto 1 13 1 24/3 = 8 resto 0 0 8/3 = 2 resto 2 verifica: 2 2201111 3 vale in base 10: 2/3 = 0 resto 2 (((((2*3+2)*3+0)*3+1)*3+1)*3+1)*3+1= (((( 8*3+0)*3+1)*3+1)*3+1)*3+1= ((( 24*3+1)*3+1)*3+1)*3+1= ((73*3+1)*3+1)*3+1 = (220*3+1)*3+1 = 661*3+1= 1983+1 = 1984 100 esercizi 101 1b) 1984 (base 10) = 3700 (in base 8) 1984/8 = 248, resto 0 38 64 248/8 = 31, resto 0 0 31/8 = 3, resto 7 3/8 = 0, resto 3 Verifica: 3*8^3 + 7*8^2 +0 +0 = 3*512 + 7*64 = 1536 + 448 = 1984 esercizi 2) 2576 in base 8 102 = 010101111110 (in base 2) basta espandere le cifre ottali in gruppi di 3 bit, Ricordando la tabellina di corrispondenza binario - ottale: 0 1 2 3 4 5 6 7 000 001 010 011 100 101 110 111 da cui: 2 5 7 6 010 101 111 110 che e' il risultato richiesto .. esercizi 3) 14 + 15 = 103 31 (base 8) .. ricorda la tabella di addizione -------------------------- da cui: 0|0 1 2 3 4 5 6 7 14 1 | 1 2 3 4 5 6 7 10 + 1 5 2 | 2 3 4 5 6 7 10 11 -----3 | 3 4 5 6 7 10 11 12 21 4 | 4 5 6 7 10 11 12 13 <-1 5 | 5 6 7 10 11 12 13 14 -----6 | 6 7 10 11 12 13 14 15 31 7 | 7 10 11 12 13 14 15 16 verifica: 148+158=1210+1310=2510 = 318 8 9 10 11 12 13 14 15 16 10 11 12 13 14 15 16 17 20 17 18 19 20 21 22 23 24 25 21 22 23 24 25 26 27 30 31 esercizi 104 4) C * D = 9C (base 16) C = 12 D = 13 (ricorda: A=10, B=11, C=12, D=13, E=14, F=15) 12 * 13 = -------12 36 -------156 10 = 15610, divido ripetutamente per 16: 156/16 = 9 (16*9= 144, 156-144=12=resto=C) 9/16=0, resto 9, quindi 15610 = 9C16 frazioni FRAZIONI: 3,14 10 = xxxx,yyyyyyy k in base k 0,0005 10 = aaaa,bbbbbb k in base k 2007,9797 10 = cccc,dddddd k in base k 105 FRAZIONI 106 conversione di FRAZIONI Cosa significa / come si interpreta in base 4 : 2321,0222 Oppure: come si trasforma la codifica 39,71 da base 10 in base generica ? FRAZIONI nota: il significato delle cifre dopo la virgola in base B e' il contributo al valore complessivo dato dal prodotto della cifra volte il peso associato alla posizione: i pesi sono ora 1/(potenza della base): 0,abcde... in base B rappresenta il numero: a b c d e --- + --- + --- + --- + --- + ... B B^2 B^3 B^4 b^5 107 FRAZIONI Cambio base: 29,45 = 29 + 0,45 per cambiare base trasformo separatamente la parte intera e separatamente la parte fratta: Per la parte intera sappiamo gia' come fare 29 (base 10) = xxx (base b) Per la parte fratta: 0,45 = 0,abcdef... in altra base b ? 108 FRAZIONI 109 Per la parte fratta: 0,45 = 0,abcdef... in altra base b ? ricorda la definizione: 0,45 = 4/10 + 5/100 ... e : 0,abcde in base b significa ovviamente a/10 + b/100 + c/1000 + d/10000 + e/100000 essendo 10, 100, 1000 ecc espressi nella nuova base, ovvero b, b^2, b^3, ecc FRAZIONI 110 Ancora: 0,5 in base 10 vale 0,1 in base 2 (un mezzo) -- ovvero: 5/10 (base 10) = 1/2 in base 10 = 1/10 (base 2) quindi 0,510 = 0,12 Ancora: 0,125 in base 10 = 1/8 in base 10 = 1/100 in base 2 quindi 0,12510 = 0,0012 conversione di base per frazioni 111 0,45 = 0,abcdef... conversione da base 10 a base 5 se moltiplico entrambe le parti per b : 0,45 * 5 = 0,abcdef... * 5 ottengo: 2,25 = a,bcdef... devono essere separatamente uguali la parte intera e la parte fratta, quindi 2 = a ottengo la prima cifra della parte fratta moltiplicando il dato di partenza (in base 10) per la base nuova b (qui cinque); ripeto con solo la parte fratta: 0,25 * 5 = 0,bcdef * 5 ottengo: 1,25 = b,cdef... e quindi 1=b FRAZIONI 0,4510 = 0,abcdef... b da base 10 ad altra base b procedimento per calcolare le cifre abcdef... della parte fratta nella nuova base: moltiplico entrambe le parti per b 0,xxx * b = 0,abcdef... * b ottengo a sinistra e a destra una cifra intera, y,zzz = a,bcdef... devono essere uguali sia la parte intera che la parte fratta, separatamente, quindi ottengo la prima cifra della parte fratta ! y = a ... e poi ripeto ... 112 conversione di base per frazioni 0,45 = 0,abcdef... conversione da base 10 a base 5 moltiplico ripetutamente entrambe le parti per b, ad ogni passo ottengo una cifra della parte fratta in base b, e poi ripeto con solo la parte fratta rimasta: 0,45 * 5 = 0,abcdef... * 5 ottengo: 2,25 = a,bcdef... quindi a = 2; ripeto: 0,25 * 5 = 0,bcdef... * 5 ottengo: 1,25 = b,cdef... e quindi b = 1; ripeto: 0,25 * 5 = 0,cdef... * 5 ottengo: 1,25 = c,def... e quindi c = 1; ripetendo, 0,4510 = 0,211111... 5 in base 5 (periodico) 113 conversione di base per frazioni 114 2) esempio: trasformare 0,71 da base 10 in base 5, cioe' trovare le cifre a,b,c,d,... della parte fratta in base 5. 0,71 = 0,abcdefg.. ==>> moltiplico ripetutamente per 5: / in base 10 \ / parte in base 5 \ 0,71 * 5 = 3,55 = a,bcdefg... quindi a = 3 0,55 * 5 = 2,75 = b,cdefg.... quindi b = 2 0,75 * 5 = 3,75 = c,defg..... quindi c = 3 0,75 * 5 = 3,75 = d,efg...... quindi d = 3 (periodico) quindi 0,7110 = 0 , 3 2 3 3 3 35 cioe' 7 1 3 2 3 3 --- + --- = --- + --- + --- + --- + ... 10 100 5 25 125 625 nota: spesso ottengo un numero periodico nella nuova base! conversione di base per frazioni 115 3) es.: trovare la rappresentazione di 0,45 (dato in base 10) in base 8, ovvero trovare le cifre a,b,c,d,e,f,g, ... tali che 0,4510 = 0,abcdefg ... 8 Moltiplico per la base nuova ripetutamente ParteFratta 0,45*8 0,6 *8 0,8 *8 0,4 *8 0,2 *8 0,6 *8 0,8 *8 =3,6 =4,8 =6,4 =3,2 =1,6 =4,8 =6,4 = = = = = = = a,bcdefg-> b,cdefg... c,defg... d,efg... e,fg... f,g... g,... la sequenza 4 6 3 1 si ripete, quindi: 0,45 (base 10) = 0,3 4631 4631 4631 ... a=3 b=4 c=6 d=3 e=1 f=4 g=6 nota sul cambio di base 116 Entrambi i procedimenti di conversione (parte intera e parte fratta) sono basati sul fatto che: dividere (o moltiplicare) per la base b significa spostare la virgola (di base b) di una posizione a sinistra (o a destra) (come ovvio in base 10); Esempi in binario: 11 x 10 = 110 (3 x 2 = 6) 101 x 10 = 1010 (5 x 2 = 10) 110 x 10 = 1100 (6 x 2 = 12) 111 x 10 = 1110 (7 x 2 = 14) 1110 : 10 = 111 (14 : 2 = 7) 1010 : 2 = 101 (10 : 2 = 5 ) 1000 : 10 = 100 (8 : 2 = 4) ecc Note sul cambio base 117 Come si scrive 0,1 (base dieci) in base due? ovvero - se scrivo 1/10 in base due, lo scrivo in forma di somma di termini 1/( 2^n ), con n=1,2,3,4, ovvero: 1/10 = a/2 + b/4 + c/8 + d/16 + … quanto valgono a, b, c, d ecc? vediamo … 118 come si scrive 1/10 (decimale) in base due? 0,110 = 0,abcde...2 dalla definizione, per la prime cifre della frazione: 1) moltiplico la equazione di sopra per due, e ottengo (ricorda: moltiplicare per la base 2 significa spostare la virgola binaria di una posizione a destra) 0,2 = a,bcde devono essere separatamente uguali parte intera qui zero, e quindi a=0, e la parte fratta, e quindi resta: 0,2 = 0,bcde 2) ripeto per la parte fratta residua: moltiplico per due e ho: 0,4 = b,cde devono essere separatamente uguali parte intera quindi b=0, e la parte fratta: 0,4 = 0,cde 0,110 = 0,abcde...2 per la prime cinque cifre della frazione: 1) moltiplico la equazione di sopra per due, e ottengo 0,2 = a,bcde separatamente uguali parte intera quindi a=0, e parte fratta, e quindi resta 0,2 = 0,bcde 2) ripeto per la parte fratta residua: moltiplico per due e ho: 0,4 = b,cde devono essere separatamente uguali parte intera quindi b=0, e la parte fratta: resta 0,4 = 0,cde 3) 0,4*2=0,8 c=0, resta 0,8 = 0,def.. 4) 0,8*2=1,6 d=1, resta 0,6 = 0,ef.. 5) 0,6*2=1,2 e=1, resta 0,2 = 0,f... quindi le prime cinque cifre sono abcde = 00011 0,110 = 0,a bcde = 0,0 00112 rimane da calcolare 0,2 = 0,fghi che e' la stessa situazione di 0,2 = a,bcde 119 quindi 1/10 (decimale) in base due con moltiplicazioni per due ripetute: 0,1= 0,abcdefghi... 1) 2) 3) 4) 5) 6) 7) 8) 9) 0,1*2=0,2 0,2*2=0,4 0,4*2=0,8 0,8*2=1,6 0,6*2=1,2 0,2*2=0,4 0,4*2=0,8 0,8*2=1,6 0,6*2=1,2 a=0, b=0, c=0, d=1, e=1, f=0, g=0, h=1, i=1, resta resta resta resta resta resta resta resta resta 0,2= 0,4= 0,8= 0,6= 0,2= 0,4= 0,8= 0,6= 0,2= 120 0,bcdefghi 0,cdefghi 0,defghi.. 0,efghi... 0,fghi... 0,ghij... 0,hijk... 0,ijkl... 0,jklm... 0,110=0,a bcde fghi jklm 0,110=0,0 0011 0011 00112 la sequenza 0011 si ripete all'infinito (frazione periodica), e quindi 0,110=0,0 0011 0011 0011 0011 0011 0011 ..2 come si scrive 1/10 (decimale) in base due? abbiamo visto come si ricava 0,1 = 0,abcdefghi... 0,110= 0,0 0011 0011 0011 0011 0011 00112 con 5 addendi (approssimazione di 1/10 con 5 bit): 0.1=1/10 (base10) = 0/2 + 0/4 + 0/8 + 1/16 + 1/32 + trascuto i termini seguenti + 0/64+0/128 + 1/256 + 1/512 + 0/1024 + 0/2048 + 1/4096+.. e quindi 0/1010 = 0,000112 (approssimazione a 5 cifre) -> 0,000112 = 0,0625 + 0,03125 + 0,00390625 + 0,001953125 + + 0,00024414062 = 0,0998535...10 che e' DIVERSO da 0,1 ! 121 come si scrive 1/10 (decimale) in base due? 122 passando da base 10 a base 2 la frazione 0,1 (1/10 in base 10) diventa una frazione periodica ovvero con infinite cifre, 0,110= 0,0 0011 0011 0011 0011 0011 00112 0.1=1/10 (base10) = 1/16 + 1/32 + 1/256 + 1/512 + 1/4096+.. e quindi con 12 cifre binarie della frazione (5 addendi) : 0,000110011001 = 0,0625 + 0,03125 + 0,00390625 + 0,001953125 + 0,00024414062 = 0,099853516 ... non e' 0,110 ! .. e in generale con un numero limitato (es.24 cifre binarie) ottengo una rappresentazione APPROSSIMATA di 0,1 Si noti che 1/10 = 0,1 in base 10 NON e' rappresentabile esattamente in base due con un numero finito di cifre, (si DEVE fare un troncamento -> in ogni caso ho un errore !! ) frazioni Anche la trasformazione opposta, da base generica in base dieci, si basa sulla definizione: es per base 2: dato 0,1011 in base due, 0,1011 = 1/2 + 0/4 + 1/8 + 1/16 ... in base 10, quindi = 0,5 + 0,0 +0,125 + 0,0625 = = 0,6875 in base 10 123 frazioni base 16 - ogni cifra esadecimale usa 4 bit; il numero di bit usati per le potenze di 16: nr.bit 1)1016 = 1610 = 16^1 ......... 4 2)10016 = 25610 = 16^2 ......... 8 3)100016 = 409610 = 16^3 ...... 12 4) 65 536 = 16^4 ........ 16 5) 1048 576, ..... 20 (un mega) 6) 16 777 216, ..... 24 7) 268 435 456, ... 28 8) 4 294 967 296, ... 32 (4 giga) per scrivere un valore di 4G devo usare 32 bit (un indirizzo di 4G usa 32 bit; per indirizzi oltre 4G devo usare piu' di 32 bit -> 64 bit; ritorneremo su questo in HW 124 conversione di frazioni: da base 16 a base 10 es 0,5A5116 (4 cifre esadecimali = 16 bit) = 5/1610 + 10/25610 + 5/409610 + 1/6553610 = 0,312510 + 0,039062510 + 0,001220703110 + 0,000015258789..10 = 0,35278320312.. 10 ( se converto da base 16 a base 10 un numero con k cifre (k limitato) - il numero di cifre del risultato in base 10 e' finito o no? ;-) 125 frazioni 126 quando si converte una frazione con un n umero di cifre limitato da base generica a base dieci, il calcolo da fare e' la somma di termini del tipo k/(bn) dove 1/(bn) in genere NON e' rappresentabile con un numero di cifre finito in base 10, es. banale: 0,1 3 = 1/3 = 0,33333...10 ..................................... MA per le basi 2,4,8,16, ecc. il numero 1/x = (con x=b^n) = = 1/(b^n) ( con b = 2 oppure 4 oppure 8 ecc ) e' sempre rappresentabile esattamente con un numero di cifre finito ... basti pensare alla sequenza 0,5 0,25 0,125 0,0625 0,03125 ecc frazioni 127 nota: una frazione con un numero fisso di cifre in binario si converte sempre in una frazione in decimale con un numero di cifre limitato, perche' 1/(2 k) ovvero ½, ¼, 1/8, 1/16, 1/32 ecc hanno un numero di cifre decimali limitato: 1/2 0,5 1/512 0,001953125 1/4 0,25 1/1024 0,0009765625 1/8 0,125 1/2048 0,00048828125 1/16 0,0625 1/4096 0,000244140625 1/32 0,03125 1/8192 0,0001220703125 1/64 0,015625 1/16384 0,00006103515625 1/128 0,0078125 1/32768 0,000030517578125 1/256 0,00390625 1/65536 0,0000152587890625 .... 1/2n 0,00000000..abcd..gh25 limiti rappresentazione dei numeri NEL calcolatore: i limiti dei formati standard (fissi) 128 rappresentazione di numeri 129 nel calcolatore i codici per rappresentare i numeri sono in generale fissi – questo perche' le celle di memoria centrale dove sono memorizzati i numeri (quando usati da un programma) sono a formato fisso (ad es. 16 bit, 32 bit, 64 bit) e i circuiti che eseguono le operazioni aritmetiche (sia per interi che per virgola mobile) sono a formato fisso; seguono due pagine di richiamo di nozioni sulla memoria centrale e sull' unita' centrale, che saranno trattate meglio in seguito... rappresentazione di numeri 130 memoria: insieme di celle ( o voci ) numerate: ciascuna ha - un indirizzo (numero della cella) (indirizzi da 0 a max, numeri da N bit, gli indirizzi oggi (2006) arrivano oltre il Gbyte, sono numeri a 16 bit (anni 80) poi 32 bit ('90), oggi a 64 bit, che permette di contare oltre 10 18 (miliardo di miliardi) !! e un contenuto = valore o codice del dato memorizzato nella cella: K bit, dove K e' una potenza di 2: 8 (8bit=1byte), 16, 32, 64 bit: questo e' fisso per tutte le celle del calcolatore; la circuiteria elettronica che gestisce la memoria svolge la funzione di accesso alla memoria: leggi un dato ( di K bit) dalla cella di memoria di indirizzo I (di N bit) scrivi un dato ( di K bit) nella cella di memoria di indirizzo I (di N bit) rappresentazione di numeri l'UC esegue le istruzioni dei programmi la parte dell'unita' centrale che esegue le operazioni aritmetiche (+ - * /) e' detta unita'aritmetica, ed e' quasi sempre sdoppiata in * unita' per aritmetica intera * unita' per aritmetica in virgola mobile entrambe le unita' aritmetiche hanno i canali (bus) di ingresso dati e di uscita dati (risultati) a formato fisso, ad es. 32 oppure 64 bit (ma anche piu', 80 bit, 128 bit) ==>> i dati interi e in virgola mobile sono a formato fisso (quasi sempre) 131 rappresentazione di numeri 132 agli inizi sono stati usati sistemi di codifica di numeri di tipo diverso : * per soddisfare le esigenze di calcolo scientifico e * e per soddisfare le esigenze delle applicazioni commerciali: per il calcolo scientifico furono adottati due formati di codifica: numeri interi con segno, es.: +06220716 numeri in virgola mobile con segno, es.: +3,1415927E-0 entrambi a formato fisso (es. sopra, otto cifre) i primi 15 anni esistevano calcolatori con codifica di numeri a lunghezza variabile e HW opportuno per trattarli; oggi esistono codifiche a lunghezza variabile ma sono in generale gestite da software; 133 rappresentazione di numeri * per esigenze delle applicazioni commerciali esistono linguaggi di programmazione e sistemi software con codifica di numeri a lunghezza variabile, di tre tipi: interi numero alberi (pini) davanti l'edificio C0 (Tutankamen): uno; numero anni galera per falso in bilancio: 0 numero esami di fondamenti di informatica 1 nel 2007: 91 numero lingue ufficialmente riconosciute: 5000 numero testate atomiche USA+Russia+Cina+GB+Francia+Israele al 2002: 10500 numeri con virgola fissa es: indennità mensile (netto) di un senatore in Italia +diaria+rimborsi: 12.138,30 euro deficit bilancia imp/exp al luglio 05 degli USA : 59 500 000 000 , 00 $ numeri con virgola mobile velocita' della luce : 299792,458 km/sec ("grande") massa elettrone: 9.10938188 × 10-31 kilo ("piccolo") rappresentazione di numeri 134 nel calcolatore i codici per rappresentare i numeri sono in generale a formato fisso: il formato fisso impone dei limiti ai codici utilizzabili e quindi all' insieme di numeri rappresentabili l' insieme dei numeri rappresentabili (interi e in virgola mobile) e' limitato i numeri fuori dei limiti NON sono rappresentabili ! un'operazione aritmetica che produce un valore fuori di questi limiti da'un errore di overflow/traboccamento (il programma si blocca per errore di aritmetica floating, rilevato HW "eccezione o interrupt") rappresentazione di numeri - casi particolari : talvolta e’ richiesta una rappresentazione esatta dei numeri, qualunque sia il loro valore es. bilancio di una ditta (pubblico o riservato) devo rappresentare i dati esattamente ... che sono appunto tipiche applicazioni commerciali : per molte applicazioni di tale tipo la rappresentazione dei numeri non e' a formato fisso, ma con sequenze di cifre di lunghezza non fissa, delimitate con codici particolari … (es. Linguaggio di programmazione Cobol) alcuni calcoli tecnico/scientifici particolari richiedono una numero di cifre molto grande (illimitato in pratica): l'aritmetica in tal caso e' gestita a livello SW. 135 rappresentazione di numeri 136 altri esempi di dati di tipo intero: *numero abitanti di Villalta di Porpetto, *numero abitanti di Cheng-du (Cina), *paga operaio di 9 anni di una fabbrica Nike in Marocco, *numero studenti del corso di fondam. di inform. del 1996, *numero CD della biblioteca comunale del popolo di Udine, *ammontare di una consulenza dell’ avvocato Schwindler, *patrimonio complessivo di Bill Gates (in dollari), *numero dei granelli di sabbia della riviera di Lignano, ... vediamo ora " un altro tipo di dati " ... rappresentazione di numeri in molti casi interessa di un dato ** solo un certo numero di cifre di un dato tipicamente per grandezze che hanno orgine da misure tecniche o scientifiche, ad es. * distanza terra - luna, (precisione di 10 cifre) oppure * diametro cilindro della moto Honda Goldwing (precisione di 4 cifre, al 1/100 di mm) * quantita’ media di birra e di caffe’ (bevuta da un tedesco medio) precisione di 2 cifre ** e l’ordine di grandezza ... in unita' di misura appropriate, come anni luce, chilometri, millimetri, piedi, pollici, klaftre, galloni, barili, miglia marine, 137 rappresentazione di numeri Per dati che hanno origine da misure (direttamente o attraverso calcoli) viene usato il formato in virgola mobile (*) che specifica le cifre e l'ordine di grandezza con due interi separati: +3,14159265 E+00 dove i due numeri interi hanno un formato fisso (k1 e k2 cifre, qui k1=9 cifre e k2=2 cifre) ------------------------------------------------------------------------------------------------------------- (*) formato in virgola fissa significa un intero che rappresenta anche cifre decimali, ad es.: dati di 15 cifre: 00001 234 56 00000 rappresenta 1234, 56 00123 456 78 91230 rappresenta 123456,7891230 09999 999 00 00000 rappresenta 9999999 00000 000 00 23456 rappresenta 0,0023456 era usato nelle macchine calcolatrici elettromeccaniche 138 rappresentazione di numeri tutte queste esigenze hanno risposte oggi standard nell’ambito della rappresentazione di numeri all’interno del calcolatore, e nei limiti di queste rappresentazioni. altri es numero soci della Miracle.com 30.402.002,0 (unita') altezza del tavolo 82,5 centimetri (valore approssimato a 3 cifre) lunghezza delle coste marine italiane 9,532543E+3 chilometri ( ... falso, non so il valore vero;-) valore di pi 3,14159265E+00 (approssimato a 8 cifre) per capire meglio cos’e’ un oggetto tipo “numero” per il calcolatore, studieremo di seguito i vari sistemi di rappresentazione di numeri. 139 rappresentazione di numeri 140 tutti i dati / tutti i tipi di informazione per il calcolatore si riducono sempre a codici numerici; es.: le immagini fotografiche o televisive o del cinema che tradizionalmente nascono "analogiche" (segnale continuo) e vengono "usate" ancora analogiche si possono trasformare in dati numerici (in formato digitale) analogamente i suoni (di vario genere) si possono codificare numericamente (suono digitale) si noti che la precisione (e quindi la qualita') ottenibile con metodi analogici e' in generale minore rispetto la qualita' di segnali codificati numericamente vedremo ... rappresentazione di numeri 141 tutti i dati / tutti i tipi di informazione per il calcolatore si riducono a codici numerici; es.: gli attributi di un punto dell’ immagine sullo schermo (un elemento dell’immagine = Picture Element = PIXEL) come intensita’ luminosa, tonalita’ di colore, saturazione, oppure intensita’ dei colori primari che lo compongono Rosso, Verde e Blu) sono rappresentabili con valori numerici, un pixel si codifica con "un" numero (una terna di num.) l'immagine sullo schermo e'un insieme di numeri (quanti – dipende dalla precisione immagine, va da 25 x 80 a 480 x 640 (VGA) a 1000 x 1600, 2000 x 3000 ecc ... limiti della codifica nel calcolatore in un calcolatore i numeri sono codificati in binario con un numero fisso di bit (una potenza di 2: 8, 16, 32, 64, 96) e solo un numero limitato di interi e' rappresentabile. Ad esempio, gli interi sono rappresentati con (*) 8 bit, da 0 a 255 oppure da -128 a +127 (in C: short int) (+) 16 bit da 0 a 65 535 oppure da -32 768 a 32 767 (in C: int) 32 bit, da 0 a 4 294 967 295 oppure da -2G a + 2G, (in C: long int) 64 bit, long long int 80 bit ... ecc ________________________________________________________________________________________________ (*) 4 bit: 0..15; 8 bit: 0..255; 10 bit: 0..1023; 12 bit: 0..4095,.. (+) int, short int = nomi di tipi di variabili nel linguaggio di programmazione C 142 limiti della codifica nel calcolatore - esempio: 143 con 4 bit, sono rappresentabili 16 numeri senza segno: 00 00 00 00 00 01 10 11 =0 =1 =2 =3 01 01 01 01 00 01 10 11 =4 =5 =6 =7 10 10 10 10 00 01 10 11 =8 =9 =10 =11 11 11 11 11 00=12 01=13 10=14 11=15 e i numeri da 16 in poi NON sono piu' rappresentabili. se uso sempre 4 bit, un'operazione aritmetica puo' dare un risultato non rappresentabile con tale formato: 1010 + 111 ---------- 10001 ovvero 10 +7 -------- 17 il risultato esce dall' insieme dei numeri rappresentabili, -> errore di troncamento o traboccamento = "overflow" limiti della codifica nel calcolatore 144 Analogamente (o peggio) per le frazioni: ricordiamo solo il numero 1/1010, cioe' 0,110= 0,0 0011 0011 0011 0011 0011 0011...2 0,1=1/10 (base10) = 1/16 + 1/32 + 1/256 + 1/512 + 1/4096+.. e quindi con 12 cifre binarie dopo la virgola ( 5 addendi ) 0,0001 1001 1001 = 0,0625 + 0,03125 + 0,00390625 + + 0,001953125 + 0,00024414062 = 0,099853516 che e' diverso dal dato 0,1 !! con formato fisso di 8 bit la rappresentazione di 0,1 diventa: 0,0001 1001 = 1/16 + 1/32 + 1/256 = 0,0625+ 0,03125+ 0,00390625 = 0,09765625 che e' (ovviamente) anora peggio (piu' diverso da 0,1) ! 145 rappresentazione di numeri con segno RAPPRESENTAZIONE DI NUMERI CON SEGNO con 3 bit rappresento 8 oggetti diversi, (ad esempio con 3 bit posso contare fino a 7, quindi rappresento otto numeri da 0 a 9); finora abbiamo visto la codifica per numeri senza segno, ma posso rappresentare con gli stessi codici anche numeri negativi, di solito si associa la meta' dei codici ai numeri positivi, e meta' dei codici ai numeri negativi: esempio con 2 bit ho: 00 = 0 01 = 1 10 = 2 11 = 3 oppure 00 = 0 01 = 1 10 = -1 11 = -1 146 147 RAPPRESENTAZIONE DI NUMERI CON SEGNO con 3 bit rappresento 8 oggetti diversi, (es.otto numeri); posso rappresentare con gli stessi codici anche numeri negativi, (di solito meta' codici per positivi, meta' per negativi), come in figura: 000 0 000 -4 000 0 000 -1 001 1 001 -3 001 1 001 -2 010 2 010 -2 010 -1 010 -3 011 3 011 -1 011 2 011 -4 100 4 100 0 100 -2 100 0 101 5 101 1 101 3 101 1 110 6 110 2 110 -3 110 2 111 7 111 3 111 4 111 3 senza con con con segno segno/a segno/b segno/c ... in quanti modi posso associare 8 simboli a 8 codifiche? ... in quanti modi posso associare 8 simboli a 8 codifiche? quante codifiche binarie diverse posso avere per 8 simboli ? dati 8 simboli ( a, b, c, d, e, f, g, h ), dati 8 codici binari a 3 bit, es. ( 111 110 101 100 011 010 001 000 ) posso associare al primo simbolo a uno qualunque dei 8 codici a 3 bit, ad es. a = 011 (A) (8 scelte possibili); al secondo simbolo posso associare uno qualunque dei 7 codici rimasti, ad es. b = 110 (B) in totale per i primi due simboli posso fare 8*7 scelte per le due codifiche: a, b, c, d, e, f, g, h (A) (B) 111 110 101 100 011 010 001 000 148 ... in quanti modi posso associare 8 simboli a 8 codifiche? 149 dati 8 simboli ( a, b, c, d, e, f, g, h ), dati 8 codici binari a 3 bit, ( 111 110 101 100 011 010 001 000 ) posso associare al primo simbolo "a" uno qualunque dei 8 codici a 3 bit, ad es. a = 011 (8 scelte possibili); al secondo simbolo "b" posso associare uno qualunque dei 7 codici rimasti, ad es. b = 110, (7 scelte); al terzo simbolo "c" posso associare un codice dei 6 codici rimasti, es. c= 000 (6 scelte) poi 5 scelte per il quarto, 4 scelte per il quinto simbolo, in totale per 8 simboli posso fare 8*7*6*5*4*3*2*1 scelte; per 8 simboli con un codice a 3 bit posso fare 8 ! (8 fattoriale) scelte, cioe' 40320 scelte. Codifica numeri interi con segno 150 Dati 8 codici binari posso scegliere 8! modi per usarli nella rappresentazione di 8 numeri interi con segno, meta' positivi e meta' negativi (qui 5 dei 8! = 40320 possibili codici diversi ) codice num1 num2 num3 num4 num5 … 0 1 2 3 4 5 6 7 000 001 010 011 100 101 110 111 -3 -2 -1 -0 +1 +2 +3 +4 -4 -3 -2 -1 0 1 2 3 3 2 1 0 -1 -2 -3 -4 0 0 1 -0 2 1 3 -1 -3 2 -2 -3 -1 3 -0 -4 cont. RAPPRESENTAZIONE DI NUMERI CON SEGNO 151 per rappresentare numeri negativi con n bit (ad es. 4 bit), uso delle regole convenzionali di rappresentazione; caso piu' semplice: un bit per il segno, il resto rimane uguale; 2 possibilita’: rappresento segno meno con bit 1 o con bit 0: 000 0 +0 -0 001 1 +1 -1 RAPPRESENTAZIONE : 010 2 +2 -2 GRANDEZZA CON UN BIT 011 3 +3 -3 PER IL SEGNO 100 4 -0 +0 101 5 -1 +1 questa codifica non e’ usata ;-) 110 6 -2 +2 (richiede una logica piu' complicata 111 7 -3 +3 per la realizzazione circuitale) vediamo ora le 3 codifiche piu’ usate per i numeri con segno: complemento a uno, complemento a due, con eccesso di 2^(k-1) numeri con segno : il complemento a uno 0 1 2 3 4 5 6 7 000 001 010 011 100 101 110 111 +0 +1 +2 +3 -3 -2 <--1 -0 152 RAPPRESENTAZIONE DI NUMERI CON SEGNO IN COMPLEMENTO A UNO QUI CON 3 BIT + 1 BIT SEGNO in complemento a uno la codifica di un numero negativo si ottiene scambiando uni e zeri, rango per rango, ovvero facendo il complemento bit per bit: codice di +2 = 0 10 -->> cod.di -2 = 1 01 dove il primo bit e’ il bit del segno, gli altri codificano il num numeri con segno : il complemento a uno in complemento a uno la codifica di un numero negativo si ottiene scambiando uni e zeri, rango per rango, ovvero facendo il complemento bit per bit: il primo bit e’ il bit del segno, gli altri codificano il numero 0 1 2 3 4 5 6 7 000 001 010 011 100 101 110 111 +0 +1 +2 +3 -3 -2 <--1 -0 codice +2 = 0 10 codice -2 = 1 01 codice +3 = 0 11 codice -3 = 1 00 153 numeri con segno : il complemento a uno 154 in complemento a uno: -x e' rappresentato con il complemento di x bit per bit, cioe' da: (2 n -1) -x (*) -5 in un codice a 4 bit in complemento a uno e’ dato da: (24 -1) -x = (16-1 -5) = (15 - 5)10 = (10000 - 1)2 - 1012 = 1111 - 0101 = 1010 = complemento bit per bit di 0101 -3 in un codice a 4 bit in complemento a uno e’ dato da: (24-1) - x = (10000 -1 ) -3 = 1111 - 0011 = 1100 da cui la tabella gia’ vista.. (*) nota: se uso n bit, 2 n non e’ rappresentabile ad es. se uso 3 bit, 2 3 = 8 = 1000 non e’ rappresentabile; il numero piu’ grande rappresentabile con n bit e’ 2n -1, che e' il codice con tutti i bit messi a 1 !! ad es. con 3 bit e’ 111 = 1000 - 1 = 8 - 1=7 ) numeri con segno : il complemento a uno complemento a uno: -x e' rappresentato con il compl. di x bit per bit, cioe' -x e’ rappresentato da (2 n -1) - x = 11..11 - x es -5 codifica con 4 bit in complemento a uno: (2 4 -1) -x = (10000 - 1) - 5 = 1111 - 0101 = 1010 0 1 2 3 4 5 6 7 0 0 0 0 0 0 0 0 000 001 010 011 100 101 110 111 +0 +1 +2 +3 +4 +5 +6 +7 | | | | | | | | 1 1 1 1 1 1 1 1 111 110 101 100 011 010 001 000 -0 -1 -2 -3 -4 -5 -6 -7 si noti: la codifica e’ simmetrica, i numeri rappresentabili con 4 bit vanno da -7 a +7, vi sono due codifiche dello zero! 155 numeri con segno : il complemento a uno con 4 bit (numero bit n=4) ho: 0 0 000 +0 | 1 111 -0 1 0 001 +1 | 1 110 -1 ... .. | ... .. 6 0 110 +6 | 1 001 -6 7 0 111 +7 | 1 000 -7 [n = 4, n-1 = 3 bit per il dato -> per i positivi da 0 a 7, per i negativi, da - 0 a - 7] in generale in complemento a uno con n bit rappresento i numeri da - (2n-1-1 ) a + (2n-1-1 ) il num. piu’ positivo x ha il codice (2n-1-1 ) = 23 -1 = 1000-1 = 0111 = 7, il numero piu’ negativo -x e’ rappresentato (ha il codice) da ( 2n -1 - x) = ( (2n -1) - (2n-1 - 1 )) = (2n-1 +2n-1 -1) - (2n-1 -1 )) = = 2n-1 + 2n-1 -1 - 2n-1 + 1 = 2n-1 -1 +1 = = 2n-1 = ( se n=4) = 8 = 1000 = rappresentazione di -7... 156 numeri con segno : il complemento a uno 157 il codice (complemento a uno) di un dato negativo e' dato dai bit del dato (positivo), complementati uno per uno: 0110 sei, 1001 meno sei, 0101 cinque, 1010 meno cinque questo codice permette di fare l' ARITMETICA di numeri con segno in modo semplice : 3 - 4 = -1 in codice binario con complemento a uno? la rappresentazione in complemento a uno e' consistente con le operazioni di aritmetica, ovvero posso sommare i codici di un numero positivo e di un numero negativo e ottenere il codice corretto del risultato. vi sono tre casi da considerare a seconda dei riporti riguardo il bit del segno (nessuno, uno, due riporti) ... vediamo ... aritmetica in complemento a uno 158 la rappresentazione in complemento a uno e' consistente con le opera- zioni di aritmetica: si sommano i codici dei numeri con segno e e si ottiene il codice corretto del risultato: due casi senza riporto al- o dal- bit del segno: 1) caso di risultato positivo 3+2 = +5 0011 3 0010 2 -------- -0101 5 ------------------------------------------------------------------------------------------------------------- 2) caso di risultato negativo 3+ [(24-1)-4]= (24-1)-1 = che e' la codifica di -1 3-4 = -1 0011 3 1 0 1 1 -4 -------- -1 1 1 0 -1 159 numeri con segno : il complemento a uno aritmetica numeri con segno, caso con 2 riporti al/dal segno: 3) caso di risultato positivo 7-4=3 nota: codice di -4 = 24-1 –4 = 1111-0100 Quindi (24-1) + 7-4 = 24 -1 + 3 = 1 24 + 2 => c'e' un riporto a sinistra, dal bit del segno, il riporto si somma a destra, ultimo rango a destra, con la correzione otteniamo 1+2 = 3 0 1 1 1 1 0 1 1 ------0 0 1 0 7 -4 -2 + 1 ------1 1 +1 -3 nota che c'e' un riporto anche NEL bit del segno: vi sono due riporti ! numeri con segno : il complemento a uno 160 3) ancora: caso di risultato positivo 5 - 3 = 2 0 1 0 1 1 1 0 0 ------1 0 0 0 1 1 -------1 0 5 -3 -+1 +1 -2 SOMMA DI NUMERI IN COMPLEMENTO A UNO:se vi sono due riporti, uno al bit del segno e uno dal bit del segno, il riporto da sinistra (dal segno) si somma a destra 161 numeri con segno : il complemento a uno 4) caso di risultato negativo, senza riporti: 4-6=-2 se il risultato e' negativo, e non vi sono riporti ne' nel bit del segno, ne' dal bit del segno, 0 1 0 0 1 0 0 1 ------1 1 0 1 allora otteniamo il risultato direttamente dalla somma dei due codici 4 -6 --2 162 5) caso di risultato negativo, due riporti: -1-5 = codici di –1 e –5 in complemento a uno: [(24-1)-1]+[(24-1)-5]= [24+(24-1)-7 ] = il riporto da sinistra si somma a destra -1 -5 = -6 1 1 1 0 1 0 1 0 ------1 1 0 0 0 +1 --------1 0 0 1 -1 -5 --7 +1 --6 numeri con segno : il complemento a uno nella somma di due numeri con segno codificati in complemento a uno si hanno le regole seguenti (regole realizzate dai circuiti elettronici dell'unita' aritmetica) * nessun riporto nel / dal bit del segno ok, niente da aggiustare * due riporti (nel/dal bit del segno) ok, e il riporto fuori del segno a sinistra si somma a destra (rango delle unita') e se c'e' un solo riporto (dal bit del segno oppure nel bit del segno) in tal caso il risultato NON e' corretto, c'e' un errore di trabboccamento (overflow) vediamo questi casi di risultato errato ... 163 numeri con segno : il complemento a uno 164 7) caso di overflow,dove il risultato NON e’rappresentabile(un solo riporto al segno) 5 6 -11 0 1 0 1 0 1 1 0 ------1 0 1 1 risultato si legge 5+6= -4 [[un solo riporto verso il bit segno -> errore di traboccamento->overflow]] 8) caso di overflow -5 -6 ---11 1 0 1 0 1 0 0 1 -------1 0 0 1 1 [[un solo riporto dal bit del segno -> errore di overflow ]] si ottiene: -5-6 = 3 numeri con segno, complemento a uno: riassumendo, la codifica dei numeri con segno in complemento a uno (num.negativi rappresentati dal codice dei numeri positivi complementando i bit uno a uno) e' un codice consistente con le operazioni aritmetiche, ed e' un codice simmetrico rispetto lo zero: +6 codice 0 110 due zeri: +0 0 000 -6 codice 1 001 -0 codice 1 000 limiti simmetrici, per positivi e per negativi, da 0 a (2^(n-1)) -1 , con n=4 bit il limite e' (2^3-1) cioe': +7 0 111 -7 codice 1 111 165 numeri con segno, complemento a due: una codifica oggi piu' usata: numeri con segno in complemento a due: e' simile alla codifica in complemento a uno, ma con i codici spostati di una posizione e con un solo codice per lo zero; la rappresentazione di un numero negativo in complemento a due e’ data dal complemento bit per bit, e poi sommando uno: +6 -6 codice di +6 e' 0 110, codice di -6 e' 1 001 +1 = 1 010 166 numeri con segno, complemento a due: 167 un primo esempio con 3 bit per il codice con segno (un bit per il segno, due bit per il dato) codifica in compl.a uno | CODICE IN COMPLEM.A DUE: 0 1 2 3 4 5 6 7 000 001 010 011 100 101 110 111 +0 +1 +2 +3 -3 -2 -1 -0 | | | | | | | | 000 001 010 011 100 101 110 111 +0 +1 +2 +3 -4 -3 -2 -1 <-- <-- la rappresentaz.e di un num. negativo in complemento a due e’ data dal complemento bit per bit, e poi sommando uno: +2 = 0 10 -> cod.di -2 = 1 01 +1 = 1 10 = il primo bit e’ il bit del segno, gli altri codificano il numero +3 = 0 11 -> cod.di -3 = 1 00 +1 = 1 01 = -2 -3 RAPPRESENTAZIONE IN COMPLEMENTO A DUE 168 rappresento -x in complemento a due con (2 n - x ) (*) ad es: -5 e' rappresentato da (24-5) = (10000 - 101) = ((10000 -1) +1 -101 ) = (1111 - 101 +1) = 1010 + 1 = 1011 un dato negativo in complemento a due si rappresenta con il codice: { [complemento bit per bit del dato] + uno }. -5 codice ( complemento a uno: +5 e' 0101 quindi –5 e' 1010 ) codice in complemento a due: 1010+1 = 1 011 _____ (*)ricorda codice di –x in complemento a uno (2 n-1)-x RAPPRESENTAZIONE IN COMPLEMENTO A DUE 169 complem. a due: -x e’ rappresentato da 2 n -x = 100..00 - x -5 con 4 bit 2 4 -x = 10000 - 0101 = 1011 0 1 2 3 4 5 6 7 0 0 0 0 0 0 0 0 000 001 010 011 100 101 110 111 +0 +1 +2 +3 +4 +5 +6 +7 | | | | | | | | 1 1 1 1 1 1 1 1 111 110 101 100 011 010 001 000 -1 -2 -3 -4 -5 -6 -7 -8 si noti: la codifica non e’ simmetrica, i num. rappresentabili vanno da -8 a +7, e c'e' una codifica dello zero! RAPPRESENTAZIONE IN COMPLEMENTO A DUE 170 ripetendo ... caso rappresentazione di numeri negativi in codifica complemento a due : -x e’ rappresentato da 2 n -x i numeri rappresentabili con n bit vanno da..a : -2 n-1 ... + 2 n-1 -1 (ad es. se n=4, da -8 a +7) si noti che l' intervallo NON e' simmetrico! e che c'e' un unico codice per lo zero. 171 RAPPRESENTAZIONE IN COMPLEMENTO A DUE codice a 6 bit, 5 bit dato (numeri da 0 a 31), 1 bit segno: complemento a due : 31 0 11111 -32 1 00000 x = +10 codice 001 010, 30 0 11110 -31 1 00001 x = -10 codice? 29 0 11101 -30 1 00010 -x rappresentato da 28 0 11100 -29 1 00011 ... 2 n -x = 2 n -1 -x+1 .. qui n=6, 17 0 10001 -18 1 01110 = 1000 000 - 1 –001010 + 1 16 0 10000 -17 1 01111 = 111111 – 001010 + 1 15 0 01111 -16 1 10000 = compl.bit per bit + 1 ... = 110 110 10 0 01010 ... 2 0 00010 1 0 00001 0 0 00000 -10 1 10110 -3 1 11101 -2 1 11110 -1 1 11111 con 6 bit si rappresentano i numeri da -32 a +31: -2 n-1 = -2 5 = - 32 = 1 00000 +2 n-1 -1= 25 -1 = +31 = 0 11111 numeri negativi: codifica in complemento a due -3 +2 --1 1 1 0 1 0 0 1 0 ------1 1 1 1 172 ovvero: (2^4-3)+2= 2^4-1 che rappresenta -1 ... per definizione ------------------------------------------------------------------ -2 +4 -+2 1 1 1 0 0 1 0 0 ------1 0 0 1 0 ovvero (2^4-2)+4 = 2^4+2, ignoro il riporto a sinist che e’ dato da 2^4 [[n.b.: due riporti, uno dal e uno nel bit segno]] ------------------------------------------------------------------ -3 -2 --5 1 1 0 1 1 1 1 0 ------1 1 0 1 1 (2^4-3)+(2^4-2)=(2^4-5)+2^4 il riporto (2^4) ignorato[[n.b.: due riporti, uno dal e uno nel bit segno]] anche qui il risult. e' ok numeri negativi: codifica in complemento a due 173 quando il risultato NON e’ rappresentabile: 5 6 -11 -5 -6 ---11 0 1 0 1 0 1 1 0 ------1 0 1 1 1 0 1 1 1 0 1 0 -------1 0 1 0 1 [[un solo riporto verso il bit segno -> errore di traboccamento->overflow]] [[un solo riporto dal bit del segno -> errore di overflow ]] diversi modi di rappresentare numeri con segno: a 0 0 0 0 0 0 b 000 011 100 101 110 111 c = = = = = = d 0 3 4 5 6 7 a 1 1 1 1 1 1 1 1 b 000 001 010 011 100 101 110 111 c = = = = = = = = d 8 9 10 11 12 13 14 15 174 (a = segno, b = cifre dato) c = codifica senza segno d = codifica in complemento a uno e = codifica in comlemento a due f = codifica in grandezza con segno <-- fino qui(segno +)come noto,poi: e -7 -6 -5 -4 -3 -2 -1 -0 f -8 -7 -6 -5 -4 -3 -2 -1 -0 -1 -2 -3 -4 -5 -6 -7 codifica complemento a due (colonna e) -5 si scrive: 1011 in compl. a uno (col. d) -5 si scrive: 1010 in grandezza con segno (colonna f) -5 si scrive: 1101 cont. RAPPRESENTAZIONE DI NUMERI CON SEGNO 175 abbiamo visto le due codifiche piu’ usate per rappresentare i numeri con segno, codifica in complemento a uno codifica in complemento a due vediamo ora due codifiche derivate da queste, “rappresentazione in eccesso di k” usate nella rappresentazione dei numeri in virgola mobile (tipo: 3,77 E-52 ) per la parte dell’esponente... ancora 2 modi di rappresent. numeri con segno: 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 a 000 001 010 011 100 101 110 111 000 001 010 011 100 101 110 111 b = = = = = = = = = = = = = = = = 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 c 0-7 1-6 2-5 3-4 4-3 5-2 6-1 7-0 -8+0 -7+1 -6+2 -5+3 -4+4 -3+5 -2+6 -1+7 de -8 -7 -6 -5 -4 -3 -2 -1 +0 +1 +2 +3 +4 +5 +6 +7 f colonna: a= segno, b= bit per il dato, c = decimale, d = complemento a due e = rappresentazione in eccesso di 2^(N-1) con complemento a uno f = rappresentazione in eccesso di 2^(N-1) con complemento a due num.positivi segno 1 nota che i numeri negativi hanno il bit del segno zero 176 rappresentaz. di numeri con segno con eccesso di k 177 codifica di numeri positivi e negativi con eccesso di 2n-1 ogni dato x (pos.o neg) e’ codificato con: 2(n-1) + x (con n = numero bit della rappresentaz.) ad es. per codificare 5 con n = 4 bit abbiamo: 5 -> 2(n-1) + 5 = 23 + 5 = 1000 + 101 = 1101 per rappresentare un numero negativo? -> uso l’aritmetica con complemento; devo decidere quale rappresentazione uso per la sottrazione, cioe’ quale codice per il -x; es: -5 -> 23 - 5 = 1000 + [codice di -5] -> ora, se rappresento -5 in complemento a uno allora: 2^3 + (-5) = 1000+1010 = 0010 (colonna d) (ignoro il riporto dal rango del segno!) codifica num.negativi con eccesso di k con n bit rappresento x con 2(n-1) + x con 4 bit ho i codici di +5 e di –5: 5 -> 2(n-1) + 5 = 23 + 5 = 1000 + 101 = 1101 -5 -> 23 - 5 = 1000 + codice di -5 -> -5 codice con eccesso di 23, complem.a uno: 2^3 + (-5)= 1000 + 1010 = 0010 (colonna d) -5 codice eccesso di 23, in complem.a due: 2^3 + (-5)= 1000 + 1011 = 0011 (colonna e) il primo bit e'sempre il segno del dato; con la codifica in eccesso di k il segno meno corrisp. al bit segno = 0 178 Riassunto 4 codifiche numeri interi con segno riassumiamo la rappresentazione di numeri con segno le 4 codifiche, caso di codice a 4 bit (1 bit per segno, 4 bit per dato) 179 0 0 0 0 0 0 0 0 000 001 010 011 100 101 110 111 = = = = = = = = 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 -7 -6 -5 -4 -3 -2 -1 -0 -8 -7 -6 -5 -4 -3 -2 -1 c= codifica senza 180 segno d= codice in complem a uno (due zeri!) la piu' usata: e= codifica in complemento a due (non simmetrica) 1 1 1 1 1 1 1 1 a 000 001 010 011 100 101 110 111 b = = = = = = = = 8 9 10 11 12 13 14 15 c -7 -6 -5 -4 -3 -2 -1 -0 d -8 -7 -6 -5 -4 -3 -2 -1 e +0 +1 +2 +3 +4 +5 +6 +7 f +0 +1 +2 +3 +4 +5 +6 +7 g f= rappresentazione in eccesso di 2N-1 con compl. a uno g= rappresentazione in eccesso di 2N-1, con complem.a due codifiche f,g hanno i num.negat.con segno 0 esercizi aritmetica con segno: 1) esercizio: calcolare la somma : +3 -3 in due versioni, complemento a uno complemento a due usare una codifica a 4 bit, 1) 3-3 181 esercizi aritmetica con segno: 1) 3-3, soluzione: in complem. a uno: complem.bit per bit +3 -> 0 0 1 1 -3 -> 1 1 0 0 0 0 1 1 1 1 0 0 ---------ottengo il codice di -0 1 1 1 1 (ricorda: il riporto da sinistra si somma a destra ) complemento a due: compl.bit per bit e poi sommo 1 (ignoro i due riporti nel/dal bit del segno) 3 -3 0 0 1 1 1 1 0 1 --------------1 0 0 0 0 182 2) aritmetica con segno, compl. a 1,esercizi: 6-4, 5-6, -2-3 es.2) calcolare in complemento a uno con codice a 4 bit: 6 -4 = 0 110 + 1 011 = 5-6 = 0 101 + 1 001 = -2 -3 = 1 101 + 1 100 = 183 2) aritmetica con segno, compl. a 1,esercizi: 6-4, 5-6, -2-3 184 calcolare 6 - 4 (complemento a uno, codice a 4 bit) : codice +6 0 110, codice +4 0 100, codice di -4 1 011, quindi: +6 0 110 somma : -4 1 011 ----10 001 risultato - ma vi sono due riporti al/dal segno, si somma il riporto: 0 001 +1 ----0 010 ottengo il codice di +2 2) aritmetica con segno, compl. a 1,esercizi: 6-4, 5-6, -2-3 185 calcolare 5 - 6 (complemento a uno, codice a 4 bit): codice di +5 0 101, codice di +6 0 110, di -6 1 001,quindi +5 0 101 somma : -6 1 001 -----1 1 110 nessun riporto al/dal segno, ho direttamente il risultato meno uno 2) aritmetica con segno, compl. a 1,esercizi: 6-4, 5-6, -2-3 calcolare -2 -3 (complemento a uno, codice a 4 bit) codice di +2 0 010, di -2 1 101 codice di +3 0 011, di -3 1 100, quindi -2 1 101 somma : -3 1 100 ----11 001 due riporti al/dal segno, sommo il riporto: 1 001 +1 ----1 010 risultato codice di -5 186 3) aritmetica con segno, compl. a 2, esercizi: 6-4, 5-6, -2-3 187 3) stessi esercizi, ma in complemento a due; 6 -4 5-6 -2 -3 ricorda per avere il codice di -3 in complemento a 2 si fa: parto dal codice di +3, 0 011, il complemento a uno e’ 1 100, a questo poi sommo uno, e ottengo 1 101 che e' il codice di -3 in complemento a due; (vale anche per lo zero: per avere il codice di -0 si fa: +0 = 0 000, complemento a 1 e' 1 111, 1111 piu' 1 -> ottengo 0 000 ) 3) aritmetica con segno, compl. a 2, esercizi: 6-4, 5-6, -2-3 188 6 -4 codice di +6 0 110 codice di +4 0 100, -4: 1011 + 1 = 1 100 somma: +6 0 110 -4 1 100 ----+2 10 010 risultato 0 010 (il doppio riporto in e dal bit del segno e' ignorato) 3) aritmetica con segno, compl. a 2, esercizi: 6-4, 5-6, -2-3 189 5-6 codice di 5 0 101 codice +6 0 110, di -6: 1 001+1=1010 somma: +5 0 101 -6 1 010 ---------1 1 111 -2 -3 codice di 2 0 010, -2: 1101+1= 1 110 codice di 3 0 011, -3: 1100+1= 1 101 somma: -2 1 110 -3 1 101 ---------5 11 011 ignoro doppio riporto 1, (nota:1=0001,complem. a 1 (5=0101, -5=1010+1 di -1 e' 1110,poi +1, ottengo =1011=risultato sopra) 1111) 4) aritmetica con segno, codici a 5 bit di -2, -6, -7, -13 4) esercizio: calcolare le codifiche dei numeri: -2, -7, -9, -13 in complemento a due, con rappresentazione di 5 bit (1 bit segno, 4 bit dato) 190 4) aritmetica con segno, codici a 5 bit di -2, -6, -7, -13 4) esercizio: calcolare le codifiche dei numeri: -2, -7, -9, -13 in complemento a due, con rappresentazione di 5 bit (1 bit segno, 4 bit dato) codice di +2 = 0 0010 codice di -2 = 1 1101 + 1 = 1 1110 codice di +7 = 0 0111, codice di -7 = 1 1000 + 1 = 1 1001 codice di +9 = 0 1001, codice di -9 da 1 0110 + 1 = 1 0111, codice di +13 = 0 1101, codice di -13 = 1 0010 + 1 = 1 0011, 191 FINE CODIFICHE NUMERI NEGATIVI FINE CODIFICHE NUMERI NEGATIVI 192 floating point = “ float, real, …(*) ” numeri in virgola mobile numeri molto ... numeri molto ... grandi piccoli esempio: velocita' della luce: 299 792 km/sec ("grande") massa elettrone: 9,109 381 × 10 -31 kilo ("piccolo") ---------------------------------------------------------------------------------------------------------------------------- (*) corrisponde ad un tipo standard di molti linguaggi di programmazione 193 codifica in virgola mobile RAPPRESENTAZIONE DI NUMERI MOLTO PICCOLI E MOLTO GRANDI --IN VIRGOLA MOBILE (FLOATING POINT) Possiamo scrivere un dato con parte intera e fratta in molti modi diversi: 0,314159265 * 101 3,14159265 * 100 314159265 * 10-8 0,0000314159265 * 105 ( 314159265, -8 ) ecc = 0,314159265 * E+1 <<== = 3,14159265 * E+0 <<== due forme normalizzate notazione in virgola mobile 3,14159265 = = = = = 194 codifica in virgola mobile 195 0,314159265 E+1 = forma normalizzata in virgola mobile le varie parti sono codificate separatamente : ( e' implicita la base dell'esponente , qui 10 ) segno/cifre /segno esponente/cifre espon. + ,314159265 + 1 in binario: + ,01010000011... + 1 ovvero + ,10100000110 + 0 (ricorda: 0,001 * 22 = 0,01 * 21 = 0,1 * 20 = 1 * 2 (-1) = 10 * 2 (-2) = ... 0,314E+1-> 314 = cifre = mantissa E+1 = esponente = caratteristica codifica in virgola mobile 196 + 0 , 3141592 E + 01 = forma normalizzata in virgola mobile Sono in ogni caso presenti 4 compnenti : il segno del dato + le cifre del dato (mantissa) = 3141592 = precisione del dato, (nota: la posizione della virgola decimale e' a sinistra della prima cifra non nulla del dato) il segno dell'esponente + le cifre dell'esponente (caratteristica) = 01 = ordine di grandezza del dato. precisione nella codifica in virgola mobile + 0,31415926 E + 01 la virgola (decimale o binaria) si assume generalmente a sinistra della prima cifra del dato. ... da ricordare che: scrittura italiana: 0,314E+1 dato in “virgola mobile” scrittura anglosassone: 0.314E+1 “floating point” datum" 197 precisione nella codifica in virgola mobile 198 Il numero delle cifre del dato (mantissa) determina la precisione della rappresentazione: un dato con precisione di due cifre: il costo dell'opera sara' 17 milioni di euro un dato con precisione di 8 cifre: il valore di π e' 3,1415926 definizione: precisione di una codifica in virgola mobile = il numero x piu' piccolo tale che 1.0 + x <> 1.0 es. alcuni dati con precisione di 4 cifre: 0,005764 chilometri 8012 metri 7542000 quintali 3,141 unita' 172,7 centimetri 1,000 litri codifica in virgola mobile precisione di una codifica in virgola mobile = 199 il numero x piu' piccolo tale che 1,0 + x <> 1,0 ad es. nel caso sopra, assumiamo la codifica con 7 cifre, allora la precisione e’ data da +0, 0 0 0 0 0 0 1 E+00 = 1,0E-7 (nota le posizioni 1 2 3 4 5 6 7) proviamo a sommare 1,0 e 1,0E-7 come sommo 1,0 + 1,0 E-7 ? somma di due numeri in floating point 200 premessa: per sommare due numeri di tipo: n * 10 k + m * 10 j es. 0,23 E 3 + 0,55 E 6 devo prima portare i due esponenti allo stesso valore, scelgo quello piu' grande (*) : ad es. se k>j allora n*10 k +(m*10 (-k+j) )*10 k = (n + (m*10 (-k+j) ) * 10 k 0,23E 3 + 0,55E 6 = 0,23*(10-3)*E6 + 0,55E 6 = 0,00023E6 + 0,55 E6 metto il fattore E6 = 10 alla 6 in comune: ( 0,00023 + 0,55 ) E6 = ( 0,55023) E6 = 0,55023 E6 (*)ricorda: 0,23E 3 = 0,023E 4 = 0,00023E 6 = 2,3E 2 = 230 E 0 somma di due numeri in floating point ora sappiamo come sommare due dati a 7 cifre: 1,000000 + 1,000000 E-7 1) porto i due esponenti allo stesso valore, scelgo quello piu' grande: 1,000000 = 1,000000E+00 1,000000 E-7 = +0,000 000 1000000 E+00 2) poi sommo: 201 codifica in virgola mobile porto i due esponenti allo stesso valore, quello piu' grande: 1,000000 = 1,000000E+00 1,000000 E-7 = +0,000 000 100000 E+00 1,000 000 0 E+00 +0,000 000 1000 000 E+00 -------- ---------------0,100 000 1000 000 E+00 devo avere il formato fisso a 7 cifre: tronco le ultime cifre, rimane 0,100 000 1 : il valore ottenuto 0,1000001E+00 e' diverso da 1,0E+00, quindi vale appunto che 1.0 + x <> 1.0 ==>> vediamo ora con un x piu' piccolo della precisione 202 codifica in virgola mobile 203 Quanto vale (1+x), se x e' piu' piccolo della precisione? 1 e' codificato con: sommo un x < 1.0E-7, ad es. 4.0E-8: 0,100 000 0 E+01 4,000 000 E-08 per sommare, devo avere esponenti uguali, uso il piu'grande: 0,100 000 0 E+01 +0,000 000 04 E+01 (e' 4,0E-08 spostato di 8 posiz. ----------------- per avere lo stesso esponente) 0,100 000 04 E+01 codifica in virgola mobile calcolo (1+x), con x e' piu' piccolo della precisione: 1 e' codificato con: 0,100 000 0 un x < 1.0E-7, ad es. 4.0E-8: 4,000 000 204 E+01 E-08 per sommare, devo avere esponenti uguali, uso il piu'grande: 0,100 000 0 E+01 tutti i dati con 7 cifre; +0,000 000 04 E+01 (e' 4,0E-08 spostato di 8 posiz. ----------------- per avere lo stesso esponente) 0,100 000 04 E+01 risultato con otto cifre per il dato - ma il formato e' fisso: il risultato deve avere 7 cifre! l'ultima cifra viene troncata (arrotondata) e si ottiene: 0,100 000 0 E+01 e quindi ottengo il risultato uguale al primo addendo !! codifica in virgola mobile, - limiti 205 In virgola mobile posso rappresentare numeri molto piccoli o molto grandi utilizzando sempre lo stesso numero di cifre in un formato fisso; vediamo qui un esempio di formato e i limiti che ne derivano: in tutto 6 cifre, quattro per il dato, 2 per esponente, piu' i due segni (dato,esponente) : 27,53 -> 0,2753 E+02 0,000 000 000 07986 -> 0,7986 E-10 piccolo 12340000 0000 0000 -> 0,1234 E+16 grande codifico ora i numeri con il formato detto; i tre dati di sopra codificati diventano : | + | + | 02 | 2753 | primo dato 27,53 | + | - | 10 | 7986 | 2.o dato 0,7986 E-10 | + | + | 16 | 1234 | 3.o dato 0,1234E+16 limiti codifica in virgola mobile 27,53 0,2753 E+02 0,000 000 000 07986 0,7986 E-10 12340000 0000 0000 0,1234 E+16 4 cifre per il dato,2 cifre per l'esponente | + | + | 02 | 2753 | primo dato 27,53 | + | - | 10 | 7986 | 2.o dato 0,7986E-10 | + | + | 16 | 1234 | 3.o dato 0,1234E+16 il numero piu' grande rappresentabile con tale formato: | + | + | 99 | 9999 | = 0,9999 * 10^99 il numero piu' piccolo rappresentabile con tale formato, con 4 cifre, normalizzato (prima cifra a sin. e' non zero): | + | - | 99 | 1000 | = 0,1000 * 10^(-99) il piu' piccolo con 1 cifra sola (non normalizzato) : | + | - | 99 | 0001 | = 0,0001 * 10^(-99) = 0,1 * 10^(-102) 206 codifica in virgola mobile 207 nota - la rappresentazione di un numero in floating point definisce come si codificano * la parte delle cifre (mantissa) e * la parte che da' l'ordine di grandezza (caratteristica) 123,456 si scrivera': 0,123456 E+3 (convenzione: la prima cifra dopo la virgola decimale e' non nulla, la parte intera e' nulla; usata negli es.seguenti) oppure (convenzione standard corrente, piu' usata) 1,23456 E+3 la virgola sta dopo la prima cifra non nulla (che in binario e' sempre 1, e si assume implicitamente senza memorizzarla) codifica in virgola mobile - codifica e limiti seguono esempi in binario su un ipotetico formato a 8 bit: S segno dato Z segno espon EE espon DDDD dato 1) Per rappresentare il dato 5,0 avremo in binario : 5 = 101,0 * 2^0 (ora normalizzo ) = 0,1010 * 2 ^ 3 => 0 0 11 1010 S Z EE DDDD quindi 00111010 e’ la codifica di 0,101 * 2 ^ 3 2) per rappresentare il dato 0,75 avremo in binario: 0,75 = 0,5 + 0,25 = 1/2+1/4 = 0,11 con esponente 0, quindi 0 0 00 1100 quindi 00001100 rappresenta 0,11 * 2 ^ 0 208 codifica in virgola mobile es 0,125 209 contin. virgola mobile con codifica a 8 bit SZEEDDDD (S segno dato, Z segno esponente, EE esponente, DDDD cifre dato) 3) dato 0,125 = 1/8 = 0,001 = 0,001*2^0 = { S=0, Z=0, EE=00, DDD=001 } poi normalizzo, cioe’ virgola binaria a sinistra della 1.a cifra del dato: = 0,1*2^(-2)(*) codifico l'esponente negativo ad es.in compl. a uno, quindi (z=meno,EE=2) -2 diventa: -2= 111010 =101, infine il tutto 0,1000*2^(-2) diventa: 0,125 = S E EE DDDD= 0 1 01 1000= 01011000 _____________ (*) nota: di seguito uso a^b oppure ab per indicare a alla b codifica in virgola mobile es con soli 8 bit ... 210 cont. codifica in virgola mobile con 8 bit S segno, Z segno espon,EE espon., DDDD dato abbiamo visto che 0011 1010 rappresenta 5,0 e che 0,125=1/8=0,0012 si scrive 01011000, vediamo i numeri piu’piccolo e piu’grande: il piu'grande: esponente posit.massimo e'3: 0011 1111 = 0,1111*23 = 8 (circa) il piu'piccolo: espon.piu'piccolo e'-3: 0100 0001 = 0,0001*2-3 = 1,0*2-7 = 1/128 211 vedremo tra poco lo standard di codifica per i due tipi piu' usati, FLOATING (32 bit) e DOUBLE (64 bit) e i limiti che derivano da tale formato codifica in virgola mobile es con soli 8 bit ... i dati con segno meno sono rappresentati complementando tutto, quindi ad es. gli stessi di prima: +5,0 -5,0 = 0011 1010, = 1100 0101 0,75 -0,75 = 0000 1100, = 1111 0011 0,125 = 0101 1000, -0,125 = 1010 0111 212 nota sulla interpretazione di un dato quando il calcolatore preleva un dato dalla memoria il dato sara' poi interpretato a seconda dello stato in cui si trova l'unita' centrale: senza questa informazione la codifica di dato qualunque, ad es.: 1011 1111 non dice nulla su come deve essere interpretato: per interpretare un insieme di n bit correttamente dobbiamo sapere a priori di che tipo di dato si tratta!! ad es. il dato qui riportato, 1011 1111, avra' un valore ben diverso a seconda se lo interpreto come il codice di un carattere, oppure come codice d intero con segno oppure come codice di un numero in floating point, oppure ancora come il codice di un'istruzione macchina!! 213 214 il formato determina * la precisione dei dati * i limiti di rappresentazione dei dati vediamo un esempio semplificato (tutto in base 10) codifica in virgola mobile: precisione/estensione 215 date n cifre [es. 10 cifre decimali] per rappresentare un dato in virgola mobile dobbiamo decidere il formato cioe’ dividere le cifre disponibili per le codifiche dei vari pezzi ... il formato determina l'insieme dei numeri rappresentabili: * sia per l' estensione dell'intervallo (ordine di grandezza, num. piu' piccolo/ num. piu' grande) * sia per la precisione (cifre significative) nota: se uso piu' cifre per l'esponente -> posso rappresentare numeri piu' grandi / piccoli, -> ma - diminuisce la precisione (restano meno cifre per il dato) e viceversa: uso piu’ cifre per dato -> meno cifre per esp. codifica in virgola mobile: base 1000 216 Possiamo aumentare i limiti di grandezza dei numeri rappresentabili a pari numero cifre della codifica cioe' senza aumentare il num.di cifre del codice ... es: codice con 6 cifre decimali, 2 espon, 4 dato, tutto in base 10 0,50 = 0,50*10^00 => + +00 5000 3,14 = 3,14*10^00=0,314*10^1 => + +01 3141 0,00123=,123*10^-2 => + -02 1230 il numero piu' piccolo + -99 1000 => 0,1000E-99 il numero piu' grande + +99 9999 => 0,9999E+99 NOTA: qui l' esponente e' con base 10 MA se cambio base ? codifica in virgola mobile: base 1000 217 riprendiamo il codice detto, con 6 cifre decimali di cui 2 per l' espon, 4 per le cifre del dato, tutto in base 10, .. MA: cambio base dell’esponente: invece di 10 e’ 1000 allora: 0,50=0,50 *1000^0 => + +00 5000 il numero piu' piccolo e' ora: + -99 1000 = 0,1000*(1000^(-99)) = = 0,1000*((1000)^(-99)) =0,1000*10^(-297) = 0,1000 E -297 il numero piu' grande e' ora: + +99 9999 = 0,9999*(1000^(-99)) = = 0,9999*((10^3)^(99)) => 0,9999 E+297 aumentano i limiti di ordine di grandezza !! codifica in virgola mobile: base 1000 218 codice con 6 cifre decimali, 2 espon, 4 dato, tutto in base 10 cambio base dell’esponente: invece di 10 e’ 1000 allora: 0,50=0,50 *1000^0, codice: + +00 5000 il numero piu' piccolo + -99 1000 = 0,1000 E-297 il numero piu' grande + +99 9999 = 0,9999 E+297 aumentano i limiti di ordine di grandezza ... MA ->perdo cifre, cioe' precisione: 3,14 =3,14 *1000^0 = se cambio espon.di uno la virgola si sposta di TRE posizioni (base esponente e' 1000): = 0,00314*1000^1 0,00123 = ,00123*1000^0 => + +01 0031 => + +00 0012 codifica in virgola mobile: base 10 vs. base 1000 219 codifica con 6 cifre decimali, 2 espon, 4 dato, tutto in base 10, base dell’esponente 10: 3,14 = 3,14*10^00=0,314*10^1=> + +01 3141 se la base dell’esponente invece di 10 e’ 1000 allora abbiamo: 3,14=3,14*1000^0=,00314*1000^1=>+ +01 0031 quindi: se aumento o diminuisco di 1 l’ esponente con base 1000 devo spostare le cifre del dato di 3 posizioni: avro’ spesso zeri dopo la virgola decimale normalizzata -> meno cifre utilizzate -> perdo in precisione in media perdo 1,5 cifre codifica in virgola mobile 220 ancora un ese. con mantissa a 3 cifre, esponente a base 10: 93,93 *10^0 =0,9393*10^2 => + +02 939 9,393 *10^0 =0,9393*10^1 => + +01 939 0,9393 *10^0 =0,9393*10^0 => + +00 939 0,09393*10^0 =0,9393*10^-1 => + -01 939 ,009393*10^0 =0,9393*10^-2 => + -02 939 ,0009393*10^0=0,9393*10^-3 => + -03 939 se la base dell’esponente invece di 10 e’ 1000 allora abbiamo: 93,93 *1000^0 =,09393*1000^1 => + +01 094 9,393 *1000^0 =,009393*1000^1=> + +01 009 0,9393 *1000^0 =,9393*1000^0 => + +00 939 0,09393*1000^0 =,09393*1000^0 => + +00 094 ,009393*1000^0 =,009393*1000^0=> + +00 009 ,0009393*1000^0=,9393*1000^-1 => + -01 939 codifica in virgola mobile se la base dell’esponente e’ 1000 (invece di 10) allora abbiamo (ripeto): 93,93 *1000^0 =,09393*1000^1 => + +01 9,393 *1000^0 =,009393*1000^1=> + +01 0,9393 *1000^0 =,9393*1000^0 => + +00 0,09393*1000^0 =,09393*1000^0 => + +00 ,009393*1000^0 =,009393*1000^0=> + +00 ,0009393*1000^0=,9393*1000^-1 => + -01 221 094 009 939 094 009 939 perdo cifre significative (in media perdo 1,5 cifre=meta’ cifre della base) ma guadagno in limiti di grandezza: 1000^(-99)-- 1000^99 ( invece di 10^(-99) -- 10^99 ) ovvero 10^(-99*3)-- 1000^(99*3) codifica in virgola mobile 222 ancora ese. con mantissa a 3 cifre, esponente a base 10: 45678 = 0,45678*10^+5 => + +05 457 0,00712 = 0,712 *10^-2 => + -02 712 0,5555 = 0,5555 *10^-0 => + +00 555 se la base dell’esponente invece di 10 e’ 1000 allora abbiamo: 45678,0 = 0,045678*1000^2 => + +02 045 <<== 0,00712 = 0,00712 *1000^0 => + +00 007 <<== 0,5555 = 0,5555 *1000^0 => + +00 555 <<== perdo cifre significative, qui in media perdo 1,5 cifre (meta’ cifre della base) guadagno in limiti di grandezza: ho 1000^(-99)-- 1000^99 invece di 10^(-99) -- 10^99. esercizio floating point: 7,7E0 in binario ? 223 esercizio floating point: dato il formato: 12 bit divisi come segue: 1 bit segno del dato 1 bit segno dell'esponente (codifica con eccesso di 2^3) 3 bit valore esponente (e in complemento a uno) 7 bit valore del dato - ma attenz.: vedi nota qui sotto dove il 1.o bit del dato e' sempre uno, e non e' memorizzato (ovvero se il dato - parte mantissa - vale 1011 1111, virgola binaria posta davanti la prima cifra, il dato e' memorizzato nella parte cifre come 011 1111 (1.o bit 1 implicito) trovare la rappresentazione di 7,7 E0 esercizio floating point continua 224 esercizio: convertire 7,7E0 in binario, in formato da 12 bit: 1 bit segno dato; cifre del dato: 7 bit esponente: 1 bit segno, 3 bit valore (eccesso 2^3, compl. a 1); devo convertire le cifre del dato e l'esponente; qui l'esponente e' zero, quindi devo convertire solo le cifre: convertire 7,7 da base 10 a base 2: devo convertire separatamente la parte intera, semplice: 7-> 111, (sono i tre bit iniziali delle cifre del dato) e separatamente la parte fratta: solo per quattro bit, perche' con mantissa a 7 bit, 3 bit gia'dati, devo trovare ancora 4 bit 0,7 = 0,abcd (binario) - moltiplicando per due ripetutamente: 1) 0,7*2->1,4; 2)0,4*2->0,8; 3)0,8*2->1,6; 4) 0,6*2->1,2; 5) 0,2*2->0,4; quindi per la parte fratta le cifre binarie sono 0,10110 (e' un 0,7 approssimato con 5 bit, 0,5+0,125+0,0625=0, 6875) il dato in binario e' 111,10110 normalizzo: 1,1110110 * 2^2 esercizio floating point: 7,7E0 in binario, continua 1) convertire 7,7E+0 da base 10 a base 2: (1 bit segno dato; 7 bit cifre del dato; esponente: 1 bit segno, 3 bit valore (eccesso di 2^3, compl.a 1); parte intera 7-> 111, poi la parte fratta con mantissa a 7 bit, devo trovare ancora 4 bit: 1) 0,7*2->1,4; 2)0,4*2->0,8; 3)0,8*2->1,6; 4) 0,6*2->1,2; 5) 0,2*2->0,4; quindi per la parte fratta le cifre binarie sono 0,10110 (e' un 0,7 approssimato con 5 bit, 0,5+0,125+0,0625=0, 6875) ora il dato in binario e' 111,10110; normalizzo: 1,1110110 * 2^2 quindi: parte cifre 1,1110110, -> sono 8 bit ?! ... MA: il primo bit poi sara' implicito, quindi restano 7 bit da memorizzare la parte esponente 2 cioe' 010, con eccesso di 1000: 1000+010=1010 metto insieme e ho: 0 1 010 1110110 = 6,875 E+0 la precisione e' veramente scarsa... visto le poche cifre per il dato ;-) 225 somma in virgola mobile somma con numeri in virgola mobile: 0,xxx*10^E1 + 0,yyy*10^E2 = 1) se E1 = E2 allora le due mantisse si possono sommare: (0,xxx + 0,yyy) *10^E1 es.: 0,314 E + 1 + 0,250E + 1 = ( 0,314 + 0,250 ) * 10 ^ 1 = = 0,564 * 10^1 = = 0,564 E + 1 226 somma in virgola mobile 227 Per sommare due numeri in virgola mobile, se E1 <> E2 allora devo rendere i due esponenti uguali: porto l'esponente piu' piccolo al valore del piu' grande, es: formato con 3 cifre per dato, 1 per esponente: 0,222E+1 + 0,333E-1 -> e1<>e2 per cui non posso sommare direttamente -> devo aggiustare uno dei due esponenti, cambio l'esponente piu' piccolo e lo metto al valore del piu' grande, scalando di uguale misura la mantissa: 0,222E+1 + 0,00333E+1 = 0,222 * 10 + 0,00333 * 10 = (0,222 + 0,00333) * 10 = 0,22533 E+1 <<== RIS. siccome ho solo 3 cifre disponibili -> si troncano le cifre = 0,225 E +1 <== inevitabile errore di troncamento !!! somma in virgola mobile - normalizzare risultato 228 attenz: se la somma delle mantisse fornisce un numero maggiore di uno allora si deve normalizzare il risultato: 0,966 E+1 + 0,555 E+0 = 0,966 E+1 + 0,0555E+1 = 0,966 * 10 + 0,0555 * 10 = = ( 0,966 + 0,0555 )* 10 = (1, 0215) * 10 = 1,0215 E+1 = 0,10215 E+2 [esponente normalizzato] = 0,102E+2 forma normalizzata solo 3 cifre -> abbiamo di nuovo un errore troncamento ! ancora un es.: 0,997E+1 + 0,00423E+1 = 0,997 * 10 + 0,00423 * 10 = (0,997 + 0,00423) * 10 = 1,00123E+1 = 0,100123E+2 = 0,100E+2 somma in virgola mobile 229 Per sommare due numeri in virgola mobile: se e1 <> e2 allora devo rendere i due esponenti uguali: abbiamo visto la somma fatta portando l'esponente piu' piccolo al valore del piu' grande ... e se invece porto l’ esponente piu’ grande al valore del piu’ piccolo? -> 0,997E+1 + 0,423E-1 = 99,7E-1 + 0,423E-1 non cambia molto ... ma ottengo un numero in forma non normalizzata, devo in ogni caso normalizzare => alla fine ho lo stesso risultato ... ... non si usa codifica in virgola mobile : overflow 230 puo’ succedere che il risultato della somma non sia rappresentabile: dati: 0,9983E+99 e 0,7044E+98, rappresentati ad es. formato decimale , 2 cifre per esponente, 4 per dato: +99 ,9983 = +98 ,7044 = ---------------------- 99 ,9983 99 ,07044 ----------------sommiamo: 99 1,06874 -> normalizzo 100 ,106874 -> l’esponente e’ > 99 non posso rappresentare l'esponente 100 -> il risultato esce dai limiti della codifica ! ==> errore di traboccamento ==> overflow codifica in virgola mobile: overflow 231 se l'esponente del risultato di un’operazione aritmetica non e' rappresentabile allora c’e’ un errore di “overflow”: // caso di formato decimale, con 2 cifre per esponente e 4 per dato: +99 9983 = 99 ,9983 +98 7044 = 99 ,07044 ------------ ---------99 1,06874 -> normalizzo 100 ,106874 -> esponente e’ >99 non posso rappresentare l'esponente 100 ! // nei calcolatori c'e' spesso un meccanismo di controllo automatico su questo errore: se c’e’un "floating point overflow" allora il calcolatore interrompe (HW!) l' esecuzione del programma e segnala questo fatto in qualche modo. formato / i floating point in molti modelli di calcolatori sono state usati per la codifica floating diversi formati e basi diverse dalla base due: ad esempio con base 16, (e quindi - come vedremo l'intervallo di numeri rappresentabili era maggiore) dal 1985 si usa lo standard IEEE 754 (che vedremo tra poco) che usa come base per l'esponente il valore 2 232 standard IEEE 233 FORMATI STANDARD IN VIRGOLA MOBILE (IEEE standard 754 Binary Floating Point Arith del 1985) s 1,ddd...ddd E z ee..ee = (segno dato s) * [mantissa 1,dddddd] * parte Esponente [= segno z esponente * caratteristica = cifre esponente eeee ] formato a 32 bit, mantissa dd...dd a 23 bit, esp. zee...ee a 8 bit formato a 64 bit, formato a 80 bit, standard IEEE 754 del 1985 234 formato a 32 bit (single precision) limiti: max 3.4 E+38 min 1.5 E-45 non normalizzato positivo min 1.2 E-38 normalizzato positivo mantissa: 23 bit con sottinteso un uno davanti alla virgola binaria, quindi sono 24 bit, precisione di 7,4 cifre decimali il dato e' sempre espresso in modo che la mantissa e' compresa tra 1.000..00 e 1.111..11 (dato normalizzato) esponente binario codice a 8 bit da -126 a +127, con base 2 e rappresentazione in eccesso di 127 in complem. a due; formato bit (virgola a dest.della 1.a cifra D) S ZEEEEEEE D,DDD DDDD DDDD DDDD DDDD DDDD D non e' memorizzato, e' implicito esempio di codifica float es. il dato 42.6875 si codifica come segue: 42.6875 = 101010.1011 = 1.010101011 x 2 5 che per l'esponente da': 127+5 =132=128+4= 10000100 (8 bit) e per la mantissa 1,01010101100000000000000 (23 bit) e per il segno 0 (1 bit) totale: 0 10000100 01010101100000000000000 235 limite float - numero piu' grande Nota: il numero piu' grande per un numero in virgola mobile a 32 bit in formato standard e' esponente (8 bit, base 2): 127 = 01111111 (*) mantissa:(2-2^(-23))=1.1111111111111111111111 quindi il valore (massimo) rappresentato e': max = (2-2^(-23))*2^(127) = 3.403*10^38 ed il valore minimo (piu' piccolo) ? dato normalizzato, la mantissa piu' piccola e' 1.0 esponente piu' piccolo (base 2) e' -127 = 1000000 ___________________ (*) 63=11 1111,64=10 00000,127=111 1111, 128=1000 0000 236 standard IEEE formato a 64 bit (double precision) circa 15 cifre decimali e intervallo da 10^-300 a 10^300, max 1.7 E+308 min 5.0 E-324 non normalizzato posit. min 2.3 E-308 normalizzato posit. esponente binario 11 bit da -1022 a +1023 (base 2) mantissa: 52+1 (bit implicito) bit cioe' la precisione e' di 15,5 cifre decimali formato bit: S EEE EEE EEE EE DDDDD DDDDD DDDDD DDDDD DDDDD DDDDD DDDDD DDDDD DDDDD DDDDD DD 237 standard IEEE formato a 80 bit (extended) max 1.1 E+4932 min 1.9 E-4951 non normalizzato posit. min 1.7 E-4932 normalizzato posit. precisione: 19,5 cifre esponente binario 15 bit da -16382 a 16383, mantissa: 63+1 bit (19,5 cifre decimali) formato in binario: S EEEEE EEEEE EEEEE DDD DD DDD DD DDD DD DDD DD DDD DD DDD DD DDD DD DDD DD DDD DD DDD DD DDD DD DDD DD DDD 238 standard IEEE quadrupla precisione a 128 bit: 15 bit per l'esponente 111 bit per la mantissa (normalizzata con 1 davanti la virgola binaria) massimo esponente 32767 (con base 2, circa 10000 base 10) 239 altre rappresentazioni (non piu'usate) 240 osservazione: gli stessi bit possono essere divisi in molti modi, e prima dello standard IEEE 754 erano in uso ad es. l' IBM 370 usava la codifica: esponente 7 bit, base 16; mantissa 24 bit (7,5 cifre circa) quindi il massimo rappresentabile max = 16^63 * 0,FFFFFF = 0,9999 * E+75 min = 16^(-64) * 0,000001 = 0,1 * E-79 fino agli anni 80 erano in uso molte codifiche diverse, ogni casa costruttrice usava una sua codifica (la Digital usava una sua (su VAX), la Control Data usava una ancora diversa a 60 bit, ecc) codici floating speciali: codici per infinito / non definito 241 Nota 2) : lo standard prevede dei codici particolari per indicare numeri "molto grandi" o "praticamente infiniti", usati per i risultati di operazioni del tipo: 7,5 / 0.0 e altri codici per indicare numeri "non definiti" usati per il risultato di un'espress. aritm. del tipo: infinito * zero zero / zero viene poi definita un' aritmetica per questi codici, del tipo: infinito * x = infinito, non_definito + x = non_definito ... unita' aritmetica per interi / per virgola mobile 242 Nota 3): Le operazioni aritmetiche in virgola mobile sono piu' complesse delle operazioni analoghe su interi, e la realizzazione hw e' piu' complessa. Le istruzioni aritm. in virgola mobile sono realizzate (su calcolatori piccoli) con sequenze di istruzioni apposite (sottoprogrammi); L' aritmetica in virgola mobile e' realizzata circuitalmente in un'unita' di calcolo "floating-point unit", che puo'essere separata dall'unita' centrale, cosi’ erano (anni 80) l' INTEL 80286 + f.p.u. 80287 o MOTOROLA 68020 + f.p.u. 68882) oppure fa parte dell'unita' centrale, che diventa un po' piu' grande; cosi' era per i calcolatori "grandi" (mainframe, es VAX9000, IBM 370-XA - ma anche nei micro processori successivi al 1995 per personal, tipo Intel Pentium o Power PC o ALFA) tre esercizi 1) e’ dato un formato di numero in virgola mobile (binario) con 16 bit di cui 10 per le cifre (mantissa) e 5 per l'esponente (compreso il segno dell'esp. “z”): S Z E E E E D D D D D D D D D D <= binario a) trovare la precisione in decimale (quante cifre decimali, ovvero il numero x piu' piccolo tale che 1+x <> x) b) trovare la codifica binaria in tale formato di: 13.5 (in base 8) = 11.625 (in base 10), poi di 6.5 (in base 10), e 5.55 (in base 10) -> per questo valore trovare poi (dal codice binario in virgola mobile) il valore corrispondente in decimale: quante cifre sono state perse? 243 tre esercizi 244 2) dato il formato di numero in virgola mobile [formato di codifica gia' visto] con 16 bit, di cui 10 per le cifre (mantissa) e 5 per l'esponente (compreso segno dell' espon. “z”): S ZEEEE DDD DDD DDD D domanda: sono rappresentabili esattamente i dati, e se si', quali ? 3.5, 23.0, 555.0, 5252.0, 78951.0 ? tre esercizi 3) trovare le regole per la a) moltiplicazione e b) divisione in virgola mobile (si usi un formato decimale (tutto in base 10) a 6 cifre, di cui 2 per l' esponente e 4 per la mantissa) 245 indice sistemi posizionali rappresentazione di numeri sistema unario storia dei sistemi di numerazione il sistema latino codici posizionali in varie basi un quiz somme numeri in base 2, 3, .. prodotto in binario base sedici (esadecimale) cambio base esercizi frazioni 0,1 da base 10 a base due limiti e overflow 246 indice capitolo numeri con segno: NUMERI CON SEGNO numeri con segno numeri in complemento a uno somme con segno complemento a due rappresentazione in eccesso di k esercizi sui numeri con segno 247 indice capitolo numeri in virgola mobile : NUMERI IN VIRGOLA MOBILE rappresentazione di n.i grandi/piccoli precisione limiti esercizio somma in floating point overflow standard IEEE 754 floating point esercizi fine parte numeri 248 fine parte numeri 249 FINE PARTE NUMERI