Quale intervallo di numeri può essere rappresentato in un 16, 32 e 64 bit IEEE-754 sistemi?
-
22-08-2019 - |
Domanda
Lo so un po 'su come i numeri in virgola mobile sono rappresentati, ma non abbastanza, temo.
La domanda generale è:
Per una data di precisione (per i miei scopi, il numero di cifre decimali accurati in base 10), quale intervallo di numeri possono essere rappresentati per 16, 32 e 64 bit IEEE-754 sistemi?
In particolare, mi interessa solo nella gamma di numeri a 16 bit e 32 bit accurate a +/- 0,5 (il luogo quelli) o +/- 0,0005 (il luogo millesimi).
Soluzione
Per un dato href="http://en.wikipedia.org/wiki/IEEE_754" rel="nofollow noreferrer">-754 IEEE numero virgola mobile X , se
2^E <= abs(X) < 2^(E+1)
allora la distanza da X al successivo grande numero in virgola mobile rappresentabile ( Epsilon ) è:
epsilon = 2^(E-52) % For a 64-bit float (double precision)
epsilon = 2^(E-23) % For a 32-bit float (single precision)
epsilon = 2^(E-10) % For a 16-bit float (half precision)
Le equazioni di cui sopra consentono di calcolare il seguente:
-
metà precisione ...
Se si desidera una precisione di +/- 0.5 (o 2 ^ -1), la dimensione massima che il numero può essere è 2 ^ 10. Qualsiasi grande di questo e la distanza tra i numeri in virgola mobile è maggiore di 0,5.
Se si desidera una precisione di +/- 0,0005 (circa 2 ^ -11), la dimensione massima che il numero può essere è 1. Qualsiasi grande di questo e la distanza tra i numeri in virgola mobile è maggiore di 0,0005.
-
Se si desidera una precisione di +/- 0.5 (o 2 ^ -1), la dimensione massima che il numero può essere è 2 ^ 23. Qualsiasi grande di questo e la distanza tra i numeri in virgola mobile è maggiore di 0,5.
Se si desidera una precisione di +/- 0,0005 (circa 2 ^ -11), la dimensione massima che il numero può essere è 2 ^ 13. Qualsiasi grande di questo e la distanza tra i numeri in virgola mobile è maggiore di 0,0005.
-
Se si desidera una precisione di +/- 0.5 (o 2 ^ -1), la dimensione massima che il numero può essere è 2 ^ 52. Qualsiasi grande di questo e la distanza tra i numeri in virgola mobile è maggiore di 0,5.
Se si desidera una precisione di +/- 0,0005 (circa 2 ^ -11), la dimensione massima che il numero può essere è 2 ^ 42. Qualsiasi grande di questo e la distanza tra i numeri in virgola mobile è maggiore di 0,0005.
Altri suggerimenti
Per gli interi in virgola mobile (vi darò la mia risposta in termini di IEEE doppia precisione), ogni intero compreso tra 1 e 2 ^ 53 è esattamente rappresentabile. Al di là di 2 ^ 53, interi che sono esattamente rappresentabili sono distanziati di potenze di due crescenti. Ad esempio:
- Ogni 2 ° intero compreso tra 2 ^ 53 + 2 e 2 ^ 54 può essere rappresentato esattamente.
- Ogni quarto intero compreso tra 2 ^ 54 + 4 e 2 ^ 55 può essere rappresentato esattamente.
- Ogni 8 intero compreso tra 2 ^ 55 + 8 e 2 ^ 56 può essere rappresentato esattamente.
- Ogni 16 intero compreso tra 2 ^ 56 + 16 e 2 ^ 57 può essere rappresentato esattamente.
- Ogni intero 32a tra 2 ^ 57 + 32 e 2 ^ 58 può essere rappresentato esattamente.
- Ogni intero 64a tra 2 ^ 58 + 64 e 2 ^ 59 può essere rappresentato esattamente.
- Ogni intero 128a tra 2 ^ 59 + 128 e 2 ^ 60 può essere rappresentato esattamente.
- Ogni intero 256a tra 2 ^ 60 + 256 e 2 ^ 61 può essere rappresentato esattamente.
- Ogni intero 512th tra 2 ^ 61 + 512 e 2 ^ 62 può essere rappresentato esattamente. . . .
Gli interi che non sono esattamente rappresentabili vengono arrotondati al numero intero più vicino rappresentabile, quindi il caso peggiore di arrotondamento è 1/2 della distanza tra interi rappresentabili.
La precisione citato collegamento del modulo di Peter R per l'arbitro MSDN è probabilmente una buona regola, ma ovviamente la realtà è più complicata.
Il fatto che il "punto" a "floating point" è una binario punto e punto decimale non ha un modo di sconfiggere nostre intuizioni. L'esempio classico è 0,1, che ha bisogno di una precisione di una sola cifra decimale, ma non è rappresentabile esattamente in binario a tutti.
Se si dispone di un week-end per uccidere, dare un'occhiata alla Ciò che ogni Computer Scientist dovrebbero sapere su virgola mobile aritmetica . Probabilmente sarete particolarmente interessati in sezioni su precisione binario a decimale conversione .
Prima di tutto, né IEEE-754-2008 né -1985 ha 16 bit galleggia; ma è un'aggiunta proposta con un esponente 5 bit e frazione 10 bit. IEE-754 utilizza un bit di segno dedicato, in modo che il campo positivo e negativo è lo stesso. Inoltre, la frazione ha un implicito 1 nella parte anteriore, in modo da ottenere un po 'in più.
Se si vuole la precisione al luogo quelli, come in si può rappresentare ogni intero, la risposta è abbastanza semplice: L'esponente sposta il punto decimale a destra-end della frazione. Quindi, una frazione a 10 bit si ottiene ± 2 11 .
Se si desidera un po 'dopo il punto decimale, è rinunciare a un po' prima di esso, in modo da avere ± 2 10 .
singola precisione ha una frazione 23-bit, quindi si avrebbe ± 2 24 interi.
Quanti bit di precisione è necessario dopo il punto decimale dipende interamente i calcoli si sta facendo, e quanti si sta facendo.
- 2 10 = 1.024
- 2 11 = 2.048
- 2 23 = 8.388.608
- 2 24 = 16.777.216
- 2 53 = 9,007,199,254,740,992 (doppia precisione)
- 2 113 = 10,384,593,717,069,655,257,060,992,658,440,192 (quad-precisione)
Vedere anche
Nota (1 + frazione). Come @bendin sottolineare, utilizzando binario in virgola mobile, non è possibile esprimere la semplice decimale valori come 0,1. L'implicazione è che si può introdurre errori di arrotondamento facendo semplici aggiunte molte volte o chiamando le cose come troncamento. Se sei interessato in qualche tipo di precisione di sorta, l'unico modo per ottenere è quello di utilizzare un numero decimale a virgola fissa, che sostanzialmente è un intero scalato.
Se ho capito bene la tua domanda, dipende dalla vostra lingua.
Per C #, controlla MSDN rif . Float ha una precisione di 7 cifre e doppia precisione 15-16 cifre.
Mi c'è voluto un bel po 'per capire che quando si utilizza raddoppia in Java, io non perdevo significativa precisione nei calcoli. virgola mobile in realtà ha una buona capacità di rappresentare i numeri di precisione abbastanza ragionevole. La precisione Stavo perdendo era immediatamente dopo la conversione di decimale i numeri digitati dagli utenti al rappresentazione binaria virgola mobile che viene supportato in modo nativo. Recentemente ho iniziato la conversione di tutti i miei numeri di BigDecimal. BigDecimal è molto più lavoro da fare con il codice di carri o doppie, dato che non è uno dei tipi primitivi. Ma d'altra parte, sarò in grado di rappresentare esattamente i numeri che gli utenti digitano in.