Scaricare la presentazione
La presentazione è in caricamento. Aspetta per favore
1
RAPPRESENTAZIONE DELL’INFORMAZIONE
Internamente a un elaboratore, ogni informazione è rappresentata tramite sequenze di bit (cifre binarie) Una sequenza di bit non dice “cosa” essa rappresenta: l’interpretazione è negli occhi di chi guarda Ad esempio, può rappresentare: l’intero 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)
Non posizionali: hanno regole proprie, che rendono spesso assai complessa l'esecuzione dei calcoli 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, , ... 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 dn-1 … d2 d1 d0 Posizione n-1: pesa Bn-1 Posizione 1: pesa B1 Posizione 0: pesa B0 (unità)
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, dk = 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 27-20 = 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 dk vanno calcolate
16
CONVERSIONE NUMERO / STRINGA
d0 si può ricavare come resto della divisione intera v / B tale divisione ha per quoziente q = d1 + B * ( d2 + 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
Algoritmo delle divisioni successive d0 si può ricavare come resto della divisione intera v / B tale divisione ha per quoziente q = d1 + B * ( d2 + 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)
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, l’algoritmo 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 B1 = 2 “ ” B2 = 8 “103” B3 = 10 “67” B4 = 16 “43”
21
RAPPRESENTAZIONI IN BASI DIVERSE
Tuttavia, diventano correlate se le basi considerate sono una potenza una dell’altra: B2 = (B1 )N Allora, N cifre nella rappresentazione in base B1 corrispondono esattamente a 1 cifra nella rappresentazione in base B2
22
RAPPRESENTAZIONI IN BASI DIVERSE
Tuttavia, diventano correlate se le basi considerate sono una potenza una dell’altra Esempio: B1 = 2 “ ” B2 = 8 = 23 = (B1)3 “103” B3 = 10 “67” B4 = 16 = 24 = (B1)4 “43” 8 = cifra ottale = 3 cifre binarie 16 = cifra hex = 4 cifre binarie
23
RAPPRESENTAZIONI IN BASI DIVERSE
Conseguenza: se le basi considerate sono una potenza una dell’altra, per passare dalla rappresentazione di un numero in una base B1 alla sua rappre-sentazione in un’altra base B2 = (B1 )N basta sostituire ordinatamente N cifre della rappresentazione B1 con 1 cifra della rappresentazione B2
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 l’esistenza di un resto) In un elaboratore, invece, si possono generare errori, a causa dell’impossibilità di rappresentare tutti gli infiniti numeri in particolare, con N bit il massimo numero rappresentabile è 2N-1 qualunque operazione che implichi un risultato maggiore sarà errata OVERFLOW
29
ERRORI NELLE OPERAZIONI
Teoricamente Praticamente 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 dk 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) { <finché ci sono simboli in s> <calcola il valore del simbolo s[i]> <aggiorna il valore v> <alla fine, v rappresenta il valore cercato> }
33
IMPLEMENTARE GLI ALGORITMI
unsigned long sToNum( unsigned short b, char s[], int len) { unsigned long v = 0; <finché ci sono simboli in s> <calcola il valore del simbolo s[i]> <aggiorna il valore v> <alla fine, v rappresenta il valore cercato> }
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<len; i++) { <calcola il valore del simbolo s[i]> <aggiorna il valore v> } <alla fine, v rappresenta il valore cercato>
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<len; i++) { val = valoreCifra(s[i]); v = b * v + val; /* Horner */ } <alla fine, v rappresenta il valore cercato>
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<len; i++) { v = b * v + valoreCifra(s[i]);; } return v; valoreCifra(), chi era costei ?
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’ = - = 0 ‘1’ -’0’ = (+1) - = 1 ‘2’ -’0’ = (+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) { <se len=0, il valore è 0> <se len=1, il valore è val(s[0])> <in ogni altro caso, il valore è val(s[len-1]) + b * sToNum(b,s,len-1) > }
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 dk 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, l’algoritmo 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[]) { <ripeti> <calcola il resto v%B> <calcola il carattere corrispondente e inseriscilo in testa alla stringa> <sostituisci a v il nuovo valore v/B > <per tutto il tempo che v>0 > }
50
IMPLEMENTARE GLI ALGORITMI
void numToS(unsigned short b, unsigned long v, char s[]) { <ripeti> <calcola il resto v%B> <calcola il carattere corrispondente> <inseriscilo in testa alla stringa> <sostituisci a v il nuovo valore v/B > <per tutto il tempo che v>0 > } occorre scrivere una funzione char convertiCifra(unsigned int) occorre scrivere una procedura void aggiungiInTesta(...) che lo faccia
51
IMPLEMENTARE GLI ALGORITMI
void numToS(unsigned short b, unsigned long v, char s[]) { do { <calcola il resto v%B> <calcola il carattere corrispondente e inseriscilo in testa alla stringa> <sostituisci a v il nuovo valore v/B > } while (v>0); }
52
IMPLEMENTARE GLI ALGORITMI
void numToS(unsigned short b, unsigned long v, char s[]) { do { resto = v % b; <calcola il carattere corrispondente e inseriscilo in testa alla stringa> <sostituisci a v il nuovo valore 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); <sostituisci a v il nuovo valore v/B > } 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[]) { <sposta tutti i caratteri a destra di una posizione, per fare posto al nuovo carattere> <copia il nuovo carattere nella prima posi- zione della stringa> }
59
IMPLEMENTARE GLI ALGORITMI
void aggiungiInTesta( char ch, char st[]) { int i; for(i=strlen(st); i>=0; i--){ st[i+1] = st[i]; } <copia il nuovo carattere nella prima posi- zione della stringa> }
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[]) { <calcola il carattere corrispondente al resto v%B e inseriscilo in coda alla stringa> <se v=0, ritorna> [altrimenti] <calcola la stringa corrisp. a v/B> } È la ricorsione che “inverte l’ordine”
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 l’esecuzione 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 = = - N-1 bit per rappresentare il valore assoluto Esempi (su 8 bit, MSB rappresenta il segno): + 5 = - 36 =
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)
Cos’è questa roba??? (+5) + (-5) = -10 ??? 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
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 +2N-1 a -2N-1 il peso degli altri bit rimane intoccato. Esempi (su 8 bit, MSB ha peso negativo): = + 5 = = = = - 3
70
NUMERI INTERI (con segno)
Rappresentazione in complemento a due idea: cambiare il peso del bit più significativo da +2N-1 a -2N-1 il peso degli altri bit rimane intoccato. Esempi (su 8 bit, MSB ha peso negativo): = + 5 = = = = - 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 2N-1-1 Esempio: su 8 bit, [0,+127] se MSB=1, stesso intervallo traslato di -2N-1 da -2N-1 a -1 Esempio: su 8 bit, [-128,-1] Intervallo globale: [-2N-1 , -2N-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 2N-1-1 Esempio: su 8 bit, [0,+127] se MSB=1, stesso intervallo traslato di -2N-1 da -2N-1 a -1 Esempio: su 8 bit, [-128,-1] Intervallo globale: [-2N-1 , -2N-1-1] su 8 bit, [-128,+127] su 16 bit, [-32768,+32767] Lo stesso intervallo prima era tutto sui positivi [0...2N-1] ora è metà sui positivi e metà sui negativi [- 2N 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 2N La rappresentazione del numero v coincide con quella del numero v + 2N Conseguenza: possiamo in realtà calco-lare la rappresentazione di v’ = v + 2N È un naturale!
74
CONVERSIONE NUMERO / STRINGA
Per calcolare la rappresentazione di v (v<0) si può calcolare quella di v’ = v + 2N Esempio (8 bit, 2N = 256): per calcolare la rappresentazione di -3 calcoliamo quella del naturale 253 -3 = “ ” 253 “ ”
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 + 2N = 2N - |v| tutto sta a riuscire a calcolare 2N - |v|... ...che però richiede una sottrazione!
77
CONVERSIONE NUMERO / STRINGA
Fortunatamente, 2N - |v| è una sottrazione solo in apparenza, in quanto: 2N - |v| = (2N -1)- |v| + 1 Poiché (2N -1) è una sequenza di N “uni”, calcolare (2N -1)- |v| equivale a invertire tutti i bit della stringa che rappresenta |v|: v = -3 |v| “ ” (2N -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 (3 “ ” ) “ ” v = -37 (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 l’algoritmo 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: +3 = 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: -5 = -6 (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 = = -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 2N ignorando riporti (o inserendo prestiti) si introduce un errore pari a 2N che, quindi, mod 2N 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 all’ultimo bit Esempio: 75 = (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 2 SHL 2 = -40 Esempio di shift (aritmetico) a destra: -10 / 4 = -10 SHR 2 SHR 2 = -3 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’ - 2N, usando sToNum() per ottenere v’, e sottraendo 2N dal risultato. funzione sToInt()
88
IMPLEMENTARE GLI ALGORITMI
Conversione da numero a stringa se il numero è positivo si applica l’algoritmo delle divisioni successive (si ottiene MSB=0) se invece il numero è negativo si applica l’algoritmo delle divisioni successive al numero v’ = v + 2N (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’ = Bn 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’ = Bn 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
Ovviamente, se B’ = Bn, i fattori primi disponibili rimangono gli stessi (cambia solo l’esponente a cui compaiono) e quindi la situazione non può cambiare: se era periodico rimane periodico, se era non periodico rimane non periodico. 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’ = Bn 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, ...
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 * Besp + r * Besp-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
In pratica, è quella in cui la man-tissa è <1, e la sua prima cifra dopo la virgola è diversa da 0 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
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 * Besp V m * Besp 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 l’esponente? 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 l’esponente? 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 l’esponente esp, codificato con eccesso 126 (28-1-2) 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 l’MSB 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 l’esponente 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 l’MSB non rappresentato) dal meno significativo al più significativo
103
NUMERI REALI: LE SPECIFICHE DEL C
Casi particolari: float esp=0, m=0 rappresentano 0.0 esp=255, m=0 rappresentano esp=255, m0 rappresentano un errore double esp=2047, m=0 rappresentano esp=2047, m0 rappresentano un errore
104
NUMERI REALI: LE SPECIFICHE DEL C
Valori rappresentabili (lato positivo): float [ .1 * * ] [ ] cioè [ 1.2 * … 3.4 * 1038 ] double [ .1 * * ] [ ] cioè [ 1.3 * … 0.7 * ]
105
NUMERI REALI: CIFRE SIGNIFICATIVE
Poiché assumendo V m * Besp trascu- riamo il resto r * Besp-N, e poiché nella forma nornalizzata r<1, l’errore vale: Eassoluto Besp-N Esso non è molto significativo in sé: lo è di più se rapportato al valore del numero Erelativo Besp-N / (m * Besp) da cui, poiché 1/B m < 1, Erelativo Besp-N / Besp-1 = B1-N
106
NUMERI REALI: CIFRE SIGNIFICATIVE
Se dunque Erelativo B1-N , le cifre decimali significative risultano: float N=24 Er 2-23 = 10-23*log2 = 10-7 circa 7 cifre decimali significative double N=53 Er 2-52 = 10-52*log2 = 10-15 circa 15 cifre decimali significative
107
NUMERI REALI: CIFRE SIGNIFICATIVE
Se dunque Erelativo B1-N , le cifre decimali significative risultano: float N=24 Er 2-23 = 10-23*log2 = 10-7 circa 7 cifre decimali significative double N=53 Er 2-52 = 10-52*log2 = 10-15 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
Rappresentazione come float di V = 1.0
NUMERI REALI: ESEMPIO 1 Rappresentazione come float di V = 1.0 rappr. normalizzata: V = = 0.12 * 21 segno (1 bit): 0 mantissa (24 bit): esponente (8 bit con eccesso 126) esp=1 = 127 in memoria:
109
Rappresentazione come float di V = 5.875
NUMERI REALI: ESEMPIO 2 Rappresentazione come float di V = 5.875 rappr. normalizzata: V = = * 23 segno (1 bit): 0 mantissa (24 bit): esponente (8 bit con eccesso 126) esp=3 = 129 in memoria:
110
Rappresentazione come float di V = -29.1875
NUMERI REALI: ESEMPIO 3 Rappresentazione come float di V = rappr. normalizzata: V = *25 segno (1 bit): 1 mantissa (24 bit): esponente (8 bit con eccesso 126) esp=5 = 131 in memoria:
111
Rappresentazione come float di V = 0.110
NUMERI REALI: ESEMPIO 4 Rappresentazione come float di V = 0.110 rappr. normalizzata: V =.0(0011)2 periodico! segno (1 bit): 0 mantissa (24 bit): esponente (8 bit con eccesso 126) esp=-3 = 123 in memoria:
112
Rappresentazione come float di V = 0.110
NUMERI REALI: ESEMPIO 4 Rappresentazione come float di V = 0.110 rappr. normalizzata: V =.0(0011)2 periodico! segno (1 bit): 0 mantissa (24 bit): esponente (8 bit con eccesso 126) esp=-3 = 123 in memoria: Errore di troncamento o si tronca o si arrotonda il C arrotonda
113
Rappresentazione come float di V = 0.1510
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=-2 = 124 in memoria:
114
Rappresentazione come float di V = -1/310
NUMERI REALI: ESEMPIO 6 Rappresentazione come float di V = -1/310 rappr. normalizzata: V = -.(01)2 periodico! segno (1 bit): 1 mantissa (24 bit): esponente (8 bit con eccesso 126) esp=-1 = 125 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 l’algoritmo 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: L’algoritmo 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, l’essenziale è riuscire a “isolare” e ricavare le singole cifre. Nel caso dei naturali, lo si fa con l’algoritmo delle divisioni successive: dk = vk % B il quoziente vk+1 = vk / 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
Calcolare la rappresentazione binaria del numero V=0.87510
UN ESEMPIO Calcolare la rappresentazione binaria del numero V= .875 * 2 = 1.75 parte intera = 1, parte frazionaria restante = .75 .75 * 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
Calcolare la rappresentazione binaria del numero V=0.1510
UN ALTRO ESEMPIO Calcolare la rappresentazione binaria del numero V=0.1510 .15 * 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.2 si 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 l’indirizzo della variabile esplorare quell’area 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() {
cast: ci serve un puntatore a byte, che in C si esprime come “unsigned char” 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<sizeof(x); i++) printf("Byte %i:\t%X\n",i, p[i] ); printf("\n"); } i-esimo byte sizeof: dà la dimensione in byte di quella variabile esadecimale
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 dell’impossibilità di rappresentare le infinite cifre dei numeri periodici e irrazionali: è l’errore di troncamento. Errore di troncamento = ogni qual volta il numero di cifre disponibili è insufficiente.
126
Esempi (mantissa di 8 bit, per semplicità)
ERRORE DI TRONCAMENTO Si manifesta quando il numero è periodico il numero non è periodico ma ha troppe cifre il risultato di un’operazione, a causa un ripor-to, richiede troppe cifre Esempi (mantissa di 8 bit, per semplicità) = * 24 (è 15.75) = * (è 300) = = * * 28 = = * (è 310)
127
OPERAZIONI FRA REALI & ERRORI
Vi sono poi altre due sorgenti di errore: l’errore di incolonnamento è causato dalla necessità di incolonnare i numeri per poterli sommare o sottrarre l’errore 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
L’errore 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à) = * 27 (senza errore) = * 21 (senza errore) Somma: * * 27 + * 21 = * 27 = * 27 cifre perse: è l’errore di incolonnamento È 98, non come doveva!
130
ERRORE DI CANCELLAZIONE
L’errore di cancellazione è può presentar-si quando si sottraggono numeri assai simili fra loro accade solo se in almeno uno dei due operan-di, all’inizio, 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 all’inizio a causa del troncamento, il risultato sarebbe stato diverso.
131
ERRORE DI CANCELLAZIONE
Esempio: Ipotesi: mantissa di 8 bit (per semplicità) = * 24 (con errore tronc.) = * 24 (senza errore) Differenza: * 24 - * 24 = * 24 = * 2-1 cifre cancellate: è l’errore di cancellazione Sono 0 solo perché abbiamo troncato all’inizio: avrebbero dovuto essere 11001
132
Esempio (mantissa di 8 bit, per semplicità)
ERRORI: CONSEGUENZE A causa di questi errori, la proprietà associativa può non essere più verificata Esempio (mantissa di 8 bit, per semplicità) X = 0,75 * 20 (senza errori) Y = 65,6 * 27 (err. troncamento) Z = 64,0 * 27 (senza errori) si ha che (X + Y) - Z è diverso da X + (Y - Z)
133
ERRORI: CONSEGUENZE (X + Y) - Z è diverso da X + (Y - Z)
134
ACCUMULAZIONE DI ERRORI
La presenza di errori che si accumulano può portare a risultati totalmente assurdi Esempio: Calcolo di con l’algoritmo di Euclide Una circonferenza di raggio 1 è lunga 2, che può essere approssimata: dall’esterno, dal perimetro del poligono regolare di n lati circoscritto dall’interno, dal perimetro del poligono regolare di n lati inscritto
135
ACCUMULAZIONE DI ERRORI
Valgono le relazioni: ln = lato del poligono di n lati inscritto Ln = lato del poligono di n lati circoscritto = 2 l / (4 - l2)
136
ACCUMULAZIONE DI ERRORI
Una funzione che implementa l’algoritmo: 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= d2= piInf= piSup = nl= d2= piInf= piSup = nl= d2= piInf= piSup = nl= d2= piInf= piSup = nl= d2= piInf= piSup = nl= d2= piInf= piSup = nl= d2= piInf= piSup = nl= d2= piInf= piSup = nl= d2= piInf= piSup = nl= d2= piInf= piSup = nl= d2= piInf= piSup = nl= d2= piInf= piSup = nl= 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* segno mantissa 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.
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.