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 = k2n 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 xy = 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+110–3 + 0,3141e+110–3 610–4 (0,3141e+1)2 L'errore complessivo è però maggiore poiché va aggiunto l'errore GENERATO dall'operazione (il risultato è un troncamento) E 610–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