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).

È stato utile?

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.

  • singola precisione ...

    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.

  • doppia precisione ...

    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

IEEE 754-1985 :

v = (-1) ^ segno * s ^ (esponente-exponent_bias) * (1 + frazione)

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top