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