Articles

Numeri in virgola mobile

Perché sono necessari numeri in virgola mobile

Poiché la memoria del computer è limitata, non è possibile memorizzare i numeri con precisione infinita, indipendentemente dal fatto che si utilizzino frazioni binarie o decimali: ad un certo punto è necessario tagliare. Ma quanta precisione è necessaria? E dove è necessario? Quante cifre intere e quante cifre di frazione?

  • Per un ingegnere che costruisce un’autostrada, non importa se si tratta di 10 metri o 10.0001 metri di larghezza-le loro misure probabilmente non sono così accurate in primo luogo.
  • Per qualcuno che progetta un microchip, 0,0001 metri (un decimo di millimetro) è una differenza enorme, ma non dovranno mai affrontare una distanza maggiore di 0,1 metri.
  • Un fisico deve utilizzare la velocità della luce (circa 300000000) e la costante gravitazionale di Newton (circa 0,0000000000667) insieme nello stesso calcolo.

Per soddisfare l’ingegnere e il progettista di chip, un formato numerico deve fornire precisione per i numeri a grandezze molto diverse. Tuttavia, è necessaria solo una precisione relativa. Per soddisfare il fisico, deve essere possibile fare calcoli che coinvolgono numeri con diverse grandezze.

Fondamentalmente, avere un numero fisso di cifre intere e frazionarie non è utile – e la soluzione è un formato con una virgola mobile.

Come funzionano i numeri in virgola mobile

L’idea è di comporre un numero di due parti principali:

  • Un significato che contiene le cifre del numero. I significandi negativi rappresentano numeri negativi.
  • Un esponente che dice dove il punto decimale (o binario) è posizionato rispetto all’inizio del significand. Gli esponenti negativi rappresentano numeri molto piccoli (cioè vicini allo zero).

Tale formato soddisfa tutti i requisiti:

  • Può rappresentare numeri a grandezze molto diverse (limitate dalla lunghezza dell’esponente)
  • Fornisce la stessa precisione relativa a tutte le grandezze (limitate dalla lunghezza del significand)
  • Consente calcoli su magnitudini: moltiplicando un numero molto grande e un numero molto piccolo preserva la precisione di entrambi nel risultato.

I numeri decimali in virgola mobile di solito assumono la forma di notazione scientifica con un punto esplicito sempre tra la 1a e la 2a cifra. L’esponente è scritto esplicitamente includendo la base, o una e è usata per separarlo dal significato.

Lo standard

Quasi tutti i linguaggi hardware e di programmazione utilizzano numeri in virgola mobile negli stessi formati binari, definiti nello standard IEEE 754. I formati usuali sono 32 o 64 bit di lunghezza totale:

Format Total bits Significand bits Exponent bits Smallest number Largest number
Single precision 32 23 + 1 sign 8 ca. 1.2 ⋅ 10-38 ca. 3.4 ⋅ 1038
Double precision 64 52 + 1 sign 11 ca. 2.2 ⋅ 10-308 ca. 1.8 1 10308

Si noti che ci sono alcune peculiarità:

  • La sequenza di bit effettiva è il bit di segno prima, seguito dall’esponente e infine i bit di significato.
  • L’esponente non ha un segno; invece un bias esponente viene sottratto da esso (127 per singolo e 1023 per doppia precisione). Questo, e la sequenza di bit, consente di confrontare e ordinare correttamente i numeri in virgola mobile anche quando li interpretano come numeri interi.
  • La cifra più significativa del significand viene omessa e assunta come 1, ad eccezione dei numeri subnormali che sono contrassegnati da un esponente all-0 e consentono un intervallo di numeri oltre i numeri più piccoli indicati nella tabella sopra, a costo di precisione.
  • Ci sono valori zero positivi e negativi separati, che differiscono nel bit del segno, dove tutti gli altri bit sono 0. Questi devono essere considerati uguali anche se i loro modelli di bit sono diversi.
  • Ci sono speciali valori di infinito positivo e negativo, dove l’esponente è tutto 1-bit e il significato è tutto 0-bit. Questi sono i risultati dei calcoli in cui viene superato l’intervallo positivo dell’esponente o la divisione di un numero regolare per zero.
  • Ci sono valori speciali non numerici (o NaN) in cui l’esponente è tutto a 1 bit e il significato non è tutto a 0 bit. Questi rappresentano il risultato di vari calcoli indefiniti (come moltiplicare 0 e infinito, qualsiasi calcolo che coinvolge un valore NaN o casi specifici dell’applicazione). Anche i valori NAN bit-identici non devono essere considerati uguali.

Se questo sembra troppo astratto e vuoi vedere come appaiono alcuni valori specifici in IEE 754, prova il Float Toy o la visualizzazione IEEE 754 o Float Exposed.