La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

RAPPRESENTAZIONE DELLINFORMAZIONE Internamente a un elaboratore, ogni informazione è rappresentata tramite sequenze di bit (cifre binarie) Una sequenza.

Presentazioni simili


Presentazione sul tema: "RAPPRESENTAZIONE DELLINFORMAZIONE Internamente a un elaboratore, ogni informazione è rappresentata tramite sequenze di bit (cifre binarie) Una sequenza."— Transcript della presentazione:

1 RAPPRESENTAZIONE DELLINFORMAZIONE Internamente a un elaboratore, ogni informazione è rappresentata tramite sequenze di bit (cifre binarie) Una sequenza di bit non dice cosa essa rappresenta: linterpretazione è negli occhi di chi guarda Ad esempio, può rappresentare: lintero 65, il carattere A, il boolean vero, … … il valore di un segnale musicale, … il colore di un puntino sullo schermo...

2 INFORMAZIONI NUMERICHE La rappresentazione delle informazioni numeriche è di particolare rilevanza In particolare vogliamo poter trattare: numeri naturali (interi senza segno) numeri interi (con segno) numeri reali con la consapevolezza di: eventuali limiti nella loro rappresentazione e nel loro uso eventuali approssimazioni necessarie.

3 NUMERI NATURALI (interi senza segno) Dominio: N = { 0,1,2,3, …} Rappresentabili con diverse notazioni non posizionali ad esempio la notazione romana: I, II, III, IV, V,.... IX, X, XI... posizionale 1, 2,.. 10, 11, ,...

4 NUMERI NATURALI (interi senza segno) Dominio: N = { 0,1,2,3, …} Rappresentabili con diverse notazioni non posizionali ad esempio la notazione romana: I, II, III, IV, V,.... IX, X, XI... posizionale 1, 2,.. 10, 11, ,... Non posizionali: hanno regole proprie, che rendono spesso assai complessa l'esecuzione dei calcoli Posizionale: rappresenta i numeri in modo compatto, e rende semplice l'ef- fettuazione dei calcoli

5 NOTAZIONE POSIZIONALE Concetto di base di rappresentazione B Rappresentazione del numero come sequenza di simboli (cifre) appartenenti a un alfabeto di B simboli distinti ogni simbolo rappresenta un valore compreso fra 0 e B-1 Esempio (base B = tre, alfabeto A = { $, %, # }): $ rappresenta il valore zero % rappresenta il valore uno # rappresenta il valore due

6 NOTAZIONE POSIZIONALE Il valore di un numero espresso in questa notazione è ricavabile a partire dal valore rappresentato da ogni simbolo pesandolo in base alla posizione che occupa nella sequenza d n-1 … d 2 d 1 d 0 Posizione 0: pesa B 0 (unità) Posizione 1: pesa B 1 Posizione n-1: pesa B n-1

7 NOTAZIONE POSIZIONALE Il valore di un numero espresso in questa notazione è ricavabile a partire dal valore rappresentato da ogni simbolo pesandolo in base alla posizione che occupa nella sequenza Esempio ( $ indica zero, % indica uno, # indica due) : %## rappresenta il valore diciassette %$% rappresenta il valore dieci

8 NOTAZIONE POSIZIONALE Il valore v di un numero espresso in questa notazione è ricavabile a partire dal valore rappresentato da ogni simbolo pesandolo in base alla posizione che occupa nella sequenza In formula: B = base, d k = cifre (ognuna rappresenta un valore fra 0 e B-1)

9 NOTAZIONE POSIZIONALE Quindi, una sequenza di cifre (stringa) non è interpretabile se non si precisa la base in cui è espressa Esempi:

10 NOTAZIONE POSIZIONALE Ogni numero può essere espresso, in modo univoco, in una qualunque base Esempi:

11 CONVERSIONI stringa/numero/stringa Ogni numero può essere espresso, in modo univoco, in una qualunque base Quindi, deve essere possibile: data la rappresentazione di un numero in una certa base, determinare il valore del numero dato un numero, determinare la sua rappresentazione in una certa base

12 CONVERSIONI stringa/numero/stringa Ogni numero può essere espresso, in modo univoco, in una qualunque base Quindi, deve essere possibile: data la rappresentazione di un numero in una certa base, determinare il valore del numero dato un numero, determinare la sua rappresentazione in una certa base Conversione da stringa a numero Conversione da numero a stringa

13 CONVERSIONE STRINGA / NUMERO Problema: data la rappresentazione di un numero in una certa base, determinare il valore del numero Soluzione: applicare la formula

14 CONVERSIONE NUMERO / STRINGA Problema: dato un numero, determinare la sua rappresentazione Soluzione: dipende se la rappresenta- zione scelta è posizionale o meno se non è posizionale, le regole dipendono dalla specifica rappresentazione ad esempio, ventisette in notazione romana: 27 è compreso fra 20 e 30 accumulo 20 XX = 7 è compreso fra 5 e 10 accumulo 5 V 7-5 = 2 si esprime direttamente II morale: XXVII

15 CONVERSIONE NUMERO / STRINGA Problema: dato un numero, determinare la sua rappresentazione in una base data Soluzione (notazione posizionale): manipolare la formula per dedurre un algoritmo v è noto, le cifre d k vanno calcolate

16 CONVERSIONE NUMERO / STRINGA d 0 si può ricavare come resto della divisione intera v / B tale divisione ha per quoziente q = d 1 + B * ( d 2 + B * ( d )), che consente di trovare le altre cifre iterando il procedimento NB: le cifre vengono prodotte nell'ordine dalla meno signifi- cativa (LSB) alla più significativa (MSB)

17 CONVERSIONE NUMERO / STRINGA d 0 si può ricavare come resto della divisione intera v / B tale divisione ha per quoziente q = d 1 + B * ( d 2 + B * ( d )), che consente di trovare le altre cifre iterando il procedimento NB: le cifre vengono prodotte nell'ordine dalla meno signifi- cativa (LSB) alla più significativa (MSB) Algoritmo delle divisioni successive

18 CONVERSIONE NUMERO / STRINGA Algoritmo delle divisioni successive si divide v per B il resto costituisce la cifra meno significativa il quoziente serve a iterare il procedimento se tale quoziente è zero, lalgoritmo termina; se non lo è, lo si assume come nuovo valore v, e si itera il procedimento con il valore v.

19 CONVERSIONE NUMERO / STRINGA Esempi

20 RAPPRESENTAZIONI IN BASI DIVERSE In generale, le rappresentazioni di uno stesso numero in basi diverse non sono correlate fra loro Esempio: il numero sessantasette B 1 = B 2 = B 3 = B 4 = 16 43

21 RAPPRESENTAZIONI IN BASI DIVERSE Tuttavia, diventano correlate se le basi considerate sono una potenza una dellaltra: B 2 = (B 1 ) N Allora, N cifre nella rappresentazione in base B 1 corrispondono esattamente a 1 cifra nella rappresentazione in base B 2

22 RAPPRESENTAZIONI IN BASI DIVERSE Tuttavia, diventano correlate se le basi considerate sono una potenza una dellaltra Esempio: B 1 = B 2 = 8 = 2 3 = (B 1 ) B 3 = B 4 = 16 = 2 4 = (B 1 ) = cifra hex = 4 cifre binarie 8 = cifra ottale = 3 cifre binarie

23 RAPPRESENTAZIONI IN BASI DIVERSE Conseguenza: se le basi considerate sono una potenza una dellaltra, per passare dalla rappresentazione di un numero in una base B 1 alla sua rappre- sentazione in unaltra base B 2 = (B 1 ) N basta sostituire ordinatamente N cifre della rappresentazione B 1 con 1 cifra della rappresentazione B 2

24 RAPPRESENTAZIONI IN BASI DIVERSE

25 OPERAZIONI IN NOTAZIONE POSIZIONALE Tutte le notazioni posizionali usano le stesse regole per le operazioni, indipen- dentemente dalla base adottata Esempi di somme e sottrazioni:

26 OPERAZIONI IN NOTAZIONE POSIZIONALE In moltiplicazioni e divisioni: spostando tutte le cifre a sinistra di una posizione (e introducendo uno 0 a destra) si moltiplica per la base spostando tutte le cifre a destra di una posizione (e introducendo uno 0 a sinistra) si divide per la base Esempi: base dieci:184*10=1840 base dieci:1832/10=183_ base due:1011*2=10110 base due:1111/2=111_ Divisione intera

27 OPERAZIONI IN NOTAZIONE POSIZIONALE Due mosse elementari: Shift Left (SHL) Shift Right (SHR) Qualunque moltiplicazione o divisione può essere espressa con somme, sottrazioni e SHL / SHR.

28 ERRORI NELLE OPERAZIONI In matematica, le operazioni sui naturali non danno mai luogo a errori (posto che la divisione è una divisione intera, che può comportare lesistenza di un resto) In un elaboratore, invece, si possono generare errori, a causa dellimpossibilità di rappresentare tutti gli infiniti numeri in particolare, con N bit il massimo numero rappresentabile è 2 N -1 qualunque operazione che implichi un risultato maggiore sarà errata OVERFLOW

29 ERRORI NELLE OPERAZIONI TeoricamentePraticamente il risultato è completamente errato, perché è andato perso proprio il contributo più significativo (MSB) Soluzione: usare un tipo di dato che offra un maggior numero di bit

30 IMPLEMENTARE GLI ALGORITMI Conversione da stringa a numero si applica la formula richiede la valutazione di un polinomio Metodo di Horner le cifre d k sono note, il valore v va calcolato

31 IMPLEMENTARE GLI ALGORITMI Conversione da stringa a numero una funzione: sToNum() in ingresso: base b stringa di simboli, s lunghezza della stringa, len in uscita: il valore del numero (intero senza segno)

32 IMPLEMENTARE GLI ALGORITMI unsigned long sToNum( unsigned short b, char s[], int len) { }

33 IMPLEMENTARE GLI ALGORITMI unsigned long sToNum( unsigned short b, char s[], int len) { unsigned long v = 0; }

34 IMPLEMENTARE GLI ALGORITMI unsigned long sToNum( unsigned short b, char s[], int len) { unsigned long v = 0; int i = 0; for(i=0; i

35 IMPLEMENTARE GLI ALGORITMI unsigned long sToNum( unsigned short b, char s[], int len) { unsigned long v = 0; int i = 0; for(i=0; i

36 IMPLEMENTARE GLI ALGORITMI unsigned long sToNum( unsigned short b, char s[], int len) { unsigned long v = 0; int i = 0; for(i=0; i

37 IMPLEMENTARE GLI ALGORITMI unsigned valoreCifra(char ch) { come fare per calcolare il valore? } il carattere è rappresentato internamente da un numero, secondo la codifica ASCII è garantito che i caratteri da 0 a 9 sono in sequenza: quindi, se 0 è rappresentato internamente dal numero 1 deve essere rappresentato dal numero +1, 2 deve essere rappresentato dal numero +2, … 9 deve essere rappresentato dal numero +9

38 IMPLEMENTARE GLI ALGORITMI unsigned valoreCifra(char ch) { come fare per calcolare il valore? } conseguenza: la differenza tra un carattere numerico (compreso fra 0 e 9) e il carattere 0 è proprio il valore del simbolo stesso! 0 -0 = - = = ( +1) - = = ( +2) - = 2 … 9 -0 = ( +9) - = 9

39 IMPLEMENTARE GLI ALGORITMI unsigned valoreCifra(char ch) { come fare per calcolare il valore? } lo stesso approccio vale per le lettere da A a F che rappresentano i valori da 10 a 15 nel caso della base sedici (esadecimale); quindi, se A è rappresentato internamente dal numero B deve essere rappresentato dal numero +1, C deve essere rappresentato dal numero +2, … Z deve essere rappresentato dal numero +25

40 IMPLEMENTARE GLI ALGORITMI unsigned valoreCifra(char ch) { come fare per calcolare il valore? } e anche per le minuscole da a a f, che pure rappresentano i valori da 10 a 15: se a è rappresentato internamente dal numero b deve essere rappresentato dal numero +1, c deve essere rappresentato dal numero +2, … z deve essere rappresentato dal numero +25

41 IMPLEMENTARE GLI ALGORITMI unsigned valoreCifra(char ch) { come fare per calcolare il valore? } conseguenza: la differenza tra un carattere alfabetico compreso fra A e F (o fra a e f) e il carattere A (oppure, rispettivamente, a) consente di trovare il valore corrispondente A -A = - = 0 sommando 10 ottengo 10 B -A = ( +1) - = 1 sommando 10 ottengo 11 C -A = ( +2) - = 2 sommando 10 ottengo 12 … F -A = ( +5) - = 5 sommando 10 ottengo 15

42 IMPLEMENTARE GLI ALGORITMI unsigned valoreCifra(char ch) { return ('0'<= ch)&&(ch <= '9') ? ch - '0' : ('a'<= ch)&&(ch <= 'f') ? ch - 'a' + 10 : ('A'<= ch)&&(ch <= 'F') ? ch - 'A' + 10 : BOH; } Qui la funzione è indeterminata (questo caso non dovrebbe mai verificarsi)

43 IMPLEMENTARE GLI ALGORITMI un approccio ricorsivo unsigned long sToNum( unsigned short b, char s[], int len) { }

44 IMPLEMENTARE GLI ALGORITMI un approccio ricorsivo unsigned long sToNum( unsigned short b, char s[], int len) { if (len==0) return 0; else if (len==1) return valoreCifra(s[0]); else return valoreCifra(s[len-1]) + b * sToNum(b,s,len-1) ; }

45 IMPLEMENTARE GLI ALGORITMI Esempio: un cliente main(){ char st[] = "367"; unsigned long val8 = sToNum(8, st,3); unsigned long val10 = sToNum(10,st,3); unsigned long val16 = sToNum(16,st,3); /* quanto valgono le variabili? */ } Provare con entrambe le versioni di sToNum()

46 CONVERSIONE NUMERO / STRINGA Problema: dato un numero, determinare la sua rappresentazione in una base data Soluzione (notazione posizionale): manipolare la formula per dedurre un algoritmo v è noto, le cifre d k vanno calcolate

47 IMPLEMENTARE GLI ALGORITMI Algoritmo delle divisioni successive si divide v per B il resto costituisce la cifra meno significativa il quoziente serve a iterare il procedimento se tale quoziente è zero, lalgoritmo termina; se non lo è, lo si assume come nuovo valore v, e si itera il procedimento con il valore v.

48 IMPLEMENTARE GLI ALGORITMI Conversione da numero a stringa una funzione: numToS() in ingresso: base b numero n in uscita: stringa di simboli, s (lunghezza della stringa) la passiamo come parametro (passa per riferimento) ipotesi: inizialmente è vuota ed è sufficientemente lunga implicita nella stringa

49 IMPLEMENTARE GLI ALGORITMI void numToS(unsigned short b, unsigned long v, char s[]) { 0 > }

50 IMPLEMENTARE GLI ALGORITMI void numToS(unsigned short b, unsigned long v, char s[]) { 0 > } occorre scrivere una procedura void aggiungiInTesta(...) che lo faccia occorre scrivere una funzione char convertiCifra(unsigned int)

51 IMPLEMENTARE GLI ALGORITMI void numToS(unsigned short b, unsigned long v, char s[]) { do { } while (v>0); }

52 IMPLEMENTARE GLI ALGORITMI void numToS(unsigned short b, unsigned long v, char s[]) { do { resto = v % b; } while (v>0); }

53 IMPLEMENTARE GLI ALGORITMI void numToS(unsigned short b, unsigned long v, char s[]) { do { resto = v % b; ch = convertiCifra(resto); aggiungiInTesta(ch,s); } while (v>0); }

54 IMPLEMENTARE GLI ALGORITMI void numToS(unsigned short b, unsigned long v, char s[]) { do { resto = v % b; ch = convertiCifra(resto); aggiungiInTesta(ch,s); v = v / b; } while (v>0); }

55 IMPLEMENTARE GLI ALGORITMI void numToS(unsigned short b, unsigned long v, char s[]) { do { ch = convertiCifra(v % b); aggiungiInTesta(ch,s); v = v / b; } while (v>0); }

56 IMPLEMENTARE GLI ALGORITMI void numToS(unsigned short b, unsigned long v, char s[]) { do { aggiungiInTesta( convertiCifra(v % b), s); v = v / b; } while (v>0); }

57 IMPLEMENTARE GLI ALGORITMI char convertiCifra(unsigned n) { return ( 0 <= n)&&(n <= 9) ? n + '0' : (10 <= n)&&(n <= 15) ? n 'A' : '_'; } Qui la funzione è indeterminata (questo caso non dovrebbe mai verificarsi)

58 IMPLEMENTARE GLI ALGORITMI void aggiungiInTesta( char ch, char st[]) { }

59 IMPLEMENTARE GLI ALGORITMI void aggiungiInTesta( char ch, char st[]) { int i; for(i=strlen(st); i>=0; i--){ st[i+1] = st[i]; } }

60 IMPLEMENTARE GLI ALGORITMI void aggiungiInTesta( char ch, char st[]) { int i; for(i=strlen(st); i>=0; i--) st[i+1] = st[i]; st[0] = ch; }

61 IMPLEMENTARE GLI ALGORITMI Esempio: un cliente main(){ char s2[10] = "", s8[5] = "", s10[5] = "", s16[5] = ""; numToS( 2, 250, s2); numToS( 8, 250, s8); numToS(10, 250, s10); numToS(16, 250, s16); /* quanto valgono le stringhe? */ }

62 IMPLEMENTARE GLI ALGORITMI un approccio ricorsivo void numToS(unsigned short b, unsigned long v, char s[]) { [altrimenti] } È la ricorsione che inverte lordine

63 NUMERI INTERI (con segno) Dominio: Z = { …, -2,-1,0,1,2,3, … } Rappresentare gli interi in un elabora- tore pone alcune problematiche: come rappresentare il segno meno? possibilmente, rendere semplice lesecuzione delle operazioni magari usando gli stessi circuiti usati per i naturali…?

64 NUMERI INTERI (con segno) Due possibilità: rappresentazione in modulo e segno semplice e intuitiva… … ma inefficiente e complessa nella gestione delle operazioni non molto usata in pratica rappresentazione in complemento a due meno intuitiva, costruita ad hoc ma efficiente e capace di rendere semplice la gestione delle operazioni largamente usata

65 NUMERI INTERI (con segno) Rappresentazione in modulo e segno un bit per rappresentare il segno 0 = + 1 = - N-1 bit per rappresentare il valore assoluto Esempi (su 8 bit, MSB rappresenta il segno): + 5= =

66 NUMERI INTERI (con segno) Rappresentazione in modulo e segno Difetti: due diverse rappresentazioni per lo zero + 0 = = occorrono algoritmi speciali per fare le operazioni se si adottano le usuali regole, non è verificata la proprietà X + (-X) = 0 occorrono regole (e quindi circuiti) ad hoc

67 NUMERI INTERI (con segno) Rappresentazione in modulo e segno Difetti: due diverse rappresentazioni per lo zero + 0 = = occorrono algoritmi speciali per fare le operazioni se si adottano le usuali regole, non è verificata la proprietà X + (-X) = 0 occorrono regole (e quindi circuiti) ad hoc Cosè questa roba??? (+5) + (-5) = -10 ???

68 NUMERI INTERI (con segno) Rappresentazione in complemento a due si vogliono poter usare le regole standard per fare le operazioni in particolare, si vuole che X + (-X) = 0 la rappresentazione dello zero sia unica anche a prezzo di una notazione più complessa, meno intuitiva, e magari non (completamente) posizionale !

69 NUMERI INTERI (con segno) Rappresentazione in complemento a due idea: cambiare il peso del bit più significativo da +2 N-1 a -2 N-1 il peso degli altri bit rimane intoccato. Esempi (su 8 bit, MSB ha peso negativo): = = = = = - 3

70 NUMERI INTERI (con segno) Rappresentazione in complemento a due idea: cambiare il peso del bit più significativo da +2 N-1 a -2 N-1 il peso degli altri bit rimane intoccato. Esempi (su 8 bit, MSB ha peso negativo): = = = = = - 3 MSB=0 numero positivo o nullo MSB=1 numero negativo Ma nel secondo caso gli altri bit non sono il valore assoluto!

71 NUMERI INTERI (con segno) Rappresentazione in complemento a due Intervallo di numeri rappresentabili se MSB=0, è come per i naturali con N-1 bit da 0 a 2 N-1 -1Esempio: su 8 bit, [0,+127] se MSB=1, stesso intervallo traslato di -2 N-1 da -2 N-1 a -1Esempio: su 8 bit, [-128,-1] Intervallo globale: [-2 N-1, -2 N-1 -1] su 8 bit,[-128,+127] su 16 bit,[-32768,+32767]

72 NUMERI INTERI (con segno) Rappresentazione in complemento a due Intervallo di numeri rappresentabili se MSB=0, è come per i naturali con N-1 bit da 0 a 2 N-1 -1Esempio: su 8 bit, [0,+127] se MSB=1, stesso intervallo traslato di -2 N-1 da -2 N-1 a -1Esempio: su 8 bit, [-128,-1] Intervallo globale: [-2 N-1, -2 N-1 -1] su 8 bit,[-128,+127] su 16 bit,[-32768,+32767] Lo stesso intervallo prima era tutto sui positivi [0...2 N -1] ora è metà sui positivi e metà sui negativi [- 2 N N-1 -1] lo zero rientra fra i positivi

73 CONVERSIONE NUMERO / STRINGA Osservazione: poiché si opera su N bit, questa è in realtà una aritmetica mod 2 N La rappresentazione del numero v coincide con quella del numero v + 2 N Conseguenza: possiamo in realtà calco- lare la rappresentazione di v = v + 2 N È un naturale!

74 CONVERSIONE NUMERO / STRINGA Per calcolare la rappresentazione di v (v<0) si può calcolare quella di v = v + 2 N Esempio (8 bit, 2 N = 256): per calcolare la rappresentazione di -3 calcoliamo quella del naturale =

75 CONVERSIONE NUMERO / STRINGA Problema: dato un numero negativo v, come determinare praticamente la sua rappresentazione in notazione comple- mento a due? Poiché sappiamo convertire un naturale in stringa binaria, il problema diventa: Partendo dalla rappresentazione binaria del valore assoluto |v|, come giungere alla rappresentazione in complemento a due del valore opposto -|v| ?

76 CONVERSIONE NUMERO / STRINGA Partendo dalla rappresentazione binaria del valore assoluto |v|, come giungere alla rappresentazione in complemento a due del valore opposto -|v| ? Poiché v = - |v| v = v + 2 N = 2 N - |v| tutto sta a riuscire a calcolare 2 N - |v|......che però richiede una sottrazione!

77 CONVERSIONE NUMERO / STRINGA Fortunatamente, 2 N - |v| è una sottrazione solo in apparenza, in quanto: 2 N - |v| = (2 N -1)- |v| + 1 Poiché (2 N -1) è una sequenza di N uni, calcolare (2 N -1)- |v| equivale a invertire tutti i bit della stringa che rappresenta |v|: v = -3|v| (2 N -1)- |v| alla fine basta quindi aggiungere 1.

78 CONVERSIONE NUMERO / STRINGA Algoritmo di complementazione a due Data una stringa di bit che rappresenta il valore v, per ottenere la stringa che rappresenta il valore opposto -v occorre: invertire tutti i bit della stringa data aggiungere 1 al risultato così ottenuto. Esempi v = -3( ) v = -37( ) |v| = 3 v = -3

79 CONVERSIONE STRINGA / NUMERO Problema: data la rappresentazione di un numero intero in notazione complemento a due, determinare il valore del numero Soluzione: applicare la formula oppure: applicare lalgoritmo di complemen- tazione e sfruttare la formula dei naturali per dedurre il valore assoluto del numero.

80 OPERAZIONI SU NUMERI INTERI Rappresentazione in complemento a due Questa rappresentazione rende possibile fare addizioni e sottrazioni con le usuali regole algebriche Un primo esempio: = Funziona!

81 OPERAZIONI SU NUMERI INTERI Rappresentazione in complemento a due In certi casi occorre però una piccola convenzione: ignorare il riporto Un altro esempio: = (1) Funziona… purché si ignori il riporto!

82 OPERAZIONI SU NUMERI INTERI Rappresentazione in complemento a due Nelle sottrazioni, analogamente, può capitare di dover ignorare il prestito +3 - (1) (1) = =-5 = = Ma.. perché ignorando prestiti e riporti funziona??

83 OPERAZIONI: PERCHÉ FUNZIONANO Il motivo è semplice: poiché si opera su N bit, questa è in realtà una aritmetica modulare, di modulo 2 N ignorando riporti (o inserendo prestiti) si introduce un errore pari a 2 N che, quindi, mod 2 N scompare! Nota: possono però prodursi errori se viene invaso il bit più significativo

84 ERRORI NELLE OPERAZIONI In un elaboratore che opera in notazione complemento a due, si ha errore se si supera il massimo intero (positivo o nega- tivo) rappresentabile, cioè se si crea un riporto dal penultimo allultimo bit Esempio: = (Può capitare solo sommando due positivi o due negativi) Errore! Si è invaso il bit di segno, il risultato è negativo!

85 SHIFT CON INTERI IN COMPLEMENTO A 2 La semantica delle operazioni di shift Shift Left (SHL) =moltiplicare per 2 Shift Right (SHR) = dividere per 2 è mantenuta in complemento a due? Sì, purché lo Shift Right (SHR) tenga conto del segno, ossia introduca uno 0 da sinistra, se MSB=0 introduca un 1 da sinistra, se MSB=1 Questo shift si chiama Shift Aritmetico

86 SHIFT CON INTERI IN COMPLEMENTO A 2 Esempio di shift a sinistra: -10 * 4 = -10 SHL SHL 2 = Esempio di shift (aritmetico) a destra: -10 / 4 = -10 SHR SHR 2 = Attenzione: lo Shift Right ha la semantica della divisione intera il quoziente è il massimo intero minore o uguale a X/Y: non è un semplice troncamento!

87 IMPLEMENTARE GLI ALGORITMI Conversione da stringa a numero o si applica direttamente la formula oppure se MSB=0 (positivo) si usa sToNum() se MSB=1 (negativo), si sfrutta la relazione v = v - 2 N, usando sToNum() per ottenere v, e sottraendo 2 N dal risultato. funzione sToInt()

88 IMPLEMENTARE GLI ALGORITMI Conversione da numero a stringa se il numero è positivo si applica lalgoritmo delle divisioni successive (si ottiene MSB=0) se invece il numero è negativo si applica lalgoritmo delle divisioni successive al numero v = v + 2 N (ciò assicura MSB=1) funzione intToS()

89 NUMERI REALI Dominio: R Un soprainsieme degli interi alcune proprietà degli interi potreb- bero non essere più verificate Un numero reale può non essere finita- mente rappresentabile come stringa di simboli in nessuna base: numeri irrazionali (, e,...) in alcune basi: numeri razionali periodici

90 NUMERI REALI La rappresentazione di un numero razio- nale può risultare periodica o meno, a seconda della base adottata In particolare, non è mai periodica se si assume come base il denominatore della sua forma fratta 1/3 = ( ) 10 = (0.1) 3 8/7 = ( ) 10 = (1.1) 7...

91 NUMERI REALI IN DIVERSE BASI Se la rappresentazione di un numero razionale in base B è periodica, allora è periodica anche la rappresentazione dello stesso numero in base B = B/k il viceversa vale solo se B = B n Quindi un numero periodico in base 10 è sicuramente: periodico anche in base 2 (perché 10 = 2*5) un numero periodico in base 2 può essere o non essere periodico in base 10… … ma lo è certamente in base 4, 8, 16,...

92 NUMERI REALI IN DIVERSE BASI Se la rappresentazione di un numero razionale in base B è periodica, allora è periodica anche la rappresentazione dello stesso numero in base B = B/k il viceversa vale solo se B = B n Quindi un numero periodico in base 10 è sicuramente: periodico anche in base 2 (perché 10 = 2*5) un numero periodico in base 2 può essere o non essere periodico in base 10… … ma lo è certamente in base 4, 8, 16,... Intuitivamente: se non bastavano i fattori primi della base B a esprimere il numero in forma finita, la situazione non può certo migliorare avendo meno fattori a disposizione (B = B / k), mentre potrebbe migliorare avendo a disposizione nuovi fattori (B = r * B)

93 NUMERI REALI IN DIVERSE BASI Se la rappresentazione di un numero razionale in base B è periodica, allora è periodica anche la rappresentazione dello stesso numero in base B = B/k il viceversa vale solo se B = B n Quindi un numero periodico in base 10 è sicuramente: periodico anche in base 2 (perché 10 = 2*5) un numero periodico in base 2 può essere o non essere periodico in base 10… … ma lo è certamente in base 4, 8, 16,... Ovviamente, se B = B n, i fattori primi disponibili rimangono gli stessi (cambia solo lesponente a cui compaiono) e quindi la situazione non può cambiare: se era periodico rimane periodico, se era non periodico rimane non periodico.

94 NUMERI REALI: MANTISSA E RESTO Dato un numero reale V, e fissati: una base B un naturale N è sempre possibile esprimere V come somma di due contributi, di cui il primo costituito da esattamente N cifre: V m * B esp + r * B esp-N mantissa (n cifre) esponente (intero) resto (reale)

95 NUMERI REALI: MANTISSA E RESTO Esistono infinite triple m, esp, r che consentono di esprimere, a parità di B e N, lo stesso numero reale V. Ad esempio, se V= , N=4, B=10:

96 RAPPRESENTAZIONE NORMALIZZATA Poiché la rappresentazione deve essere unica, occorre fare una scelta Si sceglie la tripla m, esp, r tale che 1/B m < 1,r<1 Rappresentazione normalizzata

97 RAPPRESENTAZIONE NORMALIZZATA Poiché la rappresentazione deve essere unica, occorre fare una scelta Si sceglie la tripla m, esp, r tale che 1/B m < 1,r<1 Rappresentazione normalizzata In pratica, è quella in cui la man- tissa è <1, e la sua prima cifra dopo la virgola è diversa da 0

98 NUMERI REALI: IL VINCOLO Un numero reale ha spesso una rappre- sentazione infinita in una data base, ma rappresentare infinite cifre è impossibile Ergo, assumiamo come rappresentazio- ne approssimata del numero reale V il solo contributo m * B esp V m * B esp Il resto si trascura Errore di troncamento

99 NUMERI REALI: LE SCELTE OPERATIVE In pratica dobbiamo stabilire: Quante cifre binarie (bit) per la mantissa? Quante cifre per lesponente? Espresso come? Come rappresentare il segno del numero? Osservazione: nel caso B=2, la mantissa normalizzata è compresa fra 1/2 e 1: 1/2 m < 1 il primo bit dopo la virgola è sempre 1.

100 NUMERI REALI: LE SCELTE OPERATIVE In pratica dobbiamo stabilire: Quante cifre binarie (bit) per la mantissa? Quante cifre per lesponente? Espresso come? Come rappresentare il segno del numero? Osservazione: nel caso B=2, la mantissa normalizzata è compresa fra 1/2 e 1: 1/2 m < 1 il primo bit dopo la virgola è sempre 1. Ma allora… si può evitare di scriverlo esplicitamente! In effetti, un bit prefissato non porta informazione!!

101 NUMERI REALI: LE SPECIFICHE DEL C Float (IEEE-32; 4 byte) 1 bit per il segno del numero (0 = +, 1 = -) 8 bit per lesponente esp, codificato con eccesso 126 ( ) valori da 127 a 254 esponenti positivi [1..128] valori da 1 a 125 esponenti negativi [ ] i valori estremi (0 e 255) sono riservati 23 bit per la mantissa m (cioè n=24 bit effettivi, contando lMSB non rappresentato) dal meno significativo al più significativo

102 NUMERI REALI: LE SPECIFICHE DEL C Double (IEEE-64; 8 byte) 1 bit per il segno del numero (0 = +, 1 = -) 11 bit per lesponente esp, codificato con eccesso 1022 ( ) valori da 1023 a 2046 esp. positivi [ ] valori da 1 a 1021 esp. negativi [ ] i valori estremi (0 e 2047) sono riservati 52 bit per la mantissa m (cioè n=53 bit effettivi, contando lMSB non rappresentato) dal meno significativo al più significativo

103 NUMERI REALI: LE SPECIFICHE DEL C Casi particolari: float esp=0, m=0rappresentano 0.0 esp=255, m=0rappresentano esp=255, m 0rappresentano un errore double esp=0, m=0rappresentano 0.0 esp=2047, m=0rappresentano esp=2047, m 0rappresentano un errore

104 NUMERI REALI: LE SPECIFICHE DEL C Valori rappresentabili (lato positivo): float [.1 * * ] [ ] cioè [ 1.2 * … 3.4 * ] double [.1 * * ] [ ] cioè [ 1.3 * … 0.7 * ]

105 NUMERI REALI: CIFRE SIGNIFICATIVE Cifre significative Poiché assumendo V m * B esp trascu- riamo il resto r * B esp-N, e poiché nella forma nornalizzata r<1, lerrore vale: E assoluto B esp-N Esso non è molto significativo in sé: lo è di più se rapportato al valore del numero E relativo B esp-N / (m * B esp ) da cui, poiché 1/B m < 1, E relativo B esp-N / B esp-1 = B 1-N

106 NUMERI REALI: CIFRE SIGNIFICATIVE Cifre significative Se dunque E relativo B 1-N, le cifre decimali significative risultano: float N=24 E r = *log2 = circa 7 cifre decimali significative double N=53 E r = *log2 = circa 15 cifre decimali significative

107 NUMERI REALI: CIFRE SIGNIFICATIVE Cifre significative Se dunque E relativo B 1-N, le cifre decimali significative risultano: float N=24 E r = *log2 = circa 7 cifre decimali significative double N=53 E r = *log2 = circa 15 cifre decimali significative Epsilon di macchina: il più piccolo float che la macchina distingue come diverso da 0 il più piccolo double distin- guibile da 0

108 NUMERI REALI: ESEMPIO 1 Rappresentazione come float di V = 1.0 rappr. normalizzata: V = = * 2 1 segno (1 bit): 0 mantissa (24 bit): esponente (8 bit con eccesso 126) esp= = in memoria:

109 NUMERI REALI: ESEMPIO 2 Rappresentazione come float di V = rappr. normalizzata: V = = * 2 3 segno (1 bit): 0 mantissa (24 bit): esponente (8 bit con eccesso 126) esp= = in memoria:

110 NUMERI REALI: ESEMPIO 3 Rappresentazione come float di V = rappr. normalizzata: V = *2 5 segno (1 bit): 1 mantissa (24 bit): esponente (8 bit con eccesso 126) esp= = in memoria:

111 NUMERI REALI: ESEMPIO 4 Rappresentazione come float di V = rappr. normalizzata: V =.0(0011) 2 periodico! segno (1 bit): 0 mantissa (24 bit): esponente (8 bit con eccesso 126) esp= = in memoria:

112 NUMERI REALI: ESEMPIO 4 Rappresentazione come float di V = rappr. normalizzata: V =.0(0011) 2 periodico! segno (1 bit): 0 mantissa (24 bit): esponente (8 bit con eccesso 126) esp= = in memoria: Errore di troncamento o si tronca o si arrotonda il C arrotonda

113 NUMERI REALI: ESEMPIO 5 Rappresentazione come float di V = rappr. normalizzata: V =.00(1001) 2 periodico! segno (1 bit): 0 mantissa (24 bit): esponente (8 bit con eccesso 126) esp= = in memoria:

114 NUMERI REALI: ESEMPIO 6 Rappresentazione come float di V = -1/3 10 rappr. normalizzata: V = -.(01) 2 periodico! segno (1 bit): 1 mantissa (24 bit): esponente (8 bit con eccesso 126) esp= = in memoria:

115 CONVERSIONE STRINGA / NUMERO Problema: data la rappresentazione di un numero reale in una certa base, determinare il valore del numero Soluzione: applicare la formula Bisogna considerare anche potenze negative di B, con le cifre dopo la virgola.

116 CONVERSIONE STRINGA / NUMERO Esempio: calcolare il valore rappresentato dalla stringa Soluzione: si sommano i singoli contributi V = = Operativamente, con i naturali si valutava il polinomio con il metodo di Horner. E adesso?

117 CONVERSIONE STRINGA / NUMERO Conviene separare il calcolo della parte intera da quello della parte frazionaria: Per il calcolo del valore della parte intera si può usare ancora lalgoritmo di Horner. Per il calcolo del valore della parte frazionaria si può adottare un algoritmo analogo.

118 CONVERSIONE STRINGA / NUMERO Calcolo del valore della parte frazionaria: Lalgoritmo di Horner raccoglieva via via il fattore B, questo raccoglie il fattore 1/B. Esempio: (valuta da destra a sinistra) V = (((((1 / 2 + 0) / 2) + 1) / 2 + 1) / 2) =

119 CONVERSIONE NUMERO / STRINGA Per convertire un numero in una stringa di cifre, lessenziale è riuscire a isolare e ricavare le singole cifre. Nel caso dei naturali, lo si fa con lalgoritmo delle divisioni successive: d k = v k % B il quoziente v k+1 = v k / B consente di iterare Per la parte frazionaria occorre dunque un algoritmo analogo.

120 CONVERSIONE NUMERO / STRINGA Algoritmo delle moltiplicazioni successive si moltiplica v per B la parte intera che si genera costituisce la cifra più significativa la parte frazionaria itera il procedimento se prima o poi la parte frazionaria si azzera, il numero è rappresentabile in forma finita in tale base; se invece si rigenera la stessa serie di cifre, siamo di fronte a un numero periodico in tale base.

121 UN ESEMPIO Calcolare la rappresentazione binaria del numero V= * 2 = 1.75 parte intera = 1, parte frazionaria restante = * 2 = 1.5 parte intera = 1, parte frazionaria restante =.5.5 * 2 = 1.0 parte intera = 1, parte frazionaria restante =.0 Rappresentazione risultante: (non periodico)

122 UN ALTRO ESEMPIO Calcolare la rappresentazione binaria del numero V= * 2 = 0.3 parte intera = 0.3 * 2 = 0.6 parte intera = 0.6 * 2 = 1.2 parte intera = 1.2 * 2 = 0.4 parte intera = 0.4 * 2 = 0.8 parte intera = 0.8 * 2 = 1.6 parte intera = 1.6 * 2 = 1.2si ripete la sequenza!! Rappresentazione (periodica):.00(1001) 2

123 DENTRO LA MACCHINA C E se volessimo spiare dentro la macchi- na virtuale C per vedere la rappresenta- zione fisica dei numeri? Occorre ricavare lindirizzo della variabile esplorare quellarea di memoria byte per byte, per tanti byte quanta la dimensione di quel tipo di dato (es: float = 4 byte) visualizzare ogni byte.

124 DENTRO LA MACCHINA C Un programma: main() { float x; int i; unsigned char* p = (unsigned char*) &x; printf("Float: "); scanf("%f",&x); printf("\nRappr. interna di %f:\n", x); for (i=0; i

125 OPERAZIONI FRA REALI & ERRORI Negli interi, si possono creare errori nelle operazioni, ma gli operandi sono comunque rappresentati esattamente Nei reali, invece, già gli stessi operandi possono essere affetti da errore, a causa dellimpossibilità di rappresentare le infinite cifre dei numeri periodici e irrazionali: è lerrore di troncamento. Errore di troncamento = ogni qual volta il numero di cifre disponibili è insufficiente.

126 ERRORE DI TRONCAMENTO Si manifesta quando il numero è periodico il numero non è periodico ma ha troppe cifre il risultato di unoperazione, a causa un ripor- to, richiede troppe cifre Esempi (mantissa di 8 bit, per semplicità) = * 2 4 (è 15.75) = * 2 9 (è 300) = = * * 2 8 = = * 2 9 (è 310)

127 OPERAZIONI FRA REALI & ERRORI Vi sono poi altre due sorgenti di errore: lerrore di incolonnamento è causato dalla necessità di incolonnare i numeri per poterli sommare o sottrarre lerrore di cancellazione è la conseguenza finale della presenza, a monte, di errori di troncamento, che possono far sì che alcune cifre del risultato non siano affidabili, ovvero siano virtualmente cancellate si manifesta sottraendo numeri simili fra loro.

128 ERRORE DI INCOLONNAMENTO Lerrore di incolonnamento è causato dalla necessità di incolonnare i numeri per poterli sommare o sottrarre per incolonnare due numeri che, in forma normalizzata, hanno esponente diverso occorre necessariamente de-normalizzarne uno si allinea quello di valore assoluto minore a quello di valore assoluto maggiore ciò causa una perdita di cifre significative nel numero che viene de-normalizzato.

129 ERRORE DI INCOLONNAMENTO Esempio: Ipotesi: mantissa di 8 bit (per semplicità) = * 2 7 (senza errore) = * 2 1 (senza errore) Somma: * * * 2 1 = * 2 7 = * 2 7 cifre perse: è lerrore di incolonnamento È 98, non come doveva!

130 ERRORE DI CANCELLAZIONE Lerrore di cancellazione è può presentar- si quando si sottraggono numeri assai simili fra loro accade solo se in almeno uno dei due operan- di, allinizio, vi è stato errore di troncamento consiste nel fatto che si introducono zeri da destra per normalizzare il risultato, ma quegli zeri non sono significativi se ci fossero state le cifre perse allinizio a causa del troncamento, il risultato sarebbe stato diverso.

131 ERRORE DI CANCELLAZIONE Esempio: Ipotesi: mantissa di 8 bit (per semplicità) = * 2 4 (con errore tronc.) = * 2 4 (senza errore) Differenza: * * 2 4 = * 2 4 = * 2 -1 cifre cancellate: è lerrore di cancellazione Sono 0 solo perché abbiamo troncato 15.8 allinizio: avrebbero dovuto essere 11001

132 ERRORI: CONSEGUENZE A causa di questi errori, la proprietà associativa può non essere più verificata Esempio (mantissa di 8 bit, per semplicità) X = 0, * 2 0 (senza errori) Y = 65, * 2 7 (err. troncamento) Z = 64, * 2 7 (senza errori) si ha che (X + Y) - Zè diverso da X + (Y - Z)

133 ERRORI: CONSEGUENZE (X + Y) - Zè diverso da X + (Y - Z) R = * 2 2 R = * 2 2

134 ACCUMULAZIONE DI ERRORI La presenza di errori che si accumulano può portare a risultati totalmente assurdi Esempio: Calcolo di con lalgoritmo di Euclide Una circonferenza di raggio 1 è lunga 2, che può essere approssimata: dallesterno, dal perimetro del poligono regolare di n lati circoscritto dallinterno, dal perimetro del poligono regolare di n lati inscritto

135 ACCUMULAZIONE DI ERRORI Valgono le relazioni: l n = lato del poligono di n lati inscritto L n = lato del poligono di n lati circoscritto = 2 l / (4 - l 2 )

136 ACCUMULAZIONE DI ERRORI Una funzione che implementa lalgoritmo: void pigrecoFloat(void) { float eps, LN, smpinf, smpsup, nlati, OC2, diff; printf("Calcolo di pigreco con FLOAT. " "Precisione [1e-8] ? "); scanf("%f", &eps); nlati = 4.0; LN = sqrt(2.0); do { OC2 = sqrt(4.0 - LN * LN); nlati *= 2.0; diff = OC2; LN = sqrt(diff); smpinf = LN * nlati / 2.0; smpsup = LN * nlati / OC2; printf("nl=%10.0f d2=%f piInf=%f piSup=%f\n", nlati, OC2, smpinf, smpsup); } while ((smpsup-smpinf >= eps) && (nlati < 1e+19)); }

137 ACCUMULAZIONE DI ERRORI … e il suo output: Calcolo di pigreco con FLOAT. Precisione ? 1E-8 nl= 8 d2= piInf= piSup = nl= 16 d2= piInf= piSup = nl= 32 d2= piInf= piSup = nl= 64 d2= piInf= piSup = nl= 128 d2= piInf= piSup = nl= 256 d2= piInf= piSup = nl= 512 d2= piInf= piSup = nl= 1024 d2= piInf= piSup = nl= 2048 d2= piInf= piSup = nl= 4096 d2= piInf= piSup = nl= 8192 d2= piInf= piSup = nl=16384 d2= piInf= piSup = nl=32768 d2= piInf= piSup =

138 CONVERSIONE DA INTERI A REALI Nelle espressioni che coinvolgono interi e reali, i numeri interi devono essere con- vertiti in rappresentazione reale per poter eseguire le operazioni Non si può semplicemente spostare la virgola, perché la rappresentazione in complemento a due non è posizionale Esempio: N = -8 (intero, 1 byte) R = -8.0 =.1* segnomantissa esp (126+3)

139 ESERCIZIO Dire come vengono svolte le seguenti espressioni, calcolandole passo passo Ipotesi: interi rappresentati in complemento a due su un byte (8 bit da -128 a +127) reali rappresentati su due byte (1 bit di segno, 8 di esponente con eccesso 126, 7 di mantissa) Esercizio int i=10; float a=0.6, b, c; b = a + i - 8; c = a + (i - 8);

140 FUNZIONI DI CONVERSIONE STANDARD La libreria standard stdlib fornisce quasi tutte le funzioni di conversione già pronte da stringa a numero atoi() da stringa a intero atol()da stringa a long atof() da stringa a double da numero a stringa (solo Turbo C) itoa() da intero a stringa ltoa()da long a stringa fcvt() da double a stringa Il C standard usa sprintf(), che vedremo più avanti.


Scaricare ppt "RAPPRESENTAZIONE DELLINFORMAZIONE Internamente a un elaboratore, ogni informazione è rappresentata tramite sequenze di bit (cifre binarie) Una sequenza."

Presentazioni simili


Annunci Google