Sei sulla pagina 1di 7

codifica in virgola mobile (floating point)

Del tutto simile a cosiddetta notazione scientifica o esponenziale

Per rappresentare in modo compatto numeri molto piccoli o molto grandi


e.g. massa dell’elettrone è 9.1095 × 10 –31 Kg
separate parti che descrivono
- ordine di grandezza (potenza di una data base: 10-31)
- precisione con cui è noto il valore (cifre significative: 9.1095)

Ogni numero razionale R esprimibile come segue


R = (±1) × N × b E
N – numero ≥0, con parte intera e parte frazionaria
b - base b > 1
E - esponente intero con segno (i.e., positivo, nullo o negativo)

tipicamente N ed E sono rappresentati separatamente, con gruppi di bit distinti

A parità di precisione, numero di cifre dopo la virgola può cambiare giocando sull’esponente

e.g.: 0,06789013245 × 1015 = 6,789013245 × 1013

-1-
Numero in virgola mobile detto normalizzato se nella parte N virgola posta subito a dx della prima cifra ≠ 0
e.g.: 0,06789013245 × 1015 NON normalizzato
6,789013245 × 1013 NORMALIZZATO
Forma normalizzata vantaggiosa se numero cifre (i.e., bit) disponibili per rappresentare N è limitato
permette di evitare zeri iniziali inutili

e.g.: avendo a disposizione per N solo 10 cifre si ottiene 0,067890132 × 1015 oppure 6,789013245 × 1013
la seconda chiaramente più vantaggiosa: tutte le cifre sono significative

Standard IEEE 754-1985


Quattro diversi formati, differiscono nel numero totale dei bit utilizzati
Quelli più diffusi: - precisione singola: 32 bit
- precisione doppia 64 bit
- precisione tripla 128 bit

Rappresentazione divisa in tre parti: per il segno (1 bit)


per N rappresentazione detta mantissa
per esponente E rappresentazione detta caratteristica
Si assume base b = 2

-2-
Dettaglio della codifica in precisione singola

Segno caratteristica (8 bit) mantissa (23 bit)

Codifica complicata dalla necessità di rappresentare alcuni valori particolari


- NaN (Not a Number, risultato di operazioni non ammesse, e.g., 0/0)
- +∞
∞ e -∞
∞ (e.g. in matlab 3/0=inf)
- Il valore 0 (meno banale di quanto sembri …)

Soluzione: usate due “configurazioni estreme” della caratteristica 00000000 e 111111111 per questi valori speciali

Rappresentazione del segno dell’esponente:


254 configurazioni da 00000001 a 11111110 considerate rappresentazioni dei numeri da 1 a 254 (codifica posizionale)

Si fa in modo che le 254 configurazioni (valori da 1 a 254) rappresentino intervallo di valori dell’esponente
(quasi) esattamente centrati sullo 0 usando …
Notazione “eccesso K”: la caratteristica memorizza il valore dell’esponente aumentato di K
Se caratteristica ha k bit allora si sceglie
K = 2k-1 -1
e.g., con k=8 si memorizza esponente aumentato di K = 27 – 1 = 127

-3-
caratteristica = 250 ⇒ esponente rappresentato = +123
caratteristica = 80 ⇒ esponente rappresentato = -47
caratteristica = 132 ⇒ esponente rappresentato = +5

N rappresentato in forma normalizzata. NB: in binario solo due cifre


⇒ cifra prima della virgola sempre 1 ⇒ lascata sottintesa
⇒ i 23 bit della mantissa rappresentano solo la parte frazionaria di N in forma normalizzata

Casi particolari
NaN caratteristica 255 e mantissa qualsivoglia (NB: molte possibili rappresentazioni)
+∞
∞ bit di segno 0, caratteristica 255 (11111111), mantissa 0 (00000000000000000000000)
-∞
∞ bit di segno 1, caratteristica 255 (11111111), mantissa 0 (00000000000000000000000)
0 bit di segno qss, caratteristica 0, mantissa 0 (⇒
⇒ due rappresentazioni, come se ci fossero +0 e -0)

-4-
Quadro riassuntivo
m NB
c
0 m≠0
0 v=0 v = (-1)S × 2-126 × 0.m
1

1 ≤ c ≤ 254
v = (-1)S × 2c-127 × 1.m

254
v=+∞∞
s=0
255 v = NaN
s=1
v=-∞

Rappresentazione di numeri molto piccoli in valore assoluto


La forma normalizzata (1 prima della virgola) impedisce rappresentazione valori v con |v|<2-127
⇒ con c=0 si assume 0.m invece di 1.m così si possono usare anche i bit 0 della mantissa per “rimpicciolire”
È quasi come dividere per 2 ⇒ per avere continuità nei valori rappresentati si moltiplica per 2-126

-5-
Esempio di rappresentazione in precisione singola

v = 42.687510 = 101010.10112 = 1.0101010112 × 25

Si ha
s=0 (1 bit)
c = 5 + K = 510 + 12710 = 13210 = 100001002 (8 bit)
m = 01010101100000000000000 (23 bit)

rappresentazione è giustapposizione di s, c, ed m: 0 10000100 01010101100000000000000

-6-
PROPRIETÀ FONDAMENTALE DELLA CODIFICA
NB. I circa 4 miliardi di configurazioni (usati 32 bit) consentono di coprire un campo di valori molto ampio
grazie alla distribuzione non uniforme

per numeri piccoli in valore assoluto valori rappresentati sono «fitti»,


per numeri grandi in valore assoluto valori rappresentati sono «diradati»

Approssimativamente gli intervalli tra valori contigui sono:


• per valori di 10000 l’intervallo è di un millesimo
• per valori di 10 milioni l’intervallo è di un’unità
• per valori di 10 miliardi l’intervallo è di mille
• ecc.

- 0 +

? Perché? Si può dare una semplice spiegazione, basata sul numero dei bit allocati per caratteristica e mantissa

-7-