# Numero in virgola mobile

Il termine numero in virgola mobile (in inglese floating point) in analisi numerica indica il metodo di rappresentazione approssimata dei numeri reali e di elaborazione dei dati usato dai processori per compiere operazioni matematiche.
Si contrappone all'aritmetica intera e a quella in virgola fissa (in inglese fixed-point). In informatica viene usata solitamente in base 2 e in questo caso può essere considerata l'analogo binario della notazione scientifica in base 10.
L'uso di operazioni aritmetiche in virgola mobile è oggi il metodo più diffuso per la gestione di numeri reali e della loro approssimazione razionale nella memoria dei computer.

## Descrizione

Un numero in virgola mobile è costituito, nella sua forma più semplice, da due parti:
* un campo significando o mantissa $M$;
* un campo esponente $E$.
In alcuni casi, ad esempio nello standard IEEE 754, si ha un ulteriore campo: il segno $s$; ma ciò verrà trattato specificamente nella voce relativa.
Un generico numero reale $a$ può così essere rappresentato come (si indica con le lettere maiuscole il significato aritmetico dei campi):
    $\operatorname {a} =\operatorname {M} \times \operatorname {b} ^{E}$
Questo metodo di scrittura permette di rappresentare un amplissimo insieme numerico all'interno di un determinato numero di cifre, cosa che la virgola fissa non concede. Un numero è caratterizzato dal valore $b$, che costituisce la base della notazione in cui è scritto il numero, e la quantità $p$ di cifre presenti nella mantissa, detta precisione. La mantissa di un numero scritto con questo metodo si presenta quindi nella forma ±d.ddd...ddd (una quantità $p$ di cifre d comprese tra 0 e $b-1$). Se la prima cifra della mantissa è diversa da zero, si dice che la rappresentazione è normalizzata. (Se viene usato il campo $s$, la mantissa deve essere positiva, e questo bit ne determina il segno).
L'insieme dei numeri in virgola mobile include i valori $+\infty$, $-\infty$ (più o meno infinito) e NaN (not a number, usato per definire i risultati di operazioni impossibili o non valide).
Nel linguaggio C, la rappresentazione in virgola mobile di un numero razionale float o double deriva dalla rappresentazione scientifica. Nella rappresentazione scientifica un numero è prodotto in due parti: la seconda, detta fattore di scala, è una potenza di 10, l'altra parte, detta parte frazionaria, è un numero tale che, moltiplicato per il fattore di scala, restituisce il numero che vuole rappresentare. Esistono dunque vari modi di rappresentare uno stesso numero, per esempio:
* 0,07824×10$^5$
* 0,7824×10$^4$
* 7,824×10$^3$
* 78240×10$^{−1}$
le quattro notazioni sono equivalenti.
Viene però utilizzata la rappresentazione normalizzata: in essa, si impone che la parte frazionaria sia sempre minore di 1 e la cifra più significativa sia sempre diversa da 0. Quindi, nell'esempio sopra considerato, la notazione corretta è solo la seconda:
* 0,7824×10$^4$
La rappresentazione in virgola mobile è dunque la rappresentazione scientifica normalizzata con l'utilizzo del sistema binario; dunque il fattore di scala è una potenza di 2. La parte frazionaria viene detta mantissa mentre l'esponente della potenza di due è detto esponente. Il numero razionale è dunque così rappresentato:
* ${\text{Mantissa}}\times 2^{\text{Esponente}}$
in cui mantissa ed esponente possono avere segno + o segno −.

### Proprietà dell'aritmetica in virgola mobile

Questa aritmetica presenta due fondamentali differenze dall'aritmetica reale:
* l'aritmetica in virgola mobile non è associativa: in generale, per i numeri in virgola mobile,
    $(x+y)+z\neq x+(y+z)$
    $(x\cdot y)\cdot z\neq x\cdot (y\cdot z)$
* l'aritmetica in virgola mobile non è distributiva: in generale,
    $x\cdot (y+z)\neq (x\cdot y)+(x\cdot z)$.
* esistono l'elemento neutro della moltiplicazione, l'elemento neutro dell'addizione e l'opposto, ma non sono unici.
In definitiva, l'ordine in cui vengono eseguite più operazioni in virgola mobile può variarne il risultato. Questo è importante per l'analisi numerica, in quanto due formule matematicamente equivalenti possono dare risultati diversi, uno anche sensibilmente più accurato dell'altro. Per esempio, nella maggior parte delle applicazioni in virgola mobile, $1,0+(10^{100}+-10^{100})$ dà come risultato $1,0$, mentre $(1,0+10^{100})+-10^{100}$ dà $0,0$.

### Problemi con l'uso della virgola mobile

In generale, questo tipo di numeri si comporta in modo molto simile ai numeri reali. Tuttavia ciò porta spesso i programmatori a non considerare l'importanza di un'adeguata analisi numerica sui risultati ottenuti. Ci sono molte incongruenze tra il comportamento dei numeri in virgola mobile in base 2, impiegati nell'informatica, e quello dei numeri reali, anche in casi molto semplici (ad esempio la frazione 0,1 che non può essere rappresentata in maniera esatta da nessun sistema binario in virgola mobile). Per questo motivo, ad esempio, il formato non è impiegato in campo finanziario.
Le cause principali di errore nel calcolo in virgola mobile sono:
* arrotondamento
** numeri non rappresentabili (ad esempio 0,1);
** arrotondamento di operazioni aritmetiche (es.: $2\div 3=0,666667$);
* assorbimento (es.: 1×10$^{15}$ + 1 = 1×10$^{15}$);
* cancellazione (es.: sottrazione di due numeri molto vicini);
* overflow (con segnalazione di risultato infinito);
* underflow (dà come risultato 0, un numero subnormale o il più piccolo numero rappresentabile);
* operazioni impossibili (es.: radice quadrata di un numero negativo dà come risultato NaN);
* errori di arrotondamento: a differenza della virgola fissa, l'impiego del dithering sulla virgola mobile è pressoché impossibile.
La virgola mobile appare più appropriata quando si richiede una certa precisione relativa al valore. Quando è richiesta una precisione assoluta, la virgola fissa sembra una scelta migliore.
Riguardo all'errore di precisione che provoca l'utilizzo della virgola mobile, innanzitutto notiamo che se x è il numero rappresentato, cioè
    $\mathrm {fl} (x)=\operatorname {sgn}(x)(0.a_{1}a_{2}...a_{n})b^{p}$
allora si avrà
    $b^{p-1}\leq \left|x\right|<b^{p}$
e quindi, se x è il valore da rappresentare e $\mathrm {fl} (x)$ il relativo valore in notazione virgola mobile con mantissa di $t$ cifre, allora l'errore assoluto sarà:
    $\left|x-\mathrm {fl} (x)\right|\leq b^{-t}b^{p}=b^{p-t}$
com'è intuitivo pensare, mentre invece l'errore relativo, che tiene conto della grandezza del numero in esame sarà:
    ${\frac {\left|x-\mathrm {fl} (x)\right|}{\left|x\right|}}\leq b^{1-t}$
quest'ultima maggiorazione è facilmente ricavabile dalla formula dell'errore assoluto: infatti, siccome $|x|\geq b^{p-1}$ allora ${\frac {1}{|x|}}\leq b^{1-p}$ e quindi:
    $b^{p-t}\,b^{1-p}=b^{1-t}$.
In particolare, l'errore relativo, anche se variabile, è sempre al di sotto del valore trovato: quest'ultimo, non dipende dal numero rappresentato (infatti non dipende da $p$, a differenza dell'errore assoluto) e per questo motivo viene anche detto precisione macchina.

### Esempio di calcolo del valore

partendo dall'esempio mostrato in figura:
$\mathrm { 1-{sign}*2)*2^{({exponent}-127)}*(1+2^{-23}*{fraction})$
dove sign, exponent e fraction vengono letti come numeri interi positivi.
quindi:
$\mathrm { 1-0*2)*2^{(124-127)}*(1+2^{-23}*2097152)=1*2^{-3}*(1+0.00000011920928955078125*2097152)=0.125*1.25=0.15625$