rappresentazione dell’informazionelia.disi.unibo.it/.../05-rappresentazionenumeri.pdf ·...

Post on 07-Oct-2020

4 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

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?

top related