Note ipersintetiche di LPC: i numeri di macchina, singola precisione, opzione bias, chopping, rounding.
Note:
Il seguente file presenta gli appunti personali, al momento non rivisitati od ampliati, della seconda lezione di Laboratorio di Programmazione e Calcolo. Potrebbero esser presenti refusi od affermazioni incorrette.
-Tra i separatori [-x——-x-] ci sono aggiunte personali, tratte dal web, inserite per chiarire alcune definizioni a livello tecnico.
La macchina assegna ad ogni numero reale una certa mantissa a seconda dello spazio dedicato e le rappresentazioni in essa non risultano esser continue, ossia esse sono discrete a causa delle approssimazioni dato che è impossibile rappresentare un numero reale con uno spazio in bit limitato. Ciò comporta errori di calcolo.
I numeri di macchina sono la rappresentazione interna dei numeri all’interno di un computer. Ogni sistema informatico utilizza una certa quantità di bit – ad esempio 32, 64, 128 bit – per rappresentare i numeri. A seconda della quantità di bit disponibili, si possono rappresentare differenti gamme di numeri e precisioni.
Per rappresentare i numeri di macchina si utilizza il sistema floating point normalizzato $mathbb{F}(β,t,L,U)$ ove $β geq 2$ rappresenta la base, $t$ il numero di cifre significative, $L<0$ il minimo valore dell’esponente ed $U>0$ il massimo valore dell’esponente.
L’insieme è definito come: $mathbb{F}(β,t,L,U)$={$x in mathbb{R}, x neq 0, x = pm (0.a_1a_2…a_t}-{[β]} cdot β^e$} $cup$ {$0, Inf, NaN$}, ove $0leq a_i leq β-1, a_1>0, L leq e leq U$.
La normalizzazione è introdotta grazie alla limitazione su $a_1$, la quale garantisce l’unicità di rappresentazione, 0 ha una rappresentazione a parte, ed implica $β^{t-1} leq m leq β^t -1$. Infatti $m=β^{t-1}$ se $a_1=1$ ed i restanti $a_i$ risultano esser nulli ed $m=β^t-1 $ se tutti gli $a_i$ risultano pari a $β-1$.
$mathbb{F}(β,t,L,U) subset Q$ dato che, ad esempio, i numeri periodici od irrazionali non vengono rappresentati perfettamente.
Esempio: $t=4$ , mantissa minima $m=1000_{[β]}$.
Se $β=10$ allora $m=10^3$, se $β=2$ allora $m=2^3$.
Se $x in mathbb{F}(β,t,L,U)$ e non in {0, Inf, NaN}, allora per $|x|=m cdot β^{e-t}$ si ha $x_{min}=β^{L-1}=β^{t-1}β^{L-t}leq m cdot β^{e-t} leq (β^t-1)β^{U-t}=β^U(1-β^{-t}=x_{MAX}$
Si ha un overflow con conseguente interruzione di esecuzione quando il numero inserito in macchina risulta esser maggiore in modulo di $x_{MAX}$, la codifica è Inf.
Si ha un underflow quando il numero inserito in macchina risulta esser minore in modulo di $x_{min}$, tale approssimazione viene gestita dal sistema tramite approssimazione e non interruzione.
NaN significa Not a Number e corrisponde alle forme indeterminate riscontrate nel calcolo dei limiti in analisi.
Fissati N e t, in un sistema floating point si hanno N-t-1 bit per l’esponente con segno.
Esempio: Se si ha un byte a disposizione per la rappresentazione in fp in base 2, si potrebbe scegliere di avere una mantissa ed esponente di tre cifre adoperando poi i due bit per i rispettivi segni. In tal caso si ha come mantissa massima $111_{[2]}=7$ $rightarrow L=-7, U=7$.
SINGOLA PRECISIONE E DOPPIA PRECISIONE PER LA RAPPRESENTAZIONE BINARIA β=2
Lo standard IEEE, Institute of Electrical and Electronic Engeneers, prescrive N=32bit=4byte (t=23bit + 8bit per l’esponente) per la singola precisione ed N=64bit=8byte (t=52bit + 11bit per l’esponente) per la doppia precisione.
-x———x-
cosa si intende per BIAS:
Nel contesto della rappresentazione flottante, come il formato IEEE 754, il bias è utilizzato per rappresentare gli esponenti dei numeri in modo che possano includere valori negativi. Il bias è una tecnica per semplificare la rappresentazione di numeri con segno e permette di includere sia valori positivi che negativi in un formato standardizzato.
Esempio:
Rappresentazione dell’esponente: Supponiamo di avere un formato di rappresentazione a virgola mobile che utilizza 8 bit per l’esponente. Se vogliamo rappresentare esponenti che vanno da -127 a +128, possiamo utilizzare un bias di 127. In questo modo:
-Un esponente di 0 sarà rappresentato come (127) (0 + 127).
-Un esponente di -1 sarà rappresentato come (126) (-1 + 127).
-Un esponente di +1 sarà rappresentato come (128) (+1 + 127).
Vantaggi: Utilizzando il bias, possiamo rappresentare esponenti con valori negativi senza dover utilizzare bit aggiuntivi per segnare il segno dell’esponente.
Applicazioni: Il concetto di bias è utilizzato non solo nelle rappresentazioni a virgola mobile, ma può essere utilizzato anche nella codifica di altre strutture dati, come per esempio nelle codifiche di interi.
-x—————x-
La singola precisione in C++ viene di norma utilizzata per le variabili di tipo float.
Poiché sono disponibili 8bit per l’esponente si potrebbe utilizzare un bit per il segno e sette bit per il numero in modo da ottenere $0 leq |e| leq 127$ ricavando le limitazioni L=-127 ed U=127. Per risparmiare la doppia rappresentazione dello 0, ossia il $(-1)^s$, si possono utilizzare tutti gli 8 bit per il numero ed ottenere $0 leq |E| leq 2^8-1$ definendo tramite bias b=127 l’equazione e=E-b; ciò comporta L=-127 ed U=128.
La doppia precisione in C++ viene di norma utilizzata per le variabili di tipo double.
Con gli 11bit a disposizione per l’esponente si ha $0 leq E leq 2^{11} -1$. Dunque con bias b=1023 si ottiene L=-1023 ed U=1024.
Per L ed U non vi è alcuno standard universalmente riconosciuto, in generale si predilige l’opzione bias.
In $mathbb{F}(2,23,-127,128), x_{min}=2^{-128} approx 2.9 cdot 10^{-39}$ ed $x_{MAX}=2^{128} approx 3.4 cdot 10^{38}$.
In $mathbb{F}(2,52,-1023,1024), x_{min}=2^{-1024} approx 5.6 cdot 10^{-309}$ ed $x_{MAX}=2^{1024} approx 1.8 cdot 10^{308}$.
APPROSSIMAZIONE PER TRONCAMENTO (CHOPPING) ED ARROTONDAMENTO(ROUNDING).
$mathbb{F}$ è un sottoinsieme di Q, e dunque di R. Non tutti i numeri razionali ed irrazionali sono rappresentabili completamente tramite la memoria a disposizione del sistema.
Si definisce l’applicazione $fl: R rightarrow F(β,t,L,U)$,
I numeri con modulo maggiore di $x_{MAX}$ vengono posti uguali a $pm Inf$ mentr quelli con modulo minore di $x_{min}$ uguali a 0.
Se $x=pm (0.a_1a_2…a_p)_{[β]} cdot β^e$, ove $p leq t$ ed $e in[L,U]$, allora $fl(x)=x$, ossia è rappresentato così come è dato che è presente anche in F.
Se $x=pm (0.a_1a_2…a_ta_{t+1}…)_{[β]} cdot β^e$, ove $e in[L,U]$, allora la rappresentazione dipende dal sistema in uso. Esistono due sistemi di approssimazione: il chopping ed il rounding.
Chopping: $fl(x)=pm(0.a_1…a_t){[β]} cdot β^e$.
Rounding: agisce come il chopping se e solo se $a_{t+1}<β/2$, altrimenti arrotonda $|x|$ al suo successivo numero di macchina.
ESERCIZIO:
Posto β=2 e t=3, come viene rappresentato $x_{[2]}=(0.0001111)_{[2]}$ in chopping? In rounding? [Soluzione in base-10: 14/128, 16/128]