CAPITOLO 3 Rappresentazione dei numeri frazionari nei sistemi di elaborazione dell’informazione Nel capitolo precedente abbiamo affrontato la rappresentazione dei numeri interi con segno e dei numeri interi relativi affrontando per ciascuna categorie varie rappresentazioni più diffuse. Affrontiamo ora la rappresentazione dei numeri reali che, come visto nel precedente capitolo, non possono essere tutti rappresentati con una sequenza di N bit poiché il numero di possibili codifiche è finito (2n); dobbiamo quindi approssimare i numeri reali con numeri razionali, cioè con un intervallo di variazione finito e con una precisione finita. 3.1.Rappresentazione in virgola fissa I numeri frazionari del tipo: P Q Con q>0 e P appartenente ai numeri naturali, possono essere rappresentati componendo la parte intera e la parte frazionaria in questo modo: Xf = i, p0p1p2....pn dove i è la parte intera del numero, mentre p0p1p2....pn, è la parte decimale che sta al di la della virgola. La rappresentazione in virgola fissa dei numeri frazionari, segue le stesse regole viste fino ad ora viste per la rappresentazione degli gli interi: anche in questo caso possiamo seguire la definizione di notazione posizionale dei numeri, con la differenza che, rispetto ai numeri interi, le parti frazionarie hanno un peso pari ad una potenza negativa. Pertanto la generica rappresentazione binaria del numero frazionario, sarà: ∑ k i =− m bi ⋅ 2 i Università degli studi di Padova - Facoltà di Scienze Statistiche Corso di Laurea in Gestione delle Imprese – “Sistemi d elaborazione”. Prof . Nicola Zingirian 61 sviluppando la sommatoria, otteniamo che il generico numero frazionario in termini binari,sarà così espresso: x = b-m 2-m + b-m+1 2-m+1 +...........+b020 + b121+..........+bk-12k-1 Infatti i numeri frazionari, possono essere rappresentati componendo la parte intera e la parte frazionaria, come siamo abituati a fare con i numeri decimali, ed essendo le due parti separate dalla virgola, assegneremo una sequenza m di bit, per la parte frazionaria, e una sequenza k di bit per la parte intera, avendo cura di pesare i numeri della parte frazionaria con potenze negative di 2, a partire dalla potenza –1. Quindi per convertire ad esempio il numero frazionario 101,0011 dalla base 2 alla base 10, procederemo in questo modo: 101, 0011(2) = 22+20 + 2-3+2-4 = 5+1/8+1/16 dove 101 è la parte intera, che in base due rappresenta il numero 5, mentre la parte frazionaria è stata ricavata in maniera analoga pesando la base 2 con potenze negative. Se per esempio volessimo ora passare da una rappresentazione in base 2 ad una in base 8 del numero frazionario preso ad esempio, abbiamo visto che nei numeri interi, questo richiede il raggruppamento in blocchi da tre bit a partire da destra della cifra da convertire. Nei numeri frazionari vale la stessa regola per cui: 101, 001 1(00)(2) = 5, 14(8) il raggruppamento non è più solo da destra, ma si tiene conto anche della virgola: per cui per la parte intera, i bit si raggruppano da destra verso sinistra, mentre per la parte decimale, si raggruppano i bit da sinistra verso destra. Tra parentesi abbiamo messo gli zeri mancanti della seconda sequenza di tre bit, per meglio visualizzare la conversione. Vediamo dunque che la regola di conversione è la stessa, con l’unica differenza che, per la parte frazionaria, il verso con cui si vanno a raggruppare i bit si inverte rispetto a quello usato per la parte intera; per la parte decimale cioè, si va da sinistra verso destra. Università degli studi di Padova - Facoltà di Scienze Statistiche Corso di Laurea in Gestione delle Imprese – “Sistemi d elaborazione”. Prof . Nicola Zingirian 62 Poiché valgono le stesse regole di conversione, possiamo convertire lo stesso numero, da base 2 a base 16, raggruppando stavolta i bit a blocchi di 4: 101, 0011(2) = 5,3(16) facendo sempre attenzione di raggruppare i bit della parte frazionaria, partendo sempre da sinistra verso destra. Per passare, ora da una rappresentazione in base 16 ad una base 8, avremo lo stesso procedimento usato per gli interi, ad esempio: 71,a(16) = 0111 0001, 1010(8) Ancora volendo passare da base 8 a base 2, abbiamo: 7,13(8) = 111,001 001 Per convertire da sistema decimale a sistema binario in virgola fissa in cui si impiegano m bit per la parte intera ed n per la parte frazionaria si segue il seguente algoritmo: • la parte intera viene convertita in un numero binario a m bit con l’algoritmo adottato per i numeri assoluti • la parte frazionaria viene convertita in un numero a n bit nel seguente modo: la si moltiplica per 2 e si considera la parte intera che costituisce la rappresentazione binaria a partire dal bit più significativo; si itera questo procedimento fino ad ottenere parte frazionaria nulla oppure si ricavano gli n bit disponibili Esempio. Supponiamo di voler convertire nella notazione a virgola fissa con 5 bit per la parte intera e 5 per la parte frazionaria il numero decimale 22,412 per la parte intera: 22 : 2 11 : 2 5:2 2:2 1:2 resto 0 resto 1 resto 1 resto 0 resto 1 Università degli studi di Padova - Facoltà di Scienze Statistiche Corso di Laurea in Gestione delle Imprese – “Sistemi d elaborazione”. Prof . Nicola Zingirian 63 Quindi la parte intera diventa: (22)10 = (10110)2 per la parte frazionaria: 0.412 0.824 0.648 0.296 0.592 x x x x x 2 2 2 2 2 = = = = = 0.824 1.648 1.296 0.592 1.184 0 1 1 0 1 (22.412)10 = 10110.01101 moltiplicare per due in binario, significa spostare verso destra la virgola, come se ci spostassimo di un punto decimale, e poiché la prima cifra della moltiplicazione non può che essere o 1 o 0, allora moltiplicare per due la parte frazionaria, per ottenere la rappresentazione in base due di un numero decimale, significa far emergere la prima cifra del risultato, come quella più significativa dopo la virgola decimale. Nell’esempio, il primo bit rappresentativo, individuato è il bit = 0. Ad ogni moltiplicazione, si prende la parte frazionaria del risultato e la si moltiplica nuovamente per 2 iterando il procedimento fino a quando si vuole. Dall’esempio possiamo osservare che rappresentazioni non periodiche in base 10 possono dar luogo a rappresentazioni periodiche in base 2, e mentre è ovvio che una rappresentazione periodica in base 10, generi una rappresentazione periodica in base 2, mentre non è altrettanto scontato che rappresentazioni non periodiche in base 10 possano dare rappresentazioni periodiche in base 2. 3.2. Problemi di precisione nella rappresentazione in virgola fissa. Nella rappresentazione in virgola fissa, avendo sempre a disposizione un numero n di bit limitato, significa che bisogna stabilire a priori un certo numero k di bit da attribuire alla parte intera, e un certo numero m di bit da assegnare alla parte frazionaria, nonché considerare anche un bit per il segno. Pertanto il numero totale di bit a disposizione per la codifica dovrà essere così ripartito: k bit di codifica della parte intera m bit di codifica della parte frazionaria 1 bit di segno n k + m + 1 numero totale di bit Università degli studi di Padova - Facoltà di Scienze Statistiche Corso di Laurea in Gestione delle Imprese – “Sistemi d elaborazione”. Prof . Nicola Zingirian 64 Avere a che fare con un numero finito di bit, così ripartito, significa rappresentare dei numeri frazionari con un certa precisione: si consideri un asse dove riportiamo i numeri frazionari rappresentabili: -M 0 +M nel caso dei numeri frazionari, avendo n bit così ripartiti, non riusciamo mai a rappresentarli tutti quanti, ma solamente quelli che ammettono una rappresentazione binaria dove al più la parte frazionaria, ha m bit. La finitezza dei numeri rappresentabili, dovuta al fatto che dobbiamo allocare una quantità fissa di bit tra la frazione e la parte intera, va così ad incidere sulla precisione dei calcoli, che in tal caso sarà finita. La rappresentazione in virgola fissa, codifica solamente tutti quei numeri frazionari che distano tra di loro ad intervalli fissi di una data lunghezza, inferiore all’unità. Questa distanza sarà misurata da 1/2m, figura 3.1 Sappiamo che con n bit riusciamo a rappresentare 2n numeri possibili, quindi una volta definito con m il numero di bit necessari a rappresentare la parte frazionaria, si è definita la precisione dei numeri frazionari rappresentabili. Ciò significa che, fissato il numero n totale di bit, se m è piccolo, si dedicano cioè pochi bit alla parte frazionaria, allora consideriamo una rappresentazione con scarsa precisione, ma che codifica un ampio intervallo di numeri rappresentabili. Se invece prendiamo un m grande, ossia dedichiamo un numero di bit sufficientemente grande per la rappresentazione dei numeri frazionari, allora realizziamo una buona precisione che però andrà a penalizzare il numero di cifre rappresentabili. Università degli studi di Padova - Facoltà di Scienze Statistiche Corso di Laurea in Gestione delle Imprese – “Sistemi d elaborazione”. Prof . Nicola Zingirian 65 L’ideale sarebbe dunque una rappresentazione che consentisse di avere un ampio intervallo di cifre e nel contempo una buona precisione, e l’unico modo per avere una buona precisione ed un ampia rappresentazione dei numeri frazionari è quella di rinunciare all’equidistanza delle rappresentazioni così come indicato dalla figura 3.1. Questo porta a concludere che la rappresentazione in virgola fissa non ci permette di ottenere questi due requisiti, per il semplice fatto appunto che con questa rappresentazione, i numeri rappresentabili sono tutti equispaziati. Sappiamo che avendo a disposizione un determinato numero di bit per rappresentare l’informazione, possiamo rappresentare un numero finito di cifre pari a 2n, per cui per esempio se n=32 riusciamo a rappresentare circa 4 miliardi di numeri. Ora intuitivamente viene da pensare che distinguere tra 2 miliardi e 2 miliardi più uno, non fa molta differenza, in quanto trattandosi di numeri molto grandi, un piccolo scostamento tra due i due, non è molto significativo in termini di informazione; lo è invece quando facciamo riferimento ai numeri piccoli: nel senso che la differenza tra il numero 1 e il numero 2 è molto significativa, perché in questo caso passando dal numero 1 al numero 2 direttamente, senza dunque considerare tutti i numeri decimali compresi tra 1 e 2, andiamo a penalizzare tutta la precisione delle informazioni1. Per precisione si intende che dato una certa grandezza, la rappresentiamo con una sequenza di bit, e commettiamo un errore se non riusciamo ad ottenere una rappresentazione uguale a quel valore. L’errore in questo caso, dipende dal fatto che abbiamo a che fare con un numero limitato di cifre rappresentabili con n bit. Quindi per valori molto alti la precisione non è molto significativa, mentre lo è invece per numeri piccoli, pertanto nel caso della rappresentazione a virgola fissa, la precisione non è ben distribuita, in quanto essendo uguagliata indifferentemente a tutti i numeri rappresentabili, non è valorizzata per numeri piccoli, e penalizzata per numeri sufficientemente grandi. 1 In questo caso bisogna valutare la finalità con cui vengono interpretate determinate cifre: se ad esempio dovessimo fare delle considerazioni sul debito pubblico espresso im migliaia di euro . è logico che una quantificazione arrotondata è comunque indicativa della grandezza : pertanto non fa differenza dire che il debito pubblico è di 1000,000 di euro, anziché 1000,270, perché quello che conta è l’ordine di grandezza. Se invece facessimo riferimento alla crescita del prodotto interno lordo espressa in termini percentuali, ecco che in questo caso, non è la stessa cosa dire che è dell’1% o del 2%: l’informazione cambia notevolmente. Ciò significa che per questa rappresentazione è necessaria una precisione tale, che mi consenta di esprimere l’informazione con l’uso di decimali che rappresentano in modo esatto e preciso la grandezza del fenomeno, dicendo che per esempio è del 1,3% senza dunque essere costretti a scegliere tra 1% e 2% Università degli studi di Padova - Facoltà di Scienze Statistiche Corso di Laurea in Gestione delle Imprese – “Sistemi d elaborazione”. Prof . Nicola Zingirian 66 3.3. Rappresentazione in virgola mobile L’idea della rappresentazione in virgola a mobile è quella di rinunciare all’equispaziatura delle rappresentazioni, e di addensare i valori delle singoli rappresentazioni verso i numeri più piccoli, in particolare verso lo zero, mentre man mano che ci si allontana dallo zero, di aumentare la distanza delle cifre rappresentabili. Per cui, per valori sufficientemente grandi, anche se la distanza è relativamente grande, ciò non va a penalizzare la precisione, poiché il passaggio tra un numero grande e il suo successivo, data quella distanza, non cambia significativamente l’informazione (ad esempio passare da 2 miliardi a 2 miliardi e 1) 3.4.Standard IEEE 754. La rappresentazione rappresentazione di in virgola n=32 bit, mobile i quali standard vengono IEEE, così parte distribuiti da per una la rappresentazione dei numeri frazionari • 1 per il segno • 8 per la rappresentazione della parte intera • 23 per la parte frazionaria quindi una stringa di bit di 32 bit che rappresenta l’informazione sarà: figura 3.2 La rappresentazione dei numeri frazionari, in virgola mobile, parte dall’idea che un numero frazionario p/q può essere rappresentato con una coppia (m;e) dove m sta per indicare mantissa ed e sta indicare esponente, in modo tale che p = m * be q e ponendo la base b uguale 2 otteniamo che la rappresentazione dei numeri frazionari, mantissa esponente diventa: x = m*2e Università degli studi di Padova - Facoltà di Scienze Statistiche Corso di Laurea in Gestione delle Imprese – “Sistemi d elaborazione”. Prof . Nicola Zingirian 67 dove la mantissa è la sequenza dei bit, dedicata a rappresentare la parte frazionaria, e l’esponente è la sequenza dei bit destinata alla rappresentazione della parte frazionaria. Con la rappresentazione in virgola mobile, si assume che la virgola sia posta tra la sequenza di bit destinata alla rappresentazione della parte intera, e quella destinata alla rappresentazione della parte frazionaria, per cui i 23 bit che si trovano nella parte della mantissa, sono quelli che nella rappresentazione binaria dei numeri a 32 bit, si trovano dopo la parte decimale. Si assume inoltre, che prima della sequenza dei bit che formano la mantissa, ci sia un valore 1 davanti, per cui la mantissa dovrà sempre avere una rappresentazione del tipo: 1, b27-1 b27-2 bm-3....b1 = mantissa Questo primo bit anteposto alla virgola e che non viene mai visualizzato nella rappresentazione, viene definito hidden bit. Con riferimento alla parte intera del numero, vediamo che l’esponente è dato dalla rappresentazione in base 10 del numero binario in 8 bit, a meno di un eccesso k che per convenzione viene fissato k=3. Esempio n. 1 Supponiamo di avere la seguente rappresentazione binaria a virgola mobile del seguente numero per n=32 bit totali: Si vuole ricavare il valore corrispondente in base 10. Innanzitutto possiamo notare che si tratta di un numero negativo, perchè il bit del segno è 1. Poi isoliamo l’esponente ossia la sequenza di bit: esponente e = 1 0 0 0 0 0 1 0 che in decimale vale 130(10). Università degli studi di Padova - Facoltà di Scienze Statistiche Corso di Laurea in Gestione delle Imprese – “Sistemi d elaborazione”. Prof . Nicola Zingirian 68 L’esponente si rappresenta in eccesso 1272, il che significa che quello che rappresentiamo con la virgola mobile per la parte intera, è 127 di più di quello che in realtà andiamo a rappresentare. in particolare nell’esempio, essendo l’esponente pari a 130 in base decimale, a questo ci dobbiamo togliere l’eccesso 127: 130-127 = 3 dove 3 è il valore dell’esponente del numero in virgola mobile. A questo punto, tenendo conto dell’hidden bit, moltiplichiamo la mantissa per la base 2 elevata all’esponente così individuato : 23*1, 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 = 1000,01 e otteniamo così il numero rappresentazione i virgola mobile 1000,01 (si sono omessi gli zeri dopo l’ultimo bit pari a 1 della parte frazionaria) moltiplicare per 23, con esponente positivo, è come spostare la virgola di 3 posizioni a destra (in generale di k posizioni se e = K), se invece l’esponente è negativo, la virgola viene spostata verso sinistra. Convertendo il numero 1000,01 in decimale, abbiamo come risultato 8,25. Per convertire dunque in base 10 un numero binario rappresentato i virgola mobile con n=32 bit, i passi da seguire sono i seguenti: • si suddivide la sequenza di 32 bit in tre sequenze rispettivamente da 1 bit per il segno, 8 bit per l’esponente (parte intera) e 23 bit per la mantissa (parte frazionaria); • si converte la rappresentazione di 8 bit, ossia l’esponente, in numero decimale; • si sottrae 127 al valore così ottenuto e il risultato è l’esponente; • si normalizza la mantissa spostando la virgola in maniera tale che il primo numero anteposto alla virgola sia 1, e quindi si presenti in questo modo 1,bm-1 bm-2....b1 • moltiplichiamo la base 2 elevata all’esponente così individuato, per la mantissa normalizzata. 2 n-1 8-1 7 Il valore dell’eccesso è dato da: (2 -1) che per 8 bit sarà: (2 -1) = 2 – 1 = 127 Università degli studi di Padova - Facoltà di Scienze Statistiche Corso di Laurea in Gestione delle Imprese – “Sistemi d elaborazione”. Prof . Nicola Zingirian 69 Esempio n. 2 Vediamo ora il procedimento inverso: cioè come convertiamo un numero in base 10 in un numero binario in virgola mobile sempre a 32 bit. Supponiamo per esempio di voler rappresentare in virgola mobile il numero frazionario 12,75 espresso in base 10. Per prima cosa rappresentiamo 12,75 in virgola fissa, secondo i consueti metodi ottenendo i seguenti risultati: 12 = 1100 0,75 = 11 per cui il numero 12,75 in binario a virgola fissa sarà: 12,75 = 1100,11 Adesso però dobbiamo normalizzare la mantissa portandola ad una rappresentazione del tipo:1,bm-1 bm-2....b1, dobbiamo fare in modo cioè di portare alla destra del primo bit 1 della nostra rappresentazione, tutti gli altri bit della sequenza, in modo da arrivare ad avere solo il bit 1 alla sinistra della virgola. Nell’esempio, dobbiamo spostare la virgola a sinistra di 3 posizioni e quindi riscrivere la rappresentazione in questo modo: 12,75 = 1100,11 = 1,10011 *23 a questo punto abbiamo tutti gli elementi per ottenere la rappresentazione in virgola mobile. Il bit del segno sarà dato da 0, perché si tratta di un numero positivo, l’esponente, che dovrà essere rappresentato con 8 bit sarà, ricordando l’eccesso k = 127: 3 + 127 =130 quindi si tratterà di rappresentare con 8 bit, il numero 130 a base 10: 130(10)= 10000010(2) Università degli studi di Padova - Facoltà di Scienze Statistiche Corso di Laurea in Gestione delle Imprese – “Sistemi d elaborazione”. Prof . Nicola Zingirian 70 la mantissa l’abbiamo già ottenuta in quanto sarà 100011 più i restanti 22 bit che saranno tutti a zero. Pertanto la rappresentazione in virgola mobile del numero 12,75 sarà: 0 10000010 100011000 00000000000000 3.5. Errore di rappresentazione Si è detto che la rappresentazione dei numeri frazionari, analogamente ai numeri interi, pone il problema della finitezza dell’insieme informativo che si può rappresentare con un numero finito di bit. Mentre per i numeri interi, il problema però riguarda solamente l’intervallo dei numeri rappresentabili che, per n bit, in complemento a due, questo è dato da [- 2n-1; 2n-1 -1], per i numeri frazionari si aggiunge il problema della densità dei numeri reali, poiché essendo questi infiniti in qualunque intervallo, ed avendo solo n bit per rappresentarli, siamo costretti a sceglierne alcuni. La rappresentazione in virgola fissa è semplicemente un estensione della rappresentazione dei numeri interi; infatti mentre per questi, la rappresentazione posizionale considera solo potenze positive dei singoli pesi o base, per i numeri frazionari, le potenze delle basi sono anche negative. Quindi, avendo sempre n bit per la rappresentazione, di cui m si dedicano alla parte frazionaria e k alla parte intera, si è visto nel paragrafo 3.1. che la generica rappresentazione di un numero binario frazionario è: ∑ k i b ⋅ 2 i i =− m il che sviluppando, significa che la rappresentazione in virgola fissa del numero generico x diventerà x = b-m 2-m + b-m+1 2-m+1 +...........+b020 + b121+..........+bk-12k-1 possiamo riscrivere questo numero raccogliendo 2-m, ottenendo così questo risultato: 2-m [b-m2o + b-m+121+.......+...........+b02m + b12m+1+..........+bk-12m+k-1] Università degli studi di Padova - Facoltà di Scienze Statistiche Corso di Laurea in Gestione delle Imprese – “Sistemi d elaborazione”. Prof . Nicola Zingirian 71 avendo semplicemente raccolto 2-m , otteniamo un numero intero, quello tra parentesi quadra, con potenze tutte positive. Ciò significa che un numero frazionario lo possiamo esprimere come un numero intero moltiplicato per una quantità pari a 2-m. Possiamo cioè rappresentare un numero frazionario, con una sequenza di bit senza la virgola, ottenendo così un numero intero di cui possiamo calcolare il valore, e moltiplicare tale sequenza di bit per 2-m, dove ricordiamo che m sono i bit dati alla parte frazionaria. Osserviamo che m+k+1 = n-1, per cui il numero x generico rappresentato in virgola mobile, diventerà x = [b-m2o + .........bk-12n-1] *2-m che possiamo riscrivere anche: x = [b-m2o + .........bk-12n-1] 2m supponiamo di considerare il numero binario in virgola fissa: 11,101; abbiamo visto che potendo togliere la virgola, possiamo rappresentarlo come numero intero, ricordandoci però di moltiplicarlo per 2-m, dove m in questo caso è pari a 3, i bit della parte frazionaria, quindi varrà la seguente uguaglianza: 11,101 = 11101*2-3 = 29/8 Proviamo a riportare il numero ottenuto sulla retta dei numeri reali, evidenziando anche la parte decimale rappresentata in questo dagli ottavi della frazione: la distanza tra ciascun segmento sulla retta corrisponde ad 1/8, che è l’unità di misura, ossia la lunghezza del segmento che distanzia ciascun numero rappresentabile dall’altro, nell’esempio 29/8 si troverà esattamente a 5 intervalli dopo il numero intero 3. Università degli studi di Padova - Facoltà di Scienze Statistiche Corso di Laurea in Gestione delle Imprese – “Sistemi d elaborazione”. Prof . Nicola Zingirian 72 Questo significa che avendo preso tre bit di parte frazionaria, l’unità di misura, anziché essere 1, come avviene per i numeri interi, diventa, nell’esempio considerato 1/8: infatti, mentre il numero 11101 in realtà conta le distanze tra i numeri rappresentabili, in questo caso 29, il fattore che lo moltiplica, 2-3 ne misura la distanza sull’asse dei numeri. Quindi fissare m bit di base frazionaria, corrisponde a scegliere un unità di misura di distanza tra i numeri rappresentati pari a 2-m. Pertanto i numeri frazionari, non sono altro che numeri interi scalati di 2-m. Questa rappresentazione però porta ad un errore che consiste non solo nel poter uscire dall’insieme rappresentabile, ma anche dal fatto che all’interno di questo insieme non tutti i numeri reali possono essere rappresentati. Questo perché abbiamo sempre a che fare con una distanza discreta tra i numeri rappresentabili, e anche se con l’introduzione della virgola questa distanza è stata ridotta ad una misura inferiore all’unità, riusciamo comunque a codificare numeri che si “avvicinano” - e vedremo di quanto - a quelli che vogliamo rappresentare, ossia i numeri reali, proprio perché non possiamo rappresentarli tutti. Ciò implica l’esistenza di un errore nella rappresentazione dei numeri con virgola. 3.5.1. Errore assoluto Vediamo allora di capire qual’è l’errore massimo che si commette con una rappresentazione in virgola mobile: vale la pena di approfondire questo problema perché ogni volta che approssimiamo un numero, bisogna sempre saper dire quant’è l’errore massimo che commettiamo quando lo rappresentiamo, altrimenti produciamo un’informazione che non ha alcun valore. Sempre con dell’esempio, riferimento l’errore alla rappresentazione massimo che sull’asse possiamo dei numeri commettere reali nella rappresentazione in virgola fissa, si ha quando il numero reale che dobbiamo rappresentare si trova esattamente alla metà dell’unità di misura che divide i due numeri rappresentabili immediatamente vicini al numero reale, poiché questo si trova in distanza massima tra i due numeri: possiamo dunque dire che l’errore assoluto massimo, si trova esattamente alla metà dell’intervallo. Con riferimento all’esempio del paragrafo 3.4., supponiamo di considerare tutti i numeri che cadono nel seguente intervallo compreso tra 1/8 e 2/8: Max distanza Università degli studi di Padova - Facoltà di Scienze Statistiche Corso di Laurea in Gestione delle Imprese – “Sistemi d elaborazione”. Prof . Nicola Zingirian Max distanza 0 1/8 x0 3/16 x1 73 2/8 i primi due numeri frazionari che possiamo rappresentare, con tre bit dopo la virgola, sono 1/8 e 2/8, mentre tutti gli altri infiniti numeri reali che cadono all’interno dell’intervallo non sono rappresentabili: si nota chiaramente che il numero che dista più di tutti dai due estremi, è proprio 3/16, che sta esattamente alla metà tra 1/8 e 2/8. Quindi tutti i numeri, supponiamo x0, che cadranno nell’intervallo che va tra 3/16 e 1/8, e che ricordiamo non sono rappresentabili, saranno approssimati per difetto a 1/8 con un errore assoluto pari a (x0 – 1/8), questa differenza però è inferiore all’errore massimo pari alla metà della lunghezza che divide i due estremi 1/8 e 2/8. E ancora, tutti i numeri x1 che invece cadranno all’interno dell’intervallo 3/16 e 2/8, saranno approssimati per eccesso a 2/8, con un errore assoluto pari a (2/8-x1) ancora una volta inferiore all’errore massimo. E’ evidente allora che se il numero da rappresentare cade esattamente alla metà dell’intervallo l’errore massimo sarà pari ad 1/16. Definiamo allora errore assoluto la seguente differenza: numero.reale − numero.rappresentabile = ε ass In generale dunque, dati m bit per la parte frazionaria del numero, in una rappresentazione in virgola fissa, l’errore assoluto sarà dato da: ε ass = 1 2 m +1 = errore assoluto dove 1/2m è il valore del segmento che separa i numeri rappresentati in virgola fissa, detto anche unità di misura tra due numeri consecutivi, che diviso 2, individua la distanza massima tra i due estremi dell’intervallo stesso, ottenendo appunto: 1/2m+1. Nell’esempio essendo m = 3, l’errore massimo diventa: 1/23+1 = 1/16. 3.5.2. Errore relativo. L’errore assoluto non è molto informativo, perché risente della specificità particolare dell’informazione contenuta nel numero rappresentato: infatti Università degli studi di Padova - Facoltà di Scienze Statistiche Corso di Laurea in Gestione delle Imprese – “Sistemi d elaborazione”. Prof . Nicola Zingirian 74 l’informazione contenuta nell’errore assoluto, non da l’ordine di grandezza dell’errore generico commesso complessivamente dalla rappresentazione in virgola mobile con m bit di parte frazionaria, ma quantifica solamente quello commesso da quel specifico numero rappresentato. Pertanto una grandezza significativa nonché realmente informativa dell’errore è data, anziché dall’errore assoluto, da quello relativo così definito: ε ass numero.reale.da.rappresentare = errore relativo L’obiettivo dei numeri in virgola mobile, è quello di riferirsi ad un errore espresso in numero percentuale, poiché viene rapportato all’ordine di grandezza dell’insieme rappresentabile e quindi valido in generale. Perciò anche se le rappresentazioni in virgola mobile non risolvono il problema dell’errore, riescono comunque a contenerlo entro un certo limite e ad esprimerlo in termini percentuali. Per capire meglio come funziona il ragionamento della virgola mobile consideriamo un esempio. Abbiamo visto che l’idea del numero frazionario è quello di prendere come unità di misura non più l’unità, ma una frazione. Consideriamo l’asse dei numeri reali: figura 3.3. Supponendo di scegliere m=3 bit per la parte frazionaria, significa che oltre a prendere tre numeri dopo la virgola, graficamente dividiamo il segmento che va da 1 a 2, in otto piccoli intervalli che misurano tutti per 1/8, seguendo proprio lo stesso ragionamento per i numeri in virgola fissa. E’ come se stessimo considerando un generico numero 1,b1b2b3, dove i bi sono i bit della parte frazionaria, ed elencassimo le otto possibili rappresentazioni della parte frazionaria, che nella figura 3.3. sono state organizzate nel segmento 1-2. Il ragionamento della virgola mobile, è quello di cambiare scala di rappresentazione, quando si esauriscono tutte le possibili combinazioni di frazioni rappresentabili con gli m bit utilizzati. Università degli studi di Padova - Facoltà di Scienze Statistiche Corso di Laurea in Gestione delle Imprese – “Sistemi d elaborazione”. Prof . Nicola Zingirian 75 Nell’esempio, avendo ordinato nell’asse reale le otto possibili combinazioni di numeri frazionari da 1 a 2, ad intervalli ciascuno di lunghezza pari ad 1/8, la rappresentazione in virgola mobile fa si che dal 2 al 4, la distanza tra i numeri rappresentabili, non misuri più 1/8, ma la raddoppia portandola così da 1/8 a ¼. Questo perché andando avanti, si vanno a considerare numeri che sono il doppio di quelli compresi nell’intervallo precedente che va da 1 a 2, e quindi, se si vuole mantenere circa costante l’errore relativo, dobbiamo raddoppiare anche l’unità di misura. Così facendo, la successiva rappresentazione dopo l’intervallo 1-2, la realizziamo in modo tale da considerare sempre lo stesso numero di intervalli di prima,ossia otto, ricordandoci però di raddoppiare questa volta, l’unità di misura portandoli cioè da 1/8 a ¼. Ma andando a raddoppiare l’unità di misura, mantenendo sempre costante il numero degli intervalli, è evidente che spostandoci dalla cifra 2 per ancora 8 intervalli di ampiezza pari ad ¼, andiamo a raggiungere il numero 4: si è dunque passati a considerare un intervallo che è doppio del precedente! Tutto questo discorso, in termini di rappresentazioni binarie con virgola, corrisponde ad aver spostato a sinistra la virgola del generico numero 1,b1b2b3, moltiplicandolo per 2 elevato ad una certa grandezza data dall’esponente e: (1,b1b2b3) *2e dove e nel caso delle rappresentazioni che vanno da 1 a 2, compresi naturalmente anche gli ottavi, vale 0, mentre per le rappresentazioni che vanno da 2 a 4 vale 1. Per e = 0: (1,b1b2b3) *20 = 1,b1b2b3 se per esempio consideriamo il numero binario1,001, questo in a base 10 diventa: 1,001 = 1+ 1/8 e ci troviamo nella rappresentazione originaria del numero con m=3 bit per la parte frazionaria. per e = 1: Università degli studi di Padova - Facoltà di Scienze Statistiche Corso di Laurea in Gestione delle Imprese – “Sistemi d elaborazione”. Prof . Nicola Zingirian 76 (1,b1b2b3) *21 e sostituendo al numero preso in esempio: (1,001)*2 = (1+ 1/8) = 2+ 2/8 Osserviamo che la prima parte frazionaria, non è più 1/8 come prima, ma si raddoppia a 2/8 = ¼ , proprio perché abbiamo moltiplicato per 2. In generale, nella rappresentazione in virgola mobile, possiamo pensare all’esponente e, come ad un selettore che ci posiziona nella fascia che ci interessa, e che ha come effetto collaterale, visto che ogni volta le fasce raddoppiano, di raddoppiare anche l’intervallo di rappresentazione, per cui il fattore di scala 2e, non solo moltiplica il bit generico 1,b1b2b3, raddoppiandolo, quadruplicandolo e così via a seconda della potenza, ma moltiplica anche quello che sta dopo la virgola, cioè la parte frazionaria: infatti nell’esempio, si è passati da (1+1/8)=1,125 a (2+2/8)= 2,25; graficamente con riferimento alla figura 3.3., significa che la prima tacchetta disponibile subito dopo il numero 2, sull’asse di rappresentazione dei numeri reali, non è più 1/8 ma vale 2/8. Volendo proseguire ancora con lo stesso ragionamento di prima dopo la cifra 4, sempre per otto intervalli e ricordando di raddoppiarne la lunghezza, arriviamo questa volta fino a numero 8. Infatti, per un valore dell’esponente e = 2, ci muoviamo con il generico numero 1,b1b2b3, moltiplicato per 22, ottenendo così 4,b1b2b3, e dove il valore delle cifre frazionarie è di 1/2 , raddoppiando infatti l’unità di misura dell’intervallo precedente, 2 – 4, che era di un quarto. Ciò significa dunque che, analogamente a quanto succedeva nell’intervallo precedente, la distanza tra i numeri rappresentabili dopo il 4, è raddoppiata così da 4 si passa direttamente a 4,5, da 4,5 a 5 e così via; in sostanza si è preso lo spazio che divide il numero 4 dal numero 8, e lo si è diviso sempre in 8 piccoli segmenti che però sono pari ad 1/2. In sostanza man mano che andiamo avanti nella rappresentazione dei numeri frazionari, con lo stesso numero di bit per la parte frazionaria, andiamo ad aumentare sempre più l’unità di misura degli intervalli che separano i numeri rappresentabili, nonché il valore dei numeri stessi. L’effetto è dunque quello di far crescere l’errore possibile nello stesso rapporto con cui crescono i numeri che stiamo rappresentando, semplicemente andando a Università degli studi di Padova - Facoltà di Scienze Statistiche Corso di Laurea in Gestione delle Imprese – “Sistemi d elaborazione”. Prof . Nicola Zingirian 77 raddoppiare l’unità di misura ogni volta che si considerano numeri che sono grandi il doppio: per esempio l’intervallo dei numeri rappresentabili da 2 a 4 usa un’unità di misura che è esattamente la metà di quella dell’intervallo dei numeri rappresentabili tra 4 e 8. Vediamo allora come si comporta l’errore relativo. Si è visto nell’esempio e con riferimento alla figura 3.3., che i numeri rappresentabili da 1 a 2 distano tra loro, per m = 3, da segmenti di 1/8. In questo intervallo l’errore massimo assoluto è: ε ass = 2− m 2 cioè pari ad 1/16. Nell’intervallo da 1 a 2, e = 0, e l’errore relativo, avrà un massimo e un minimo a seconda del numero reale che rappresentiamo, ossia varierà in un intervallo cha va da 1 a 2, tale per cui: ε ass ≤ ε% ≤ 2 ε ass 1 Normalmente il fatto di sapere che un errore è maggiore di una certa grandezza, non è molto interessante, perché l’obiettivo è quello di sapere che l’errore non superi una certa quantità, ciò vuol dire che possiamo anche non considerare l’estremo inferiore dell’intervallo di variabilità dell’errore percentuale, ossia la grandezza ε ass 2 , e concentrare l’attenzione sulla disuguaglianza: ε% ≤ ε ass e=0 1 dove, sostituendo la definizione di valore assoluto data prima, otteniamo: ε% = 1 2 m +1 • 20 e=0 Università degli studi di Padova - Facoltà di Scienze Statistiche Corso di Laurea in Gestione delle Imprese – “Sistemi d elaborazione”. Prof . Nicola Zingirian 78 Analogamente, per e=1, ci muoviamo nell’intervallo da 2 a 4, l’errore assoluto cambierà, perché essendo raddoppiato l’intervallo, passando da 1/8 a 2/8, di conseguenza è raddoppiato anche l’errore assoluto massimo, che sarà: 2 −m 1 •2 2 ε ass = e =1 e come prima, avremo che l’errore percentuale diventa: ε% ≤ al denominatore si ha il minimo ε ass e =1 2 numero rappresentabile considerato nell’intervallo 2- 4, e sostituendo la definizione di errore assoluto: ε ass = 2− m al 2 numeratore, otteniamo: ε ass = 1 2 −m • 21 *2 2 2 e =1 ossia semplificando: ε ass = 1 2 m +1 notiamo che l’errore percentuale è rimasto invariato, perché è raddoppiato sia il primo numero rappresentabile dell’intervallo successivo, in cui si è cambiata l’unità di misura, sia l’unità di misura dell’intervallo. In generale l’errore assoluto è dato: ε ass = 2 − m +1+ e = 2− m −1 • 2e errore assoluto dove 2e è il minimo numero reale rappresentabile ad ogni cambiamento di scala dell’intervallo nei vari passaggi. Quindi l’errore percentuale sarà: ε% ≤ 2 − m −1 • 2 e = 2− m −1 2e errore reativo Università degli studi di Padova - Facoltà di Scienze Statistiche Corso di Laurea in Gestione delle Imprese – “Sistemi d elaborazione”. Prof . Nicola Zingirian 79 quindi l’errore percentuale rimane invariato e non dipende dall’esponente e. Supponiamo ad esempio, di considerare un numero frazionario con sole due cifre dopo la virgola: quindi m=2. In questo caso tutti i numeri rappresentabili che vanno dall’intero 1 all’intero 2, essendo e = 0 disteranno tra loro per 1/4, perché con due bit dopo la virgola, significa che stiamo considerando i quarti della parte frazionaria. Andando avanti, quindi per e=1, e seguendo il meccanismo di rappresentazione in virgola mobile, tutti i numeri che andranno dall’intero 2 all’intero 4, disteranno di un’unità di misura che sarà pari al doppio di quella dell’intervallo precedente, ossia disteranno per ½, pertanto i numeri che si potranno rappresentare saranno il 2, il 2, 5, il 3, e così via. A questo punto, nell’intervallo che va dalla cifra 4 alla cifra 8, quindi per e=2, vediamo che, come al solito l’unità di misura è raddoppiata, ma questa volta la parte frazionaria non viene nemmeno più considerata; non abbiamo cioè, più numeri frazionari. Inoltre se passiamo nell’intervallo da 8 a 16, raddoppiando ulteriormente l’unità di misura, alcuni numeri interi non vengono nemmeno più rappresentati, passando infatti dalla cifra 8 direttamente alla cifra 10, dalla 10 alla 12 e così via fino alla 16. Infatti, essendo m=2, l’intervallo continua ad essere diviso in quattro parti, tenendo però presente che l’unità di misura viene proporzionata di volta in volta in base al fattore di scala 2e, modificato allo scopo di mantenere circa costante l’errore relativo di approssimazione. Quindi la rappresentazione in virgola mobile fa si, che da intervalli di una certa lunghezza in poi, alcuni numeri interi non vengano nemmeno più rappresentati, e questo perché quanto più è grande il numero rappresentato, meno significativo diventa l’errore. In generale, vediamo allora che la parte frazionaria sparisce quando l’esponente e supera m; ossia e>m. Università degli studi di Padova - Facoltà di Scienze Statistiche Corso di Laurea in Gestione delle Imprese – “Sistemi d elaborazione”. Prof . Nicola Zingirian 80 Nel caso del generico numero 1,b1b2, per m=2, vediamo che nell’intervallo dei numeri rappresentati da 1 a 2, quindi per e=0, la sequenza di bit che sta dopo la virgola, corrisponde esattamente alla parte frazionaria del numero, come se fosse un numero rappresentato in virgola fissa. Man mano però che andiamo avanti nella rappresentazione, i numeri dopo la virgola, ad un certo punto, smettono di essere una parte frazionaria a causa del fattore di scala 2e-m-1, perché di volta in volta la virgola viene spostata verso destra, al punto che per e>m, si rappresentano numeri interi, con una distanza tra loro che, da certi valori di e, non sarà più nemmeno pari ad uno, ma aumenterà sempre del solito fattore di scala e, andando così a diradare l’insieme dei numeri rappresentabili. Tutto questo per il semplice fatto, che per numeri sufficientemente grandi, l’errore che si commette nella loro rappresentazione, perde sempre più di significato a fronte di una precisione che diventa superflua. Consideriamo un esempio con una mantissa di tre bit data dalla sequenza 101, e sia la seguente tabella: nella mantissa esponente 101 101 101 101 101 0 1 2 3 4 colonna in virgola intervalli di mobile rapp.ione 1,01 11,01 110,1 1101,00 11010 [1 - 2 [2 - 4 [4 - 8 [8 - 16 [16 - 32 della rappresentazione in virgola frazioni 1+5/8 2+10/8 4+20/8 8+40/8 16+80/8 mobile, abbiamo sempre mantenuto la mantissa fissa: 101, ma abbiamo cambiato gli esponenti. Nell’esempio stiamo considerando il quinto intervallo che divide i numeri rappresentabili, poiché 101 corrisponde al numero 5 in rappresentazione a base 10, e visto che stiamo considerando 3 bit per la parte frazionaria, ogni intervallo varrà 1/8 per e=0, 10/8 per e=1, 20/8 per e=2 e così via. Al variare dell’esponente, cambia anche l’intervallo dei numeri rappresentabili, che si diraderà per valori di e sempre più grandi, anche se la mantissa rimarrà sempre la quinta tacca di un intervallo che varierà al variare di e. La rappresentazione in virgola mobile è data dunque da un numero di riferimento, che è 1 virgola una sequenza di bit, che viene di volta in volta raddoppiato dall’esponente per andare a rappresentare numeri più grandi con Università degli studi di Padova - Facoltà di Scienze Statistiche Corso di Laurea in Gestione delle Imprese – “Sistemi d elaborazione”. Prof . Nicola Zingirian 81 intervalli a sua volta più grandi, ossia proporzionali alla grandezza del numero, facendo si che l’errore percentuale rimanga costante. Quindi la caratteristica della rappresentazione in virgola mobile, è che il valore degli intervalli tra due numeri float, ossia i due numeri 2e e 2e+1, non è costante lungo tutto l'intervallo di valori utili come accade invece con i numeri reali, ma, relativo alla grandezza del numero stesso. Infatti l’intervallo 1- 2 ha un valore più piccolo dell’intervallo 2 – 4, e questa differenza di grandezza tende ad aumentare con l'aumentare del valore del numero float. Se però lo si calcola come variazione percentuale del numero stesso, allora questa risulta costante, e ne consegue che l'errore relativo dovuto all'arrotondamento, sia costante in tutta l'estensione delle regioni 1 e 8, a prescindere dalla grandezza del numero, ovvero che è possibile applicare il medesimo arrotondamento percentuale a tutti i numeri utili dell'intervallo, ed ottenere il medesimo errore relativo lungo tutto l'arco dei valori. 3.5.3. Ruolo giocato dalla mantissa e dall’esponente Si è visto che un qualsiasi numero frazionario, può essere espresso come prodotto di due grandezze: mantissa ed esponente. Mentre la mantissa determina il numero degli intervalli che distanziano tra di loro le cifre rappresentabili, l’esponente indica in quale intervallo di rappresentazione ci troviamo e con quale scala dividiamo in parti uguali l’intervallo la cui ampiezza sarà data da: [2e - 2e+1) La singola unità con cui ci spostiamo, ossia la misura della distanza tra i numeri rappresentabili è pari a: 1 • 2e 2m Università degli studi di Padova - Facoltà di Scienze Statistiche Corso di Laurea in Gestione delle Imprese – “Sistemi d elaborazione”. Prof . Nicola Zingirian 82 dove m sono i bit della mantissa. Vediamo dunque che al variare dell’esponente, l’ampiezza degli intervalli, il cui numero rimane fisso ed è dato dalla mantissa, cresce per potenze di due. Quindi l’esponente gioca due ruoli fondamentali: uno nel determinare l’intervallo di rappresentazione, e l’altro, contestualmente all’intervallo, misura quanto è larga la scala, per cui facendo crescere la scala in ragione dei numeri rappresentabili, l’errore percentuale rimane costante. Per quanto riguarda i numeri compresi tra zero e uno, il ragionamento della virgola mobile è molto simile a quello finora visto: infatti l’esponente e, assumerà valori negativi a partire da -1. Così per esempio, per e=-1, ci muoviamo nell’intervallo che, secondo quanto scritto sopra, va da 2e a 2e+1 dove sostituendo, otteniamo i due estremi: [2-1- 20). Quindi per e=-1, siamo nell’intervallo che va da ½ a 1; questo intervallo, a sua volta sarà partizionato in 2m parti uguali, dove ricordiamo che m sono i bit della mantissa. Così se per esempio m = 3, l’intervallo in questione sarà suddiviso in 8 parti uguali. Attenzione però che muovendoci su un intervallo inferiore all’unità, per potenze negative dell’esponente, l’ampiezza degli intervalli non viene più questa volta raddoppiata, quadruplicata eccetera, a seconda del valore di e, ma proprio perché e viene elevato ad un numero negativo, l’intervallo dimezzerà, si ridurrà ad un quarto e così via, arrivando così ad ampiezze sempre più piccole. In questo caso dunque il ragionamento si inverte rispetto a potenze positive dell’esponente e. Con riferimento all’esempio per m = 3, l’ampiezza degli otto intervalli tra i due numeri ½ e zero, sarà di 1/16, e non 1/8 come accadeva per l’intervallo tra 1 e 2. Analogamente, avvicinandosi allo zero, gli otto intervalli tra ½ e 1/4, avranno ampiezza 1/32, ossia i numeri rappresentabili tra 1/4 e ½, disteranno tra loro per 1/32. Quindi man mano che ci si avvicina allo zero, si riduce sempre di più la distanza dei numeri rappresentabili ottenendo in questo modo una maggiore precisione. Università degli studi di Padova - Facoltà di Scienze Statistiche Corso di Laurea in Gestione delle Imprese – “Sistemi d elaborazione”. Prof . Nicola Zingirian 83 Mentre la mantissa è molto semplice da calcolare, perché è come una rappresentazione in virgola fissa, dopo che si è arrivati a normalizzare il numero3, l’esponente invece pone il problema di come si rappresentano esponenti negativi. Per vedere come si rappresenta un numero frazionario qualsiasi a base 10 in virgola mobile, consideriamo il seguente esempio: supponiamo di voler rappresentare il numero 3,1415. Per prima cosa, dobbiamo stabilire a priori quanti bit attribuire alla mantissa e quanti all’esponente. Si è visto che la rappresentazione standard in virgola mobile, definita come IEEE, stabilisce 1 bit per il segno, 23 bit di mantissa e 8 bit di esponente, per un totale di 32 bit; in questo esempio però, stabiliamo 4 bit per la mantissa e 4 bit per l’esponente. Una volta determinati i bit da attribuire all’esponente e alla mantissa, trasformiamo in virgola fissa, il numero da rappresentare: per quanto riguarda la parte intera, si procede nel solito metodo di conversione, per cui il numero 3, sarà rappresentato in binario dal numero 11. Per quanto riguarda invece la parte frazionaria, 0,1415, si usa il metodo delle moltiplicazioni successive per due: per cui la conversione da decimale a base due sarà: 0,415 x 2 = 0,2830 0,2830 x 2 = 0,5660 0,5660 x 2 = 1,132 0,132 x 2 = 0,264 Potremmo andare avanti con le moltiplicazioni, ma avendo inizialmente fissato a 4 bit la rappresentazione della parte decimale, interrompiamo il conteggio alla quarta moltiplicazione. Quindi la rappresentazione in virgola mobile del numero 3,1415 sarà 11,0010: 3,1415(10) = 11,0010(2) A questo punto, per passare dalla rappresentazione in virgola fissa alla rappresentazione 3 in virgola mobile del numero così ottenuto, dobbiamo Normalizzare significa portare il numero ad una rappresentazione del tipo 1 virgola la sequenza dei bit: 1,b1b2...bm. si traslano verso sinistra o verso destra, la cifre diverse da zero (significative) decrementando i incrementando l'esponente di tante cifre quante sono le posizioni scalate: in questo modo si ottiene un altro numero float distinto, ma avente il medesimo valore del precedente, ottenendo in questo modo una sua semplificazione, e soprattutto la semplificazione dei calcoli che lo coinvolgono. Università degli studi di Padova - Facoltà di Scienze Statistiche Corso di Laurea in Gestione delle Imprese – “Sistemi d elaborazione”. Prof . Nicola Zingirian 84 normalizzare4 il risultato portandolo ad una notazione del tipo 1,M dove M è la mantissa, e moltiplicarlo per 2e, facendo in modo che valga la seguente uguaglianza: 11,0010 = 1,M * 2e dobbiamo cioè in questo esempio, spostare la virgola di una posizione a partire da sinistra, ricordandoci però di compensare il cambiamento, moltiplicando la nuova rappresentazione per 2e, allo scopo di mantenere costante il valore e far valere così l’uguaglianza di rappresentazione. In questo caso, spostandoci a sinistra di una sola posizione, l’esponente e varrà 1, per cui otterremo: 11,0010 = 1,1001(0) * 21 In sostanza abbiamo moltiplicato e diviso per 21, il numero 11,0010 rappresentato in virgola fissa. A questo punto abbiamo ricavato il valore dell’esponente e = 1, e la mantissa che sarà data dalla sequenza di bit: 1001, l’ultimo zero di bit, non è stato considerato, perché si è fissato a priori m = 4 per la parte frazionaria. Tuttavia non possiamo accettare di prendere 1 come valore dell’esponente, e quindi poter pensare di rappresentarlo con la sequenza 0001, avendo fissato all’inizio 4 bit di esponente. Questo perché facendo così, non consideriamo i numeri negativi, e l’esponente e, nella rappresentazione in virgola mobile, non viene rappresentato in complemento a due, ma rappresentato in eccesso k, una codifica che abbiamo visto in precedenza5. Ricordiamo che la rappresentazione in eccesso k, codifica i numeri orinandoli dal più piccolo al più grande: in questo esempio il numero più piccolo è dato da (2n-1–1) ossia avendo fissato 4 bit di esponente sarà: eccessok = (2n-1 -1) = 24-1 - 1 = 7 4 per n = 4 Vale la pena di ricordare, che la rappresentazione in virgola fissa non viene mai usata se non come passo concettuale per arrivare ad una rappresentazione in virgola mobile. 5 Vedi par. 2.82. cap.2 Università degli studi di Padova - Facoltà di Scienze Statistiche Corso di Laurea in Gestione delle Imprese – “Sistemi d elaborazione”. Prof . Nicola Zingirian 85 Quindi al valore 1 individuato in precedenza per l’esponente, sommiamo il numero più piccolo negativo rappresentabile, ossia il valore dell’eccesso, che in questo caso vale 7, ottenendo così il valore corretto di e: E = e + (2n-1 -1) = 1 + 24-1 - 1 = 8 A questo punto è sufficiente convertire in base 2 il valore dell’esponente così ottenuto, tenendo presente che consideriamo 4 bit per l’esponente: 8(10) = 1000 Pertanto, la rappresentazione in virgola mobile del numero 3,1415 ha portato ad individuare mantissa ed esponente rispettivamente pari a : M = 1001 E = 1000 Segno = 0 Vale la pena di osservare che in virgola mobile, si adotta per convenzione, la rappresentazione valore più segno, perché prevalendo l’esigenza di trattare i numeri con la virgola, la rappresentazione in complemento a due ostacolerebbe l’utilizzo dell’algebra dei numeri frazionari. Si è visto che il fatto di avere un numero limitato di bit per la mantissa, si traduce in un troncamento della parte frazionaria del numero da rappresentare, e questo, nella conversione in base 2 della parte frazionaria del numero, porta ad interrompere l’iterazione delle moltiplicazioni fino a quando si è raggiunti il numero di bit fissato a priori per la parte decimale6. Ora il vantaggio della rappresentazione in virgola mobile è che non è vincolante sapere a priori il numero dei bit necessari per la codifica, essendo questa una scelta discrezionale. Tuttavia bisogna avere l’accortezza di ricordare che la normalizzazione opera un troncamento che va ad incidere sulla precisione della rappresentazione, perciò quando si decidono a priori i bit da fissare per la mantissa, bisogna operare una 6 In generale più è grande la parte intera del numero frazionario, meno cifre decimali servono per rappresentarlo, perché poi queste si perdono quando lo si normalizza, viceversa la normalizzazione non disperderà la parte frazionaria quando abbiamo a che fare con parti intere relativamente piccole. Università degli studi di Padova - Facoltà di Scienze Statistiche Corso di Laurea in Gestione delle Imprese – “Sistemi d elaborazione”. Prof . Nicola Zingirian 86 scelta che ottimizzi in qualche modo la perdita dei bit che vengono esclusi poi con la normalizzazione. In generale infatti, nella rappresentazione in virgola mobile, sappiamo che abbiamo un numero fisso di bit Ntot, che dobbiamo poi destinare in parte per la mantissa, Nm, in parte per l’esponente, Ne, e un bit per il segno in questo modo: Ntot = Nm + Ne +1 Dove con Ntot bit individuiamo 2 Ntot oggetti. Sappiamo inoltre che l’errore relativo della rappresentazione in virgola mobile è dato da ε% = 1 2 Nm+1 notiamo che maggiore è il numero di bit che assegniamo alla mantissa, minore è l’errore relativo che si compie nella rappresentazione in virgola mobile; ciò significa che il numero di bit che si decide di assegnare alla parte frazionaria, ha conseguenze sulla precisione7 del numero, per cui più bit dedichiamo alla mantissa, più guadagniamo in precisione. Non dobbiamo però dimenticare che, avendo a che fare con un numero fisso di bit totali, scegliendo un Nm molto grande, andiamo a ridurre il totale dei numeri rappresentabili Ne, in quanto togliamo bit all’esponente. Si è infatti visto, che dato un certo valore dell’esponente, l’intervallo di numeri rappresentabili sarà: 2e - 2e+1 possiamo dunque estendere il discorso, dicendo che l’intervallo di tutti i numeri rappresentabili, sarà: 2emin - 2emax+1 dove l’estremo inferiore 2emin, potendo essere emin un numero negativo, assumerà valori molto piccoli per valori crescenti di e, mentre l’estremo superiore 2emax+1, tenderà ad aumentare per valori di e molto grandi. 7 Per precisione di una rappresentazione in virgola mobile si intende il numero di cifre frazionarie che si riescono a rappresentare senza troncamenti, ovvero la distanza tra due numeri rappresentabili adiacenti. Università degli studi di Padova - Facoltà di Scienze Statistiche Corso di Laurea in Gestione delle Imprese – “Sistemi d elaborazione”. Prof . Nicola Zingirian 87 La variabilità dipende dalla scelta discrezionale che si compie nell’attribuire il numero di bit all’esponente. Vediamo allora che: emin = - [ 2Ne-1 -1) emax = + [ 2Ne-1 ) Ma ciò significa allora che, sostituendo emin emax all’intervallo dei numeri rappresentabili dato un certo valore di e, cioè: 2emin - 2emax+1 fa si che l’intervallo totale dei numeri rappresentabili, potendo dipendere dalla scelta dei bit che diamo all’esponente, sarà: 2 −2 Ne −1 ÷ 22 Ne −1 +1 questo perché i bit che si danno all’esponente, servono a codificare l’insieme dei numeri rappresentabili, per cui man mano che crescono i bit assegnati all’esponente, cresce esponenzialmente anche l’insieme dei numeri rappresentabili Questo spiega dunque, in modo concettuale, l’importanza della discrezionalità della scelta dei bit che a priori si decide di ripartire tra mantissa ed esponente, avendo un numero costante di bit totali. Per cui se scegliamo un numero m di bit molto grande per la mantissa, guadagniamo in precisione, ma ci perdiamo in termini di quantità di numeri rappresentabili, viceversa se assegniamo un numero elevato di bit all’esponente, aumentiamo l’intervallo dei numeri rappresentabili, ma aumentiamo anche l’errore relativo. Prima si era rappresentato in virgola mobile, il numero frazionario 3,1415(10) e si è visto che si era arrivati a rappresentarlo nel modo seguente: 3,1415(10) = 1.1001*2e dove M = 1001, era la mantissa ed E = 1000 era l’esponente, ossia: 1.1001*28-7 = 11,001 Università degli studi di Padova - Facoltà di Scienze Statistiche Corso di Laurea in Gestione delle Imprese – “Sistemi d elaborazione”. Prof . Nicola Zingirian 88 L’esponente è dato dal suo corrispondente valore in base 10, diminuito dell’eccesso (2n-1 -1) =7. Con la rappresentazione cos’ ottenuta, verifichiamo che numero abbiamo rappresentato. In questo caso, basta fare il ragionamento opposto. Ossia vediamo che la parte intera è 11, che in base 10 corrisponde al numero 3, mentre la parte frazionaria corrisponde a 1/8, ossia 0,125, per cui il numero ottenuto è: 1.1001*28-7 = 11,001 = 3,125 che è chiaramente diverso da quello originario di partenza, ossia 3,1415. L’errore assoluto sarà ε ass = 3,1415 − 3,125 = 0,0165 L’errore percentuale invece sarà: ε% = 0,0165 = 0,005 = 0,5% 3,1415 abbiamo commesso un errore del 0,05% contro un errore massimo che la rappresentazione con 4 bit di mantissa poteva farci compiere, ossia: ε % max 1 2 4 +1 = 1 = 0,031 = 3% 32