RAPPRESENTAZIONE DEI NUMERI

annuncio pubblicitario
 NUMERI INTERI
2n combinazioni
Binario in complemento a due su "n" bit
–2n–1  n  2n–1 –1
Es. TURBOPASCAL
–maxint–1  m  maxint
–32768
32767
0
0
–
1
+1
+
–
–32768
+32767
I risultati delle operazioni sono SEMPRE corretti nell'aritmetica in MODULO 2n
a  b (modulo 2n)

a–b = k2n
con k–{0}
 NUMERI REALI
NOTAZIONE IN VIRGOLA MOBILE (FP–normalizzata):
ogni numero reale r può essere scritto nella forma :
r = m  b
m
b
e
Es.
2.74
e
mantissa =  0 .c1c2c3 … cn con c1  0
base ( 2 in un elaboratore altrimenti 10)
esponente
= 0.274 e +1
0.0032 = 0.32 e –2
1
10000 = 0.1 e +5
Vantaggi :



la parte intera non è memorizzata (sempre = 0)
il punto decimale viene omesso (è sempre a sinistra della prima cifra di mantissa
non è memorizzata le base ( è ovvia)
ed uno svantaggio

bisogna introdurre una rappresentazione ad hoc per la ZERO (mantissa=0, esponente=0)
In macchina verranno quindi memorizzati solo mantissa ed esponente in binario


Mantissa
espon.
È chiaro che anche in questo caso NON si possono rappresentare TUTTI i numeri REALI, ma solo
un certo SOTTOINSIEME IRREGOLARE.
Anche in questa rappresentazione si ha un errore di OVERFLOW se si tenta di memorizzare un
numero più grande del massimo.
Se invece si tenta di memorizzare un numero molto piccolo si incorre in un errore di
UNDERFLOW che di solito il calcolatore NON segnala, approssimando tale valore a ZERO.
La codifica di un numero reale in FP è quasi sempre una approssimazione del numero stesso
TRONCAMENTO
ARROTONDAMENTO
(troncamento del numero dopo aver aggiunto 5 all'ultima cifra significativa)
Questo significa che ad ogni rappresentazione sono associati INFINITI numeri compresi entro un
intervallo uguale al valore approssimato
Es.
Supponiamo di usare una rappresentazione DECIMALE con mantissa a 6 cifre
 = 3.141592…
 +314159e+1
rappresenta non UNO, ma INFINITI numeri "vicini" a meno di 10-6
ARITMETICA F.P.
Algoritmo per la SOMMA
1. Eguagliare gli esponenti, agendo sulla mantissa del numero più piccolo
2. Sommare le mantisse
3. Nel caso di riporto aumentare di 1 l'esponente del risultato e approssimare
(troncando o arrotondando) (perdita di informazione)
Es. con 6 cifre di mantissa (numeri 6_normali)
x = 0.749323e+6
y = 0.83842e+2
2
0.749323
+
0.000083842 =
0.749407 e+6 (con arrotondamento)
z = 0.43729e+3
t = 0.715464e+3
0.437290 +
0.715464 =
1.152754 e+3
normalizzazione
0.115275e+4
Come per gli interi, NON valgono le proprietà delle operazioni
Es. PROPRIETÁ ASSOCIATIVA
Si debbano sommare, con arrotondamenti, i numeri :
x=0.235565e+3 y=0.245678e+5 z=0.867899e+5
(x+y) = 0.002356 + 0.245678 = 0.248034e+5
(x+y)+z = 0.111593e+6
(y+z) = 0.111358e+6
x+(y+z) = 0.000236 + 0.111358 = 0.111594e+6
Algoritmo per la MOLTIPLICAZIONE
1. Moltiplicare le mantisse
2. Sommare gli esponenti
3. Normalizzare il risultato (troncando o arrotondando) (perdita di
informazione)
Es. con numeri 4_normali ed arrotondamento
x = 0.3254e+6
xy =
y = 0.213e-2
0.0693 e+4
normalizzazione
0.6930 e+3
Algoritmo per la DIVISIONE (se è possibile)
1. Dividere le mantisse
2. Sottrarre gli esponenti
3. Normalizzare il risultato (troncando o arrotondando) (perdita di
informazione)
Es. con numeri 4_normali ed arrotondamento
x = 0.4e+5
x/y =
y = 0.3e-3
1.3333 e+8
normalizzazione
0.1333 e+7
3
I NUMERI MACCHINA
L'insieme dei numeri rappresentati in F.P. NON è continuo ma discreto ed inoltre gli elementi NON
sono equamente distribuiti sulla retta reale.
Si può dimostrare che le combinazioni possibili di cifre nel caso di 11 (il caso del TurboPascal) è
2  9  1010  77 + 1

1.39  1013
Nonostante l'esponente possa arrivare a +38, si ottiene un numero di valori BEN INFERIORE; da
questo si può notare che il numero di valori dipende molto più dalle cifre significative (e quindi
dalla mantissa) che non dall'esponente.
Perciò in un sistema, volendo aumentare la precisione con maggiori bit di memorizzazione dei F.P.
è meglio assegnare i bit alla MANTISSA
COME SONO DISTRIBUITI I NUMERI MACCHINA?
Nel caso reale i valori che si ripetono in ogni intervallo sono molto elevati ( 9  1010) ma
ovviamente insufficienti a rappresentare gli infiniti numeri reali.
Più l'esponente è alto, meno "densi" sono i valori.
Nei pressi del numero massimo rappresentabile i valori esatti sono RARISSIMI.
Il fatto che molti algoritmi vengano "testati" solo per valori non critici o abituali induce molti
programmatori a considerare il calcolatore infallibile.
In realtà SBAGLIA FACILMENTE!
TEORIA DEGLI ERRORI

ERRORE ASSOLUTO
e(x) = | x –  |

ERRORE RELATIVO
er(x) = e(x) / | x |
NON È QUASI MAI POSSIBILE SCRIVERE I VALORI DI QUESTI ERRORI (in generale non si
conosce x, che è l'obiettivo dell'algoritmo di calcolo)
NEGLI ALGORTIMI SI PROCEDE PERCIÓ CON STIME che MAGGIORANO l'errore effettivo:

ERRORE ASSOLUTO LIMITE
E(x)
(o GRADO DI APPROSSIMAZIONE)
Dati a' e a'' tali che a'  x  a''
E(x) = a'' – a'
4
Stabilito E(x) , OGNI numero  tale che a'    a'' si chiama valore approssimato (o
approssimazione) di x
x =   E(x)
e sicuramente
e(x)  E(x)

ERRORE RELATIVO LIMITE Er(x) = E(x) / a'
(o PRECISIONE RELATIVA)
ES. 13 approssimato alla 1^ cifra è
3,6 < 13 < 3,7
E(x) = 0,1 Er(x) < 2,8%
TIPI DI ERRORE



INERENTE (sui dati di partenza) : errori macchina, errori di ingresso su dati sperimentali …
GENERATO : algoritmo interrotto ad un certo punto, calcoli eseguiti in modo non esatto, non
validità delle proprietà formali delle operazioni.
PROPAGATO : operazioni su valori già affetti da errore.
APPROSSIMAZIONE PER TRONCAMENTO di x alla cifra n
  x <  + E(x)
E(x) = 10–n
APPROSSIMAZIONE PER ARROTONDAMENTO di x alla cifra n
 – E(x)  x   + E(x)
E(x) = ½ 10–n

E(x)

E(x)
Esempio : calcolare e +  con numeri 4_normali troncati
e = 2,7182… 0,2718 e+1 E = 10–3
 = 3,1415… 0,3141 e+1 E = 10–3
e +  = 0,5859 e+1
E = 10–3 + 10–3 = 2  10–3
perciò
5,859  (e + ) < 5,861
Esempio : calcolare e +  con numeri 4_normali arrotondati
e = 2,7182… 0,2718 e+1 E = ½ 10–3
 = 3,1415… 0,3142 e+1 E = ½ 10–3
e +  = 0,5860 e+1
E = ½ 10–3 + ½ 10–3 = 10–3
perciò (e + ) = 5,860  0.001
5,859  (e + ) < 5,861
5
E(x)
PROPAGAZIONE DEGLI ERRORI NELLE OPERAZIONI
Dati due valori approssimati
x1 = ( + E1)
x2 = ( + E2)
le operazioni provocheranno una PROPAGAZIONE degli errori inerenti
Somma
Sottrazione
+E
–E
E = E1+E2
E = E1+E2
Moltiplicazione
(  )  E
E =   E2 +   E1 + E1  E2
Divisione
( / )  E
E = ( E2 +  E1) / (–E2 )2
Termine
trascurabile
Esempio : calcolare  / e con numeri 4_normali troncati
 = 3,1415… 0,3141 e+1 E = 10–3
e = 2,7182… 0,2718 e+1 E = 10–3
/e = 0,1155 e+1
E = 0,2718e+110–3 + 0,3141e+110–3  610–4
(0,3141e+1)2
L'errore complessivo è però maggiore poiché va aggiunto l'errore GENERATO
dall'operazione (il risultato è un troncamento)
E  610–4 + 10–3  2  10–3
0,1155 e+1   / e < 0,1157 e+1
Esempio : calcolare la seguente espressione con numeri 4_normali arrotondati e determinare una
stima degli errori commessi
d = ( a + c) + b / a
a = 2,718281
b = 0,03457
c = 345,87
Normalizzazione :
a = 0,2718 e+1
b = 0,3457 e–1
c = 0,3459 e+3
arrotondamento ½ 10–3
nessun errore
arrotondamento ½ 10–1
(a+c) = 0,0027e+3 + 0,3459 e+3 = 0,3486 e+3
propagato (0,5050e–1)
(b/a) = 0,3457e–1 / 0,2718e+1 = 0,1272e–1
prop. e gener. (< 3e–6)
6
(a+c)+b/a = 0,3486e+3 + 0.0000e+3 = 0,3486e+3 prop. e generato (<0,6)
d = 348,6  0,6 (stima)
E(x) < 0,6
Er(x) < 0,6 / 348,6 < 0,2 %
CRITERI DI ARRESTO DEGLI ALGORITMI

Quando si è raggiunto un certo GRADO DI APPROSSIMAZIONE

Quando lo scarto tra due valori calcolati è minore di un errore arbitrario stabilito a priori

Quando si sono fatti un numero di iterazioni oltre il quale si impone la terminazione.
Osservazione : il numero di operazioni utilizzate negli algoritmi deve essere reso minimo al fine di
limitare l'effetto CUMULATIVO di tutti gli errori.
ATTENZIONE
In un programma che utilizza numeri in floating point (real, o extended in pascal, float o double in
C, numeric in SQL…) è opportuno:

EVITARE controlli del tipo
if a = b then
poiché se le due variabili sono il risultato di calcoli precedenti, esse sono probabilmente
approssimate; è più conveniente un controllo del tipo
if abs(a-b)<= epsilon then

USARE CON CAUTELA al denominatore, espressioni ove compaiano differenze tra numeri
molto vicini o somme tra numeri di segno opposto, ma in valore assoluto vicino (casi di
ANNULLAMENTO di CIFRE).
7
Scarica