CAP3 - home page | DEIpanico/APPUNTI/cap3... · La rappresentazione in virgola fissa dei numeri...

29
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 (2 n ); 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: X f = i, p 0 p 1 p 2 ....p n dove i è la parte intera del numero, mentre p 0 p 1 p 2 ....p n , è 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 m i i i b 2

Transcript of CAP3 - home page | DEIpanico/APPUNTI/cap3... · La rappresentazione in virgola fissa dei numeri...

Page 1: CAP3 - home page | DEIpanico/APPUNTI/cap3... · La rappresentazione in virgola fissa dei numeri frazionari, segue le stesse regole viste fino ad ora viste per la rappresentazione

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

mi

i

ib 2

Page 2: CAP3 - home page | DEIpanico/APPUNTI/cap3... · La rappresentazione in virgola fissa dei numeri frazionari, segue le stesse regole viste fino ad ora viste per la rappresentazione

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 + b12

1+..........+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.

Page 3: CAP3 - home page | DEIpanico/APPUNTI/cap3... · La rappresentazione in virgola fissa dei numeri frazionari, segue le stesse regole viste fino ad ora viste per la rappresentazione

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 resto 0 11 : 2 resto 1 5 : 2 resto 1 2 : 2 resto 0 1 : 2 resto 1

Page 4: CAP3 - home page | DEIpanico/APPUNTI/cap3... · La rappresentazione in virgola fissa dei numeri frazionari, segue le stesse regole viste fino ad ora viste per la rappresentazione

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 x 2 = 0.824 0 0.824 x 2 = 1.648 1 0.648 x 2 = 1.296 1 0.296 x 2 = 0.592 0 0.592 x 2 = 1.184 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

Page 5: CAP3 - home page | DEIpanico/APPUNTI/cap3... · La rappresentazione in virgola fissa dei numeri frazionari, segue le stesse regole viste fino ad ora viste per la rappresentazione

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.

Page 6: CAP3 - home page | DEIpanico/APPUNTI/cap3... · La rappresentazione in virgola fissa dei numeri frazionari, segue le stesse regole viste fino ad ora viste per la rappresentazione

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.

1In 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%

Page 7: CAP3 - home page | DEIpanico/APPUNTI/cap3... · La rappresentazione in virgola fissa dei numeri frazionari, segue le stesse regole viste fino ad ora viste per la rappresentazione

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 in virgola mobile standard IEEE, parte da una

rappresentazione di n=32 bit, i quali vengono così distribuiti per 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

ebmq

p*=

e ponendo la base b uguale 2 otteniamo che la rappresentazione dei numeri

frazionari, mantissa esponente diventa:

x = m*2e

Page 8: CAP3 - home page | DEIpanico/APPUNTI/cap3... · La rappresentazione in virgola fissa dei numeri frazionari, segue le stesse regole viste fino ad ora viste per la rappresentazione

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).

Page 9: CAP3 - home page | DEIpanico/APPUNTI/cap3... · La rappresentazione in virgola fissa dei numeri frazionari, segue le stesse regole viste fino ad ora viste per la rappresentazione

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 Il valore dell’eccesso è dato da: (2

n-1 -1) che per 8 bit sarà: (2

8-1 -1) = 2

7 – 1 = 127

Page 10: CAP3 - home page | DEIpanico/APPUNTI/cap3... · La rappresentazione in virgola fissa dei numeri frazionari, segue le stesse regole viste fino ad ora viste per la rappresentazione

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)

Page 11: CAP3 - home page | DEIpanico/APPUNTI/cap3... · La rappresentazione in virgola fissa dei numeri frazionari, segue le stesse regole viste fino ad ora viste per la rappresentazione

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 1 0 0 0 0 0 1 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

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

mi

i

ib 2

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 + b12

1+..........+bk-12k-1

possiamo riscrivere questo numero raccogliendo 2-m, ottenendo così questo

risultato:

2-m [b-m2o + b-m+12

1+.......+...........+b02m + b12

m+1+..........+bk-12m+k-1]

Page 12: CAP3 - home page | DEIpanico/APPUNTI/cap3... · La rappresentazione in virgola fissa dei numeri frazionari, segue le stesse regole viste fino ad ora viste per la rappresentazione

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-12

n-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.

Page 13: CAP3 - home page | DEIpanico/APPUNTI/cap3... · La rappresentazione in virgola fissa dei numeri frazionari, segue le stesse regole viste fino ad ora viste per la rappresentazione

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 riferimento alla rappresentazione sull’asse dei numeri reali

dell’esempio, l’errore massimo che possiamo commettere 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

Page 14: CAP3 - home page | DEIpanico/APPUNTI/cap3... · La rappresentazione in virgola fissa dei numeri frazionari, segue le stesse regole viste fino ad ora viste per la rappresentazione

Università degli studi di Padova - Facoltà di Scienze Statistiche Corso di Laurea in Gestione delle Imprese – “Sistemi d elaborazione”. Prof . Nicola Zingirian

73

0 1/8 x0 3/16 x1 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:

assabilerappresentnumerorealenumero ε=− ..

In generale dunque, dati m bit per la parte frazionaria del numero, in una

rappresentazione in virgola fissa, l’errore assoluto sarà dato da:

12

1+=

massε = 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

Max distanza

Page 15: CAP3 - home page | DEIpanico/APPUNTI/cap3... · La rappresentazione in virgola fissa dei numeri frazionari, segue le stesse regole viste fino ad ora viste per la rappresentazione

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:

arerappresentdarealenumero

ass

...

ε= 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.

Page 16: CAP3 - home page | DEIpanico/APPUNTI/cap3... · La rappresentazione in virgola fissa dei numeri frazionari, segue le stesse regole viste fino ad ora viste per la rappresentazione

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:

Page 17: CAP3 - home page | DEIpanico/APPUNTI/cap3... · La rappresentazione in virgola fissa dei numeri frazionari, segue le stesse regole viste fino ad ora viste per la rappresentazione

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

Page 18: CAP3 - home page | DEIpanico/APPUNTI/cap3... · La rappresentazione in virgola fissa dei numeri frazionari, segue le stesse regole viste fino ad ora viste per la rappresentazione

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 è:

2

2 m

ass

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:

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 2assε

, e concentrare l’attenzione sulla disuguaglianza:

1

%assεε ≤ e = 0

dove, sostituendo la definizione di valore assoluto data prima, otteniamo:

0

1% 22

1•= +m

ε e=0

12%

assass εεε ≤≤

Page 19: CAP3 - home page | DEIpanico/APPUNTI/cap3... · La rappresentazione in virgola fissa dei numeri frazionari, segue le stesse regole viste fino ad ora viste per la rappresentazione

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à:

122

2 •=−m

assε e =1

e come prima, avremo che l’errore percentuale diventa:

2

%assεε ≤ e =1

al denominatore si ha il minimo numero rappresentabile considerato

nell’intervallo 2- 4, e sostituendo la definizione di errore assoluto: 2

2 m

ass

=ε al

numeratore, otteniamo:

122

2 •=−m

assε *22

1 e =1

ossia semplificando:

assε = 12

1+m

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:

emem

ass 222 11 •== −−++−ε errore assoluto

dove 2e è il minimo numero reale rappresentabile ad ogni cambiamento di scala

dell’intervallo nei vari passaggi. Quindi l’errore percentuale sarà:

11

% 22

22 −−−−

=•≤ m

e

em

ε errore reativo

Page 20: CAP3 - home page | DEIpanico/APPUNTI/cap3... · La rappresentazione in virgola fissa dei numeri frazionari, segue le stesse regole viste fino ad ora viste per la rappresentazione

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.

Page 21: CAP3 - home page | DEIpanico/APPUNTI/cap3... · La rappresentazione in virgola fissa dei numeri frazionari, segue le stesse regole viste fino ad ora viste per la rappresentazione

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:

mantissa esponente in virgola

mobile

intervalli di

rapp.ione frazioni

101 0 1,01 [1 - 2 1+5/8 101 1 11,01 [2 - 4 2+10/8 101 2 110,1 [4 - 8 4+20/8 101 3 1101,00 [8 - 16 8+40/8 101 4 11010 [16 - 32 16+80/8

nella colonna della rappresentazione in virgola 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

Page 22: CAP3 - home page | DEIpanico/APPUNTI/cap3... · La rappresentazione in virgola fissa dei numeri frazionari, segue le stesse regole viste fino ad ora viste per la rappresentazione

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:

12

2me•

Page 23: CAP3 - home page | DEIpanico/APPUNTI/cap3... · La rappresentazione in virgola fissa dei numeri frazionari, segue le stesse regole viste fino ad ora viste per la rappresentazione

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.

Page 24: CAP3 - home page | DEIpanico/APPUNTI/cap3... · La rappresentazione in virgola fissa dei numeri frazionari, segue le stesse regole viste fino ad ora viste per la rappresentazione

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 in virgola mobile del numero così ottenuto, dobbiamo

3Normalizzare 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.

Page 25: CAP3 - home page | DEIpanico/APPUNTI/cap3... · La rappresentazione in virgola fissa dei numeri frazionari, segue le stesse regole viste fino ad ora viste per la rappresentazione

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 per n = 4

4Vale 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

Page 26: CAP3 - home page | DEIpanico/APPUNTI/cap3... · La rappresentazione in virgola fissa dei numeri frazionari, segue le stesse regole viste fino ad ora viste per la rappresentazione

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

6In 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.

Page 27: CAP3 - home page | DEIpanico/APPUNTI/cap3... · La rappresentazione in virgola fissa dei numeri frazionari, segue le stesse regole viste fino ad ora viste per la rappresentazione

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

ε% = +

12 1Nm

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.

Page 28: CAP3 - home page | DEIpanico/APPUNTI/cap3... · La rappresentazione in virgola fissa dei numeri frazionari, segue le stesse regole viste fino ad ora viste per la rappresentazione

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 22 2 11 1− +− −÷Ne Ne

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

Page 29: CAP3 - home page | DEIpanico/APPUNTI/cap3... · La rappresentazione in virgola fissa dei numeri frazionari, segue le stesse regole viste fino ad ora viste per la rappresentazione

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à

0165,0125,31415,3 =−=assε

L’errore percentuale invece sarà:

%5,0005,01415,3

0165,0% ===ε

abbiamo commesso un errore del 0,05% contro un errore massimo che la

rappresentazione con 4 bit di mantissa poteva farci compiere, ossia:

%3031,032

1

2

114max% ===+ε