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 10 15 = 6,789013245 10 13-1 -
Numero in virgola mobile detto normalizzato se nella parte N virgola posta subito a dx della prima cifra 0 e.g.: 0,06789013245 10 15 NON normalizzato 6,789013245 10 13 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 10 15 oppure 6,789013245 10 13 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: Si assume base b = 2 per il segno (1 bit) per N rappresentazione detta mantissa per esponente E rappresentazione detta caratteristica - 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 = 2 k-1-1 e.g., con k=8 si memorizza esponente aumentato di K = 2 7 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 c m 0 m 0 NB 0 v = 0 v = (-1) S 2-126 0.m 1 1 c 254 v = (-1) S 2 c-127 1.m 254 255 v=+ s=0 s=1 v=- v = NaN 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.6875 10 = 101010.1011 2 = 1.010101011 2 2 5 Si ha s = 0 (1 bit) c = 5 + K = 5 10 + 127 10 = 132 10 = 10000100 2 (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 -