rappresentazione dell’informazionelia.disi.unibo.it/.../05-rappresentazionenumeri.pdf ·...
TRANSCRIPT
1
Internamente a un elaboratore, ogni
informazione è rappresentata tramite
sequenze di bit (cifre binarie)
Una sequenza di bit non dice “che cosa”
essa rappresenta
Ad esempio, 01000001 può rappresentare:
l’intero 65, il carattere ‘A’, il boolean ‘vero’, …
… il valore di un segnale musicale,
… il colore di un pixel sullo schermo...
RAPPRESENTAZIONE DELL’INFORMAZIONE
2
Originariamente la rappresentazione binaria è stata utilizzata per
la codifica dei numeri e dei caratteri
Oggi si digitalizzano comunemente anche suoni, immagini, video e
altre informazioni (informazioni multimediali)
La rappresentazione delle informazioni numeriche è ovviamente
di particolare rilevanza
A titolo di esempio, nel corso ci concentreremo sulla
rappresentazione dei numeri interi (senza o con segno)
Dominio: N = {…,-2, -1, 0, 1, 2, …}
INFORMAZIONI NUMERICHE
3
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…
Risulta difficile l’utilizzo di regole
generali per il calcolo
posizionale
1, 2, .. 10, 11, ... 200, ...
Risulta semplice l’individuazione di
regole generali per il calcolo
NUMERI NATURALI (interi senza segno)
4
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 di rappresentazione su N cifre:
dn-1 … d2 d1 d0
NOTAZIONE POSIZIONALE
5
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 0:
pesa B0 (unità)
Posizione 1:
pesa B1
Posizione n-1:
pesa Bn-1
NOTAZIONE POSIZIONALE
6
In formula:
dove B = base
ogni cifra dk rappresenta un valore fra 0 e B-1
v d Bk
k
k
n
0
1
Esempio (base B=4):
1 2 1 3
d3 d2 d1 d0
Valore = 1 * B3 + 2 * B2 + 1 * B1 + 3 * B0 = centotre
NOTAZIONE POSIZIONALE
7
Quindi, una sequenza di cifre non è inter-
pretabile se non si precisa la base in cui è
espressa
Esempi:
Stringa Base Alfabeto Calcolo valore Valore
“12” quattro {0,1,2,3} 4 * 1 + 2 sei
“12” otto {0,1,...,7} 8 * 1 + 2 dieci
“12” dieci {0,1,...,9} 10 * 1 + 2 dodici
“12” sedici {0,..,9, A,., F} 16 * 1 + 2 diciotto
NOTAZIONE POSIZIONALE
8
Inversamente, ogni numero può essere
espresso, in modo univoco, come
sequenza di cifre in una qualunque base
Esempi: Numero Base Alfabeto Rappresentazione
venti due {0,1} “10100”
venti otto {0,1,...,7} “24”
venti dieci {0,1,...,9} “20”
venti sedici {0,..,9, A,., F} “14”
NOTAZIONE POSIZIONALE
Non bisogna confondere un numero con
una sua RAPPRESENTAZIONE!
Rappresentazione in base p
Metodo posizionale: ogni cifra ha un peso
Esempio: 123 = 100 +20 +3
• Di solito noi usiamo la base decimale
• Un numero generico di m cifre è rappresentato in
base p dalla sequenza: an, an-1, an-2,..., a0
an : cifra più significativa
a0 : cifra meno significativa
n = m-1
ai {0, 1, ..., p-1}
• Un numero naturale N, composto da m cifre, in base
p, si esprime come:
Rappresentazione in base p
n
i
i
i
n
n
n
np papapapapaN0
0
0
1
1
1
1 ...
• Esempio in base decimale (p=10):
58710 = 7·100 + 8·101 + 5·102
• Posso rappresentare i numeri nell’intervallo discreto:
[0 , pm - 1]
• Base binaria: p=2; cifre ai {0, 1} chiamate bit (binary digit)
• Otto bit sono chiamati byte
Esempio, con m=5:
110112 = (1·24+1·23+0·22+1·21+1·20)10 = 2710
• Posso rappresentare i numeri nell’intervallo discreto: [0 , 2m -1]
• Esempio con m=8: rappresento numeri binari: [000000002 , 111111112], ovvero: [0 , 255]
Rappresentazione in base due
12
Con N bit, si possono fare 2N combinazioni
Si rappresentano così i numeri da 0 a 2N-1
Esempi con 8 bit, [ 0 …. 255 ]
In C: unsigned char = byte
con 16 bit, [ 0 …. 65.535 ]
In C: unsigned short int (su alcuni compilatori)
In C: unsigned int (su alcuni compilatori)
con 32 bit, [ 0 …. 4.294.967.295 ]
In C: unsigned int (su alcuni compilatori)
In C: unsigned long int (su molti compilatori)
NUMERI NATURALI: valori rappresentabili
Conversioni di base
• Per convertire da base due a base 10:
– Usare la sommatoria illustrata nella slide precedente
• Per convertire da base dieci a base due:
– Metodo delle divisioni successive:
Metodo delle divisioni successive
operazione quoziente resto
27:2 13 1 a0
13:2 6 1 a1
6:2 3 0 a2
3:2 1 1 a3
1:2 0 1 a4
Esempio: Esprimere in base 2 il numero naturale 2710
2710= (11011) 2
Operazioni sui Numeri Binari:
Addizione • Le cifre sono 0 e 1 ed il riporto (carry) può essere solo 1
Riporto
precedente Somma Risultato Riporto
0 0 + 0 0 0
0 0 + 1
1 + 0 1 0
0 1 + 1 0 1
1 0 + 0 1 0
1 0 + 1
1 + 0 0 1
1 1 + 1 1 1
Addizione e riporto (carry) • Esempio:
1 riporto
0101 + (510)
1001 = (910)
------
1110 (1410)
111 riporti
1111 + (1510)
1010 = (1010)
-------
carry 11001 (2510 se uso 5 bit; 910 se considero 4 bit: OVERFLOW)
Sottrazione
• Le cifre sono 0 e 1 ed il prestito può essere solo 1 Prestito
precedente differenza Risultato Prestito
0 0 - 0 0 0
0 1 - 0 1 0
0 1 - 1 0 0
0 0 - 1 1 1
1 0 - 0 1 1
1 1 - 0 0 0
1 1 - 1 1 1
1 0 - 1 0 1
Basi ottale ed esadecimale • Base ottale: p=8; ai {0, 1, 2, 3, 4, 5, 6, 7}
– Esempio: 2348 = (2·82+3·81+4·80)10 = 15610
• Base esadecimale: p=16; ai {0, 1, 2, …, 9, A, B, C, D, E, F} – Esempio: B7F16 = (11·162+7·161+15·160)10 = 294310
– Notare: “11” al posto di “B” e “15” al posto di “F”, i loro
equivalenti in base dieci
• Conversione dalla base 2 alla base 8 o 16: si considerano gruppi di tre o 4 cifre binarie
• Es: 001 010 110 111 si traduce ogni tripla nella corrispondente cifra ottale
19
Esempio (supponendo di avere solo 7 bit per la rappresentazione)
60 + 0111100
99 = 1100011
----- --------
135 10011111
• Questo errore si chiama overflow
• Può capitare sommando due numeri dello stesso segno il cui risultato non sia rappresentabile utilizzando il numero massimo di bit designati
Errore!
Massimo numero
rappresentabile:
27-1 cioè 127
ERRORI (primissimo assaggio )
20
Un elaboratore rappresenta numeri interi su
8 bit dei quali 7 sono dedicati alla
rappresentazione del modulo del numero e
uno al suo segno. Indicare come viene
svolta la seguente operazione aritmetica:
59 – 27
in codifica binaria
ESERCIZIO RAPPRESENTAZIONE
21
Tra i (moduli dei) due numeri si esegue una sottrazione:
0111011
- 0011011
-------
0100000
che vale 32 in base 10
ESERCIZIO RAPPRESENTAZIONE Soluzione
59 0 0111011
-27 1 0011011
22
Che cosa avremmo dovuto fare se avessimo avuto
27-59 ?
Avremmo dovuto invertire i due numeri, calcolare il risultato, e poi ricordarci di mettere a 1 il bit rappresentante il segno
Per ovviare a tale problema, si usa la notazione in “complemento a 2” (vedi nel seguito), che permette di eseguire tutte le differenze tramite semplici somme
DIFFERENZE TRA NUMERI BINARI
23
INFORMAZIONI NUMERICHE
La rappresentazione delle informazioni
numeriche è di particolare rilevanza
Abbiamo già discusso i numeri naturali
(interi senza segno) N = { 0,1,2,3, …}
Come rappresentare invece i numeri interi
(con segno)?
Z = { -x, xN - {0}} N
24
NUMERI INTERI (con segno)
Dominio: Z = { …, -2,-1,0,1,2,3, … }
Rappresentare gli interi in un elaboratore pone alcune problematiche:
• come rappresentare il “segno meno”?
• possibilmente, come rendere semplice l’esecuzione delle operazioni aritmetiche?
Magari riutilizzando gli stessi algoritmi e gli stessi circuiti già usati per i numeri interi senza segno
25
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 nelle architetture reali di CPU
26
NUMERI INTERI (con segno)
Rappresentazione in modulo e segno
1 bit per rappresentare il segno
0 + 1 -
(N-1) bit per il valore assoluto
Esempi (su 8 bit, Most Significant Bit –MSB- rappresenta il segno):
+ 5 = 0 0000101
- 36 = 1 0100100
27
NUMERI INTERI (con segno)
Rappresentazione in modulo e segno
Due difetti principali:
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
due diverse rappresentazioni per lo zero
+ 0 = 00000000 - 0 = 10000000
Ad esempio:
(+5) + (-5) = -10 ???
+5 0 0000101
-5 1 0000101
--- ----------
0 1 0001010
28
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
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
Rappresentazioni dei Numeri
• Il bit più significativo rappresenta il segno del numero: 0
per positivi, 1 per negativi
• La rappresentazione di un numero positivo si ottiene
codificando il valore assoluto del numero con i bit
restanti
• La rappresentazione di un numero negativo si
ottiene in tre passi:
– Si rappresenta in complemento a due il numero positivo
con lo stesso valore assoluto del numero negativo da
codificare
– Si invertono tutti i bit
– Si somma 1 al risultato ottenuto al passo precedente
Quindi:
• per calcolare il numero negativo -|v|
occorre:
• prima invertire tutti i bit della
rappresenta-zione di |v| poi aggiungere 1
al risultato
Esempio
• Esempio con 4 bit a disposizione
• +5 -> 0101
• -5 -> :
– La rappresentazione del complemento a due
di +5 è 0101
– Invertendo tutti i bit si ottiene 1010
– Sommando 1 si ottiene 1011 -> -5
Ottenere un numero con segno data
la rappresentazione in CPL2
• Se il primo bit è 0 il numero è positivo: per calcolarne il
valore assoluto si esegue la conversione da binario a
decimale
• Se il primo bit è 1 il numero è negativo:
– Si ignora il primo bit
– Si invertono i bit restanti
– Si converte da binario a decimale
– Si somma 1 al numero così ottenuto per ottenere il valore
assoluto del numero negativo
– Es. 1011. si esclude il primo bit. Invertendo 011 si ottiene
100 che è la codifica di 4, si aggiunge 1, quindi si ottiene
il valore assoluto 5, il risultato è -5
• Usando m bit: (-N)CPL2 = (2m - N10)2
• Esempio (m=3): (-N)CPL2 = (23 - N10)2
Complemento a due (CPL2)
Num. intero base
10 Trasformazione
Num. intero, base
2, CPL2, m=3
-4 8 - 4 = 4 410 = 100
-3 8 - 3 = 5 510 = 101
-2 8 - 2 = 6 610 = 110
-1 8 - 1 = 7 710 = 111
0 nessuna 010 = 000
1 nessuna 110 = 001
2 nessuna 210 = 010
3 nessuna 310 = 011
Complemento a due (CPL2)
• Posso rappresentare i numeri nell’intervallo discreto: [-2m-1 , 2m-1 - 1] – Asimmetria tra negativi e positivi
– Esempio (m=8): [-128, +127], perché -27 = -128 e 27 - 1 = +127
• Tutti i numeri negativi cominciano con il bit più significativo posto a “1”, mentre tutti i positivi e lo zero iniziano con uno “0”
Somma e sottrazione in CPL2
• Somma: come per i naturali
• Sottrazione: N1 - N2 = N1 + (-N2)CPL2
• Carry:
– Il carry non viene considerato!
• Overflow:
– Se, sommando due interi di m bit dotati di segno
concorde, ottengo un risultato di segno discorde (sempre
considerando m bit), allora si ha un overflow (il risultato
non è codificabile su m bit) e l’operazione è errata
– L’overflow non può verificarsi se gli operandi sono di
segno discorde
Rappresentazione in eccesso
Nella notazione in eccesso una parte di numerali disponibili si usa per
rappresentare i numeri negativi e la restante per rappresentare lo
zero e I numeri positivi. Si trasla l’origine dell’asse che rappresenta i
numeri naturali e si usano I numerali che precedono l’origine cosi’
determinata per rappresentare I numeri negativi
Se n=8 si possono rappresentare tutti I numeri da 0 a 255. Con N=127
ho due intervalli da 0 a 126 che si usano per rappresentare I numeri
negativi da -127 a 1, il numerale 127 che rappresenta lo 0 e I
restantipositivi da 1 a128
38
Rappresentazione dei Numeri:
NUMERI RAZIONALI
Ovviamente rappresentazione posizionale vale anche per numeri “con virgola”, avendo l’accortezza di pesare le cifre a dx della virgola con potenze negative della base e via via decerescenti mano a mano che ci si sposta verso destra. Un numero a con N cifre a destra della virgola ed M a sinistra vale:
Rappresentazione in virgola mobile (mantissa ed esponente), utilizzando base 2
Standard IEEE 754 (rappresentazione float a 32 bit):
- Bit più significativo per segno mantissa (0 per positivi, 1 per negativi)
- 8 bit per l’esponente (notazione in complemento a 2)
- Ultimi 23 bit per mantissa in forma normale
1
*M
ii
i N
a c b
Quindi, come si converte
un numero razionale da
decimale a binario?
39
• zero si rappresenta ponendo a 0 tutti i bit di mantissa ed esponente
• +∞ e –∞ si possono rappresentare ponendo a 1 tutti i bit dell’esponente e a 0 tutti i bit della mantissa
• Not a Number (NaN) ponendo a 1 tutti i bit dell’esponente e la mantissa diversa da 0
Nel caso di doppia precisione – double: 11 bit per esponente, 52 per mantissa
Valori massimo e minimo rappresentabili Interi senza segno 0 4294967295
Interi con segno -2147483647 2147483647
Interi in complemento a 2 -2147483648 2147483647
Reali in sing. prec. (modulo) 1.401298*10-45 3.402823*1038
Reali in doppia prec. (modulo) 4.940656*10-324 1.797693*10308
Rappresentazione dei Numeri:
NUMERI RAZIONALI
40
Es: 22,75
1. Si trasforma da decimale a binario conservando la virgola
22.75=10110.11 (la parte decimale 0.75=0.5+0.25 corrisponde alle
potenze di 2-1 e 2-2)
2. Si trasla la virgola di tanti posti a sx quanti ne servono a far diventare il
numero minore di 2(cioè a lasciare la virgola a dx del bit più significativo):
1.011011
3. Si moltiplica il numero per una potenza di due pari al numero di posti di
cui è stata spostata la virgola: 24, la cui rappresentazione in eccesso a
127 è 4+127=131 =10000011
4. Si scrive il bit di segno (0) quindi i primi 8 bit che rappresentano
l’esponente di 2 seguiti dalla parte frazionaria della mantissa (23 bit): 0
10000011 01101100000000000000000
N.B a causa del numero limitato di cifre a disposizione, un numero si puo’
rappresentare esattamente in un calcoltaore solo se la sua parte
frazionaria è esprimibile come somma di un numero limitato di potenze di
2 altrimenti lo si approssima a quello ad esso più vicino
Rappresentazione dei Numeri:
NUMERI RAZIONALI
41
• Se si sommano due numeri positivi tali che il risultato sia maggiore del massimo numero positivo rappresentabile con i bit fissati (lo stesso per somma di due negativi)
• Basta guardare il bit di segno del risultato: se 0 (1) e i
numeri sono entrambi negativi (positivi) overflow
Errori di Approssimazione: OVERFLOW
42
ERRORI NELLE OPERAZIONI
Attenzione ai casi in cui venga invaso il bit più significativo (bit di segno)
Esempio
60 + 00111100 75 = 01100011 ----- -------- 135 10011111
Questo errore si chiama invasione del bit di segno; è una forma di overflow
Può accadere solo sommando due numeri dello stesso segno, con modulo sufficientemente grande
Errore!
Si è invaso il bit di segno,
il risultato è negativo!
43
Errori di Approssimazione: ERRORI DI
ARROTONDAMENTO e UNDERFLOW
Tutti i numeri non interi si approssimano al numero razionale più vicino con rappresentazione finita (pensare a ma anche a 0.1)
Precisione dell’ordine di 2n, dove n è il numero di bit dedicati alla mantissa
Due numeri che differiscono per meno della precisione sono considerati uguali => errore di arrotondamento
Se un numero è più piccolo della precisione, allora viene approssimato con 0 => errore di underflow
44
Propagazione “catastrofica” in alcuni algoritmi quando operandi (numeri razionali) molto diversi o molto simili
1) Molto diversi: il più piccolo dei due operandi perde precisione a causa spostamento mantissa (necessario per svolgere operazione: stessa mantissa del più grande)
Esempio:
se a sufficientemente grande e b sufficientemente piccolo
a + b = a
(chi propone un esempio concreto in rappres. IEEE754?)
PROPAGAZIONE degli ERRORI
45
a= 68833152
b= 2309657318129664
a= 0 10011001 0000011010010011110000
b= 0 10110010 0000011010010011110000
Per eseguire la somma devo incolonnare i numeri, quindi a deve essere
espresso con lo stesso esponente di 2 di b. L’esponente di a è 26
quello di b 51. La differenza tra questi numeri è 25. La mantissa di a
si dovrebbe riscrivere spostando le cifre di altrettante posizioni
verso destra. Poichè il numero massimo di cifre per la mantissa è
23, il risultato è che la mantissa sarà rappresentata come una
sequenza di 0
0 10110010 00000000000000000000000 + ....
0 10110010 0000011010010011110000 =
Quindi un’assurdità!
PROPAGAZIONE degli ERRORI
46
Propagazione “catastrofica” in alcuni algoritmi quando operandi (numeri razionali) molto diversi o molto simili
2) Molto simili: differenza fra due numeri molto vicini
Esempio (in base 10 per semplificare; mantissa con 3 cifre significative dopo virgola):
a = 1.000x103; b = 999.8x100
a – b = (1.000x103) – (0.999x103) = 1.000x100, che è piuttosto diverso da 0.2!
Nota che diversi algoritmi possono produrre errori molto differenti. Ad esempio (x = 3.451x100, y = 3.450x100):
x2 – y2 = 1.190x101 – 1.190x101 = 0!!!
x2 – y2 = (x + y) (x - y) = (6.901x100) (1.000x10-3) = 6.901x10-3
PROPAGAZIONE degli ERRORI
47
Ad esempio, un tipo fondamentale di dato da rappresentare è costituito dai singoli caratteri
Idea base: associare a ciascun carattere un numero intero (codice) in modo convenzionale
Codice standard ASCII (1968)
ASCII definisce univocamente i primi 128 caratteri (7 bit – vedi tabella nel lucido seguente)
I caratteri con codice superiore a 127 possono variare secondo la
particolare codifica adottata (dipendenza da linguaggio naturale: ISO 8859-1 per alfabeto latino1, …)
Visto che i caratteri hanno un codice intero, essi possono essere considerati un insieme ordinato (ad esempio: ‘g’ > ‘O’ perché 103 > 79)
Rapida Nota sulla
Rappresentazione dei Caratteri
48
Tabella ASCII standard
49
Internamente, un elaboratore adotta per i numeri interi una rappresentazione binaria (base B=2)
Esternamente, le costanti numeriche che scriviamo nei programmi e i valori che stampiamo a video/leggiamo da tastiera sono invece sequenze di caratteri ASCII
Il passaggio dall'una all'altra forma richiede dunque un processo di conversione
NUMERI E LORO RAPPRESENTAZIONE
50
Numero: centoventicinque
Rappresentazione interna binaria (16 bit):
00000000 01111101
Rappresentazione esterna in base 10:
occorre produrre la sequenza di
caratteri ASCII '1', '2', '5'
00110001 00110010 00110101
vedi tabella ASCII
Esempio: RAPPRESENTAZIONE
INTERNA/ESTERNA
51
Rappresentazione esterna in base 10:
È data la sequenza di caratteri ASCII
'3', '1', '2', '5', '4'
00110011 00110001 00110010 00110101 00110100
Rappresentazione interna binaria (16 bit):
01111010 00010110
Numero:
trentunomiladuecentocinquantaquattro
vedi tabella ASCII
Esempio: RAPPRESENTAZIONE
INTERNA/ESTERNA
52
Si applica la definizione:
Ciò richiede la valutazione di un polinomio
Metodo di Horner
v d Bk
k
k
n
0
1
= d0 + B * ( d1 + B * ( d2 + B * ( d3 + ... )))
le cifre dk sono note,
il valore v va calcolato
CONVERSIONE STRINGA/NUMERO
53
Problema: dato un numero, determinare la
sua rappresentazione in una base data
Soluzione (notazione posizionale):
manipolare la formula per dedurre un
algoritmo
v d Bk
k
k
n
0
1
= d0 + B * ( d1 + B * ( d2 + B * ( d3 + ... )))
v è noto,
le cifre dk vanno calcolate
CONVERSIONE NUMERO/STRINGA
54
Per trovare le cifre bisogna calcolarle una per
una, ossia bisogna trovare un modo per
isolarne una dalle altre
v = d0 + B * (…)
Osservazione:
d0 è la sola cifra non moltiplicata per B
Conseguenza:
d0 è ricavabile come v modulo B
CONVERSIONE NUMERO/STRINGA
55
Algoritmo delle divisioni successive
si divide v per B
il resto costituisce la cifra meno significativa (d0)
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’
CONVERSIONE NUMERO/STRINGA
56
Esempi:
Numero Base Calcolo valore Stringa
quattordici 4 14 / 4 = 3 con resto 2
3 / 4 = 0 con resto 3 “32”
undici 2 11 / 2 = 5 con resto 1
5 / 2 = 2 con resto 1
2 / 2 = 1 con resto 0
1 / 2 = 0 con resto 1 “1011”
sessantatre 10 63 / 10 = 6 con resto 3
6 / 10 = 0 con resto 6 “63”
sessantatre 16 63 / 16 = 3 con resto 15
3 / 16 = 0 con resto 3 “3F”
CONVERSIONE NUMERO/STRINGA
57
Attenzione ai problemi di arrotondamento in algoritmi
iterativi, possibili anche in casi in cui non ce lo aspettiamo!
Esempio di somma di N numeri naturali #include <stdio.h>
#define N 10000000
main () {
float s=0, x=7;
unsigned int i, is=0; ix=7;
for (i=0; i<N; i++) {
s += x; is += ix; }
printf(“usando float: %.0f x %d = %.0f\n”, x, N, s);
printf(“usando integer: %d x %d = %d\n”, ix, N, is);
}
Esempio di PROPAGAZIONE
in ALGORITMO ITERATIVO
Quale risultato
dall’esecuzione?
58
Errore già per i = 2396746, s = 16777222
Notazione IEEE 754; perdita della cifra più a destra
dell’addendo 7 (approssimato a 6)
Quindi un risultato finale più basso? NO, NEMMENO
Situazione ancora più complessa: rappresentazione interna alla
Floating Point Unit (FPU) a 80 bit, troncata quando si va in
memoria centrale
Ovviamente stesso problema di arrotondamento su
somma di qualunque coppia di numeri che
differiscono troppo fra loro
E se avessimo a che fare con un ottimizzatore di codice
sufficientemente intelligente?
Esempio di PROPAGAZIONE
in ALGORITMO ITERATIVO
59
Algoritmi equivalenti alternativi che riducano la
differenza tra i numeri da sommare
Ad esempio: sommare prima m valori fra loro; poi sommare tra loro i k
risultati (dove ovviamente k*m = n)
Oppure somma di Kahan:
float sum = 0., corr = 0., x = 7., tmp, y; int i;
for (i=0; i<N; i++) {
y = corr + x;
tmp = sum + y;
corr = (sum - tmp) + y;
sum = tmp; }
sum += corr;
COME RISOLVERE/ATTENUARE
IL PROBLEMA?