floating-pointIniziare con virgola mobile


Osservazioni

Questa sezione fornisce una panoramica su cosa sia in virgola mobile e perché uno sviluppatore potrebbe volerlo utilizzare.

Dovrebbe anche menzionare eventuali soggetti di grandi dimensioni all'interno di virgola mobile e collegarsi agli argomenti correlati. Poiché la Documentazione per virgola mobile è nuova, potrebbe essere necessario creare versioni iniziali di tali argomenti correlati.

Panoramica

Cos'è il punto mobile?

Esistono due tipi di numeri:

  • punto fisso in cui sono disponibili un certo numero di cifre prima e dopo il punto di radix.
  • virgola mobile in cui sono disponibili un certo numero di cifre per la mantissa e per l'esponente.

Un esempio che utilizza cifre decimali con tre cifre decimali prima del punto decimale e due cifre decimali dopo la posizione decimale:

  • 0 sarebbe rappresentato come 000,00
  • 0,123 sarebbe rappresentato come 000.12
  • 0,00123 sarebbe rappresentato come 000,00
  • 1 sarebbe rappresentato come 001.00
  • 1.123 sarebbe rappresentato come 001.12
  • 1.00123 verrebbe rappresentato come 001.00
  • 123.456 sarebbe rappresentato come 123.45
  • 1234.56 è un errore perché sarebbe stato archiviato come 234.56 e questo è semplicemente sbagliato

Un esempio con cifre decimali con cinque cifre decimali per la mantissa e una cifra decimale per l'esponente:

  • 0 potrebbe essere rappresentato come .00000 x 10 ^ 0
  • 0,1 potrebbe essere rappresentato come .10000 x 10 ^ 0
  • 0,0000123456 potrebbe essere rappresentato come .12345 x 10 ^ -4
  • 0,000000000123456 potrebbe essere rappresentato come .12345 x 10 ^ -9
  • 0,00000000001 è un errore perché l'esponente non è abbastanza grande per memorizzare il numero
  • 1 potrebbe essere rappresentato come .10000 x 10 ^ 1
  • 1.123 potrebbe essere rappresentato come .11230 x 10 ^ 1
  • 1.00123 potrebbe essere rappresentato come .10012 x 10 ^ 1
  • 123.45678 potrebbe essere rappresentato come .12345 x 10 ^ 2
  • 123456789.1 potrebbe essere rappresentato come .12345 x 10 ^ 9
  • 1000000000 è un errore perché l'esponente non è abbastanza grande per memorizzare il numero

Quindi un numero in virgola mobile può rappresentare numeri con grandezze molto diverse (0.000000000123456 e 123456789.1) con la stessa quantità di accuratezza relativa.

I numeri a virgola fissa sono utili quando è sempre necessario un determinato numero di cifre decimali indipendentemente dall'entità del numero (ad esempio denaro). I numeri in virgola mobile sono utili quando la magnitudine varia e la precisione è ancora necessaria. Ad esempio: a un ingegnere su strada le distanze sono misurate in metri e 0,01 di un metro è insignificante, ma per un progettista di microchip la differenza tra 0,0000001 metri e 0,000000001 metri è enorme - e un fisico potrebbe aver bisogno di usare numeri enormi e molto, molto numeri minuscoli nello stesso calcolo. La precisione a molte grandezze differenti è ciò che rende utili i numeri in virgola mobile.

Come funziona

I computer non usano decimali - usano binari e causano problemi per il punto mobile perché non ogni numero decimale può essere rappresentato esattamente da un numero in virgola mobile e che introduce errori di arrotondamento nei calcoli.

Avendo fatto tutti gli esempi in decimale, è importante notare che poiché sono binari, invece di memorizzare un numero in virgola mobile come somma di frazioni decimali:

123.875 = 1/10^-2 + 2/10^-1 + 3/10^0 + 8/10^1 + 7/10^2 + 5/10^3
 

i computer memorizzano i numeri in virgola mobile come una somma di frazioni binarie:

123.875 = 1/2^-6 + 1/2^-5 + 1/2^-4 + 1/2^-3 + 1/2^-1 + 1/2^0 + 1/2^1 + 1/2^2 + 1/2^3
 

Esistono molti modi diversi per archiviare i picchiettatori di bit che rappresentano quelle frazioni, ma quello che la maggior parte dei computer utilizza ora si basa sullo standard IEEE-754. Ha regole per la memorizzazione di rappresentazioni decimali e binarie e per tipi di dati di dimensioni diverse.

Il modo in cui i numeri normali vengono memorizzati utilizzando lo standard IEEE è:

  • un bit per il segno - memorizzato in MSB, 1 significa negativo e 0 significa positivo
  • alcuni bit per l'esponente: il bias viene sottratto per ottenere esponenti sia positivi che negativi
  • alcuni bit per la mantissa - cifre dopo la cifra decimale con un 1 implicito prima della cifra decimale.

Per consentire un underflow più graduale, i numeri denormalizzati (quando i bit esponenti sono tutti zero) sono trattati in modo speciale: l'esponente è impostato su -126 e l'iniziale implicita 1 prima della posizione decimale NON viene aggiunta alla mantissa.

Numeri a virgola mobile IEEE-754 a 32 bit

Per un normale numero a virgola mobile IEEE-754 a 32 bit:

  • il bit 32 è il segno
  • i bit 24-31 sono l'esponente - il bias è 127
  • i bit 1-23 sono la mantissa

Quindi un numero normale è calcolato come:

-1^sign * 2^(exponent-bias) * 1.mantissa
 

Se il modello di bit era:

0 10000101 11101111100000000000000
 

Quindi il valore è:

-1^0 * 2^(133-127) * 1.111011111
-1^0 *     2^6     * (1 + 1/2 + 1/4 + 1/8 + 1/32 + 1/64 + 1/128 + 1/256 + 1/512)
   1 *      64     * 991/512
         123.875
 

Ci sono alcuni valori speciali:

0 11111111 11111111111111111111111 = NaN
0 11111111 00000000000000000000000 = +infinity
1 11111111 00000000000000000000000 = -infinity
0 00000000 00000000000000000000000 = +Zero
1 00000000 00000000000000000000000 = -Zero
 

Specifiche del formato IEEE-754 a 32 bit sono disponibili all'indirizzo: