Fondamenti di Informatica - 1 Prof. B.Buttarazzi A.A. 2011/2012 Sommario • Operazioni aritmetiche tra numeri in virgola mobile – Algoritmi – Esempi • Errore di rappresentazione (assoluto e relativo) • Approssimazione dei numeri reali ( arrotondamento, troncamento) • Esercizi 21/03/2012 2 Operazioni tra numeri in Virgola Mobile: somma e sottrazione 1) L’esponente più piccolo viene reso uguale al più grande spostando la mantissa verso destra del numero di cifre pari alla differenza tra gli esponenti (shift per ottenere un corretto incolonnamento) 2) Le mantisse vengono sommate o sottratte 3) Se necessario, la mantissa viene rinormalizzata e l’esponente corretto Operazioni tra numeri in Virgola Mobile: somma e sottrazione 1) L’esponente più piccolo viene reso uguale al più grande spostando la mantissa verso destra del numero di cifre pari alla differenza tra gli esponenti (shift per ottenere un corretto incolonnamento) 2) Le mantisse vengono sommate o sottratte 3) Se necessario, la mantissa viene rinormalizzata e l’esponente corretto A=1.01 • 22 B= 1.1101• 21 B= 0.11101• 22 Esercizio Eseguire 510 + 3.62510 assumendo una precisione di 4 bit Esercizio Eseguire 510 + 3.62510 assumendo una precisione di 4 bit Soluzione 510 = 1012 = 1.01 • 22 3.62510= 11.1012• 20 = 1.1101• 21 = 0.11101• 22 1.01000 + 0.11101 = ---------------10.00101 • 22 Normalizzazione: 1.000101 • 23 Arrotondamento: 1.0001 • 23 Operazioni tra numeri in Virgola Mobile: moltiplicazione e divisione 1) Gli esponenti vengo sommati o sottratti 2) Le mantisse vengono moltiplicate o divise 3) Se necessario, la mantissa viene rinormalizzata e l’esponente corretto Operazioni tra numeri in Virgola Mobile: moltiplicazione e divisione 1) Gli esponenti vengo sommati o sottratti 2) Le mantisse vengono moltiplicate o divise 3) Se necessario, la mantissa viene rinormalizzata e l’esponente corretto Esercizio Eseguire 1.0000 *2 -1 * (1.1100 * 2 -2 ) assumendo lo standard IEEE 754 in semplice precisione Esercizio Eseguire 1.0000 *2 -1 * (1.1100 * 2 -2 ) assumendo lo standard IEEE 754 in semplice precisione Soluzione 0 01111110 000000000000….000 =127-1 = 126 0000….. 1.000 * 1 01111101 1100000000000…00 1.110 = =127-2=125 1100…… Calcolo esponente. ------1+-2= -3+127 = 124 0000 + Nuovo esponente: 01111100 1000 + Calcolo prodotto mantisse. 1000 + 1.000 * 1.110 =1.110 1000 + Normalizzazione e controllo overflow e/o underflow. è già a posto -----------------Arrotondamento ok 1110000 = 1.110000 Segno - =1 Risultato 1 01111100 11000000000000000000000 Problemi con l’uso dei numeri in virgola mobile 3/21/2012 11 Problemi con l’uso dei numeri in virgola mobile Formule matematicamente equivalenti possono dare risultati diversi. Per esempio, nella maggior parte delle applicazioni in virgola mobile, 1,0 + (10100 + -10100) da come risultato 1,0 mentre (1,0 +10100 )+ -10100) + da 0,0. 3/21/2012 12 Errore assoluto Quando si rappresenta un numero reale n in notazione floating point si può commettere un errore di approssimazione dovuto al fatto che abbiamo a disposizione un numero limitato di cifre (t) che ci permetteranno di rappresenteremo il numero razionale n’ , la differenza eA= n-n’ si chiama errore assoluto. ERRORE ASSOLUTO: eA= n-n’ Questa grandezza, benché fornisca un’indicazione precisa dell’errore commesso, non permette di valutare l’entità dell’errore in termini percentuali. Errore relativo Per conoscere quanto un errore influenzi il risultato (quando n≠0) si deve introdurre l’errore relativo: ERRORE RELATIVO: eR = eA /n= (n-n’)/n Ad esempio se consideriamo le seguenti approssimazioni n’= 2 di n = 1 e n’= 1001 di n = 1000 In entrambi i casi avremo un errore assoluto pari a uno, ma mentre nel primo caso l’errore relativo ((n-n’)/n = 1-1/1) che (in valore assoluto) è pari a 1 corrisponde al 100% del valore a cui è riferito (ho sbagliato 1 su 1) nel secondo caso ( (n-n’)/n = 1000-1001/1000) ) è pari a un millesimo e corrisponde allo 0,1% del valore a cui è riferito (infatti ho sbagliato 1 su 1000). Dal punto di vista dell’approssimazione, è evidente che mentre un errore dello 0,1% potrebbe essere accettabile un errore del 100% non lo è affatto! Errore relativo Per conoscere quanto un errore influenzi il risultato quando n≠0, si definisce l’errore relativo: ERRORE RELATIVO: eR = eA /n= (n-n’)/n Osservazione L’errore relativo deve essere comparato a 1. Un errore relativo vicino a zero indicherà che il risultato approssimato è molto vicino al risultato esatto, mentre un errore relativo uguale a 1 indicherà la totale perdita di informazione. L’errore relativo non è influenzato dall’ordine di grandezza dei numeri che si stanno considerando ma è legato al numero di cifre di n’,a partire dalla prima, che coincidono con quelle di n. Errore assoluto e relativo Esempi Sia n=3,141592653≃ π n’=3.1415 L’errore assoluto è 0.000092653 ma l’errore relativo è: 0.000092653 /3,141592653 eR = ≃ 0.000029492. Errore assoluto e relativo ERRORE ASSOLUTO: eA = n-n’ ERRORE RELATIVO: eAR= eA /n = (n-n’)/n Osservazione • L’ordine di grandezza dell’errore assoluto dipende dal numero di cifre significative e dall’ordine di grandezza del numero • L’ordine di grandezza dell’errore relativo dipende solo dal numero di cifre significative Esempio Errore assoluto e relativo ERRORE ASSOLUTO: eA = n-n’ ERRORE RELATIVO: eAR= eA /n = (n-n’)/n Osservazione L’errore relativo non è influenzato dall’ordine di grandezza dei numeri che si stanno considerando ma è legato al numero di cifre di n’,a partire dalla prima, che coincidono con quelle di n. Se la mantissa è normalizzata l’errore relativo è costante. Esempio Precisione di una rappresentazione Se rappresentiamo numeri con una precisione fino alla t-esima cifra frazionaria l’eventuale errore assoluto sarà < 2-t Arrotondamento / Troncamento Quando dobbiamo rappresentare in virgola mobile un numero reale x che richiede un numero di cifre per la mantissa normalizzata superiore a quelle disponibili (t) la determinazione di x’ ( il floating point più vicino x) può avvenire in due modi: per arrotondamento o per troncamento Arrotondamento / Troncamento Esempio t=2 x= 2,2510 Eventi legati a errori di arrotondamento: Missile Patriot MISSILE PATRIOT Il 25.02.1991, durante la guerra del Golfo, in Arabia Saudita, un missile Patriot mancò l'intercettazione di uno SCUD (missile iracheno) che distrusse una caserma americana. A causa di analoghi errori di intercettazione altri missili SCUD sono riusciti a colpire il territorio israeliano. Successivamente fu riscontrato che il motivo di ciò era dovuto a errori di arrotondamento nel calcolo del tempo. In particolare, il tempo, calcolato in decimi di secondo nel computer dei PATRIOT, poi veniva moltiplicato per 10 per ottenere il tempo in secondi. Questi calcoli venivano eseguiti con un formato a virgola fissa con registri a 24 bit. Sfortunatamente, il numero 0.1 non ha una rappresentazione finita in binario pertanto il troncamento e la successiva moltiplicazione per 10 comportava l'insorgere di errori significativi. Il semplice troncamento produceva un errore assoluto pari a circa 0.000000095. Eventi legati a errori di arrotondamento: Razzo Ariane V Razzo ARIANE Il 04.06.1996 Ariane V, un razzo costruito dall’ESA (European Space Agency) per posizionare in orbita dei satelliti) precipitò 37 secondi dopo il lancio dalla base spaziale di Kourou nella Guyana Francese http://www.youtube.com/watch?v=kYUrqdUyEpI. La distruzione del razzo e del suo carico provoco una perdita di centinaia di milioni di dollari. Il guasto alla base del fallimento, accertato dopo lunghe indagini, fu dovuto ad una erronea conversione di un numero floating point a 64 bit (correlato alla velocità orizzontale del razzo rispetto alla piattaforma) in un intero a 16 bit. Il numero convertito, risultando maggiore del massimo intero rappresentabile pari a 32768, provocò un overflow nella misura della velocità orizzontale con il conseguente spegnimento dei motori ed esplosione del razzo. Il 13.02.2012 sempre da Kourou è partito con successo il nuovo razzo europeo VEGA(Vettore Europeo Generazione Avanzata) progettato e costruito per conto dell’ESA quasi totalmente in Italia. ESERCIZIO Determinare quante e quali cifre binarie sono necessarie per convertire in virgola fissa il numero (1,76)10 con un errore assoluto inferiore a 1/100, successivamente effettuare la conversione del numero. 3/21/2012 24 Soluzione Per convertire con una precisione di almeno 1/50 un numero frazionario deve essere verificato (ricordando che 25=32,26=64) pertanto occorrono 6 cifre binarie per la parte frazionaria. Nel caso di 1,76 si opera la conversione 3/21/2012 25 Troviamo ora la rappresentazione binaria di 1,76 Per la parte intera si ha 1. Effettuando la trasformazione in binario della parte frazionaria (0.76) si ottiene: Conversione della parte frazionaria (per moltiplicazioni successive) .76* 2 = 1.52 parte intera = 1 .52* 2 = 1.04 parte intera = 1 .04* 2 = 0.8 parte intera = 0 .8 * 2 = 0.16 parte intera = 0 .16 * 2 = 0.32 parte intera = 0 .32* 2 = 0.64 parte intera = 0 0.64*2=1,28 parte intera = 1 0,28*2=0.56 parte intera = 1 0,56*2=1,12parte intera = 1 ……. (0.76) 10 ≃ (.110000) 2 Volendo una approssimazione alla 6 cifra frazionaria. La rappresentazione in virgola fissa del numero 1,76 sarà quindi: 1.11000 per un totale di 7 cifre. ESERCIZIO Determinare quante e quali cifre binarie sono necessarie per convertire in virgola fissa il numero (0,12)10con un errore assoluto inferiore a 1/100, successivamente effettuare la conversione del numero. 3/21/2012 27 ESERCIZIO Elencare tutti i numeri rappresentabili con 6 bit: • 1 bit di segno, 3 di esponente e 4 di mantissa Seguendo le stesse regole dello standard IEE754 3/21/2012 28 Standard IEEE 754 3/21/2012 29 Configurazioni particolari Lo Standard IEEE 754 attribuisce valori convenzionali a particolari configurazioni di E ed m A) E ed m tutti 0 rappresentano il valore 0 (altrimenti non rappresentabile) B) m tutti 0 ed E tutti 1 rappresentano l’overflow C) m != 0 ed E tutti 1 indicano la situazione Not A Number (NAN), cioè un valore indefinito (ad es. il risultato di una divisione per 0) Queste convezioni sono una caratteristica peculiare della notazione IEEE 754; ( se non esplicitamente definite, non valgono per altre notazioni)