Rappresentazione dei numeri

annuncio pubblicitario
RAPPRESENTAZIONE DELL’INFORMAZIONE
 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...
1
INFORMAZIONI NUMERICHE
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, …}
2
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…
 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
3
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 di rappresentazione su N cifre:
dn-1 … d2 d1 d0
4
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à)
5
NOTAZIONE POSIZIONALE
In formula:
dove
n 1
v   dk B
k
k 0
 B = base
 ogni cifra dk rappresenta un valore fra 0 e B-1
Esempio (base B=4):
1 2 1 3
d3 d2 d1 d0
Valore = 1 * B3 + 2 * B2 + 1 * B1 + 3 * B0 = centotre
6
NOTAZIONE POSIZIONALE
Quindi, una sequenza di cifre non è interpretabile se non si precisa la base in cui è
espressa
Esempi:
Stringa
“12”
“12”
“12”
“12”
Base
quattro
otto
dieci
sedici
Alfabeto
{0,1,2,3}
{0,1,...,7}
{0,1,...,9}
{0,..,9, A,., F}
Calcolo valore
4*1+2
8*1+2
10 * 1 + 2
16 * 1 + 2
Valore
sei
dieci
dodici
diciotto
7
NOTAZIONE POSIZIONALE
Inversamente, ogni numero può essere
espresso, in modo univoco, come
sequenza di cifre in una qualunque base
Esempi:
Numero
venti
venti
venti
venti
Base
due
otto
dieci
sedici
Alfabeto
Rappresentazione
{0,1}
“10100”
{0,1,...,7}
“24”
{0,1,...,9}
“20”
{0,..,9, A,., F}
“14”
Non bisogna confondere un numero con
una sua RAPPRESENTAZIONE!
8
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}
Rappresentazione in base p
• Un numero naturale N, composto da m cifre, in base
p, si esprime come:
N p  an  p  an1  p
n
n 1
n
 ...  a1  p  a0  p   ai  p i
1
0
i 0
• Esempio in base decimale (p=10):
58710 = 7·100 + 8·101 + 5·102
• Posso rappresentare i numeri nell’intervallo discreto:
[0 , pm - 1]
Rappresentazione in base due
• 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]
NUMERI NATURALI: valori rappresentabili
 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)
12
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
Esempio: Esprimere in base 2 il numero naturale 2710
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
 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 +
1010 =
------carry  11001
(1510)
(1010)
(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
ERRORI (primissimo assaggio )
Esempio (supponendo di avere solo 7 bit per la
rappresentazione)
60 +
99 =
----135
0111100
1100011
-------10011111
Errore!
Massimo numero
rappresentabile:
27-1 cioè 127
• 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
19
ESERCIZIO RAPPRESENTAZIONE
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
20
ESERCIZIO RAPPRESENTAZIONE
Soluzione
59 0 0111011
-27 1 0011011
Tra i (moduli dei) due numeri si esegue una sottrazione:
0111011
-
0011011
------0100000
che vale 32 in base 10
21
DIFFERENZE TRA NUMERI BINARI
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
22
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, xN - {0}}  N
23
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
24
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
25
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
26
NUMERI INTERI (con segno)
Rappresentazione in modulo e segno
Due difetti principali:
 occorrono algoritmi speciali
per fare le operazioni
Ad esempio:
(+5) + (-5) = -10 ???
+5
-5
--0
0 0000101
1 0000101
---------1 0001010
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
27
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
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
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
Complemento a due (CPL2)
• Usando m bit: (-N)CPL2 = (2m - N10)2
• Esempio (m=3): (-N)CPL2 = (23 - N10)2
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
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:
M 1
a   ci * bi
i  N
Quindi, come si converte
un numero razionale da
decimale a binario?
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
38
Rappresentazione dei Numeri:
NUMERI RAZIONALI
• 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
Interi con segno
Interi in complemento a 2
Reali in sing. prec. (modulo)
Reali in doppia prec. (modulo)
0
-2147483647
-2147483648
1.401298*10-45
4.940656*10-324
4294967295
2147483647
2147483647
3.402823*1038
1.797693*10308
39
Rappresentazione dei Numeri:
NUMERI RAZIONALI
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
40
2 altrimenti lo si approssima a quello ad esso più vicino
Errori di Approssimazione: OVERFLOW
• 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
41
ERRORI NELLE OPERAZIONI
Attenzione ai casi in cui venga invaso il bit più
significativo (bit di segno)
Esempio
60 +
75 =
----135
00111100
01100011
-------10011111
Errore!
Si è invaso il bit di segno,
il risultato è negativo!
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
42
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
43
PROPAGAZIONE degli ERRORI
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?)
44
PROPAGAZIONE degli ERRORI
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à!
45
PROPAGAZIONE degli ERRORI
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
46
Rapida Nota sulla
Rappresentazione dei Caratteri
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)
47
Tabella ASCII standard
48
NUMERI E LORO RAPPRESENTAZIONE
 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
49
Esempio: RAPPRESENTAZIONE
INTERNA/ESTERNA
 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
50
Esempio: RAPPRESENTAZIONE
INTERNA/ESTERNA
 Rappresentazione esterna in base 10:
È data la sequenza di caratteri ASCII
'3', '1', '2', '5', '4'
vedi tabella ASCII
00110011 00110001 00110010 00110101 00110100
 Rappresentazione interna binaria (16 bit):
01111010 00010110
 Numero:
trentunomiladuecentocinquantaquattro
51
CONVERSIONE STRINGA/NUMERO
Si applica la definizione:
n 1
v   dk B
k 0
k
le cifre dk sono note,
il valore v va calcolato
= d0 + B * ( d1 + B * ( d2 + B * ( d3 + ... )))
Ciò richiede la valutazione di un polinomio
 Metodo di Horner
52
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
n 1
v   d k Bk
v è noto,
le cifre dk vanno calcolate
k 0
= d0 + B * ( d1 + B * ( d2 + B * ( d3 + ... )))
53
CONVERSIONE NUMERO/STRINGA
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
54
CONVERSIONE NUMERO/STRINGA
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’
55
CONVERSIONE NUMERO/STRINGA
Esempi:
Numero
quattordici
undici
sessantatre
sessantatre
Base
4
2
10
16
Calcolo valore
14 / 4 = 3 con resto 2
3 / 4 = 0 con resto 3
11 / 2 = 5 con resto 1
5 / 2 = 2 con resto 1
2 / 2 = 1 con resto 0
1 / 2 = 0 con resto 1
63 / 10 = 6 con resto 3
6 / 10 = 0 con resto 6
63 / 16 = 3 con resto 15
3 / 16 = 0 con resto 3
Stringa
“32”
“1011”
“63”
“3F”
56
Esempio di PROPAGAZIONE
in ALGORITMO ITERATIVO
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 () {
Quale risultato
float s=0, x=7;
dall’esecuzione?
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);
}
57
Esempio di PROPAGAZIONE
in ALGORITMO ITERATIVO
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
58
sufficientemente intelligente?
COME RISOLVERE/ATTENUARE
IL PROBLEMA?
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;
59
Scarica