Quante cifre significative hanno float e raddoppia in java?

Un float ha 32 cifre binarie e un doppio ha 64 cifre binarie? La documentazione era troppo difficile da dare un senso.

Tutti i bit si traducono in cifre significative? O la posizione della virgola decimale occupa alcuni dei bit?

float : 32 bit (4 byte) in cui vengono utilizzati 23 bit per la mantissa (circa 7 cifre decimali). 8 bit sono usati per l’esponente, quindi un float può “spostare” il punto decimale a destra o a sinistra usando quegli 8 bit. Ciò evita di memorizzare molti zeri nella mantissa come in 0.0000003 (3 × 10 -7 ) o 3000000 (3 × 10 7 ). C’è un bit usato come bit di segno.

double : 64 bit (8 byte) in cui vengono utilizzati 52 bit per la mantissa (circa 16 cifre decimali). 11 bit sono usati per l’esponente e 1 bit è il bit di segno.

Dato che stiamo usando il binario (solo 0 e 1), un bit nella mantissa è implicitamente 1 (sia a virgola mobile che a doppio uso di questo trucco) quando il numero è diverso da zero.

Inoltre, poiché tutto è in binario (mantissa ed esponenti) le conversioni in numeri decimali non sono solitamente esatte. Numeri come 0.5, 0.25, 0.75, 0.125 sono memorizzati esattamente, ma 0.1 non lo è. Come altri hanno detto, se hai bisogno di memorizzare cents in modo preciso, non utilizzare float o double, usa int, long, BigInteger o BigDecimal.

fonti:

http://en.wikipedia.org/wiki/Floating_point#IEEE_754:_floating_point_in_modern_computers

http://en.wikipedia.org/wiki/Binary64

http://en.wikipedia.org/wiki/Binary32

Dalla specifica java :

I tipi a virgola mobile sono float e double, concettualmente associati ai valori e alle operazioni IEEE 754 a 64 bit a precisione a 32 bit ea precisione doppia specificati nello standard IEEE per aritmetica binaria a virgola mobile, ANSI / IEEE Standard 754-1985 (IEEE, New York).

Poiché è difficile fare qualsiasi cosa con i numeri senza comprendere le basi IEEE754, ecco un altro link .

È importante capire che la precisione non è uniforms e che non si tratta di una memorizzazione esatta dei numeri come avviene per i numeri interi.

Un esempio :

 double a = 0.3 - 0.1; System.out.println(a); 

stampe

 0.19999999999999998 

Se hai bisogno di precisione arbitraria (ad esempio per scopi finanziari) potresti aver bisogno di Big Decimal .

Una normale risposta di matematica.

Capendo che un numero in virgola mobile è implementato come alcuni bit che rappresentano l’esponente e il resto, la maggior parte per le cifre (nel sistema binario), si ha la seguente situazione:

Con un elevato esponente, diciamo 10²³ se viene modificato il bit meno significativo, viene visualizzata una grande differenza tra due numeri distinti che possono essere visualizzati. Inoltre, il punto decimale di base 2 fa sì che molti numeri di base 10 possano essere solo approssimati; 1/5, 1/10 sono numeri infiniti.

Quindi in generale : i numeri in virgola mobile non dovrebbero essere usati se ti interessano cifre significative. Per gli importi monetari con calcolo, e, a, utilizzare al meglio BigDecimal .

Per la fisica, i doppi in virgola mobile sono adeguati, galleggiano quasi mai. Inoltre la parte in virgola mobile dei processori, la FPU, può persino usare un po ‘più di precisione internamente.

I numeri in virgola mobile sono codificati usando una forma esponenziale, che è qualcosa come m * b ^ e , cioè non come gli interi. La domanda che porteresti sarebbe significativa nel contesto dei numeri a virgola fissa . Sono disponibili numerose librerie aritmetiche a punto fisso .

Per quanto riguarda l’aritmetica in virgola mobile: il numero di cifre decimali dipende dalla presentazione e dal sistema di numerazione. Per esempio ci sono numeri periodici ( 0.33333 ) che non hanno una presentazione finita in decimale, ma ne hanno uno in binario e viceversa.

Inoltre vale la pena ricordare che i numeri in virgola mobile fino ad un certo punto hanno una differenza maggiore di uno, cioè value + 1 produce value , poiché il value + 1 non può essere codificato usando m * b ^ e , dove m , b ed e sono fissati in lunghezza. Lo stesso accade per valori inferiori a 1, cioè tutti i possibili punti di codice non hanno la stessa distanza.

Per questo motivo non esiste una precisione di esattamente n cifre come con numeri a virgola fissa, poiché non tutti i numeri con n cifre decimali hanno una codifica IEEE.

C’è un documento quasi obbligatorio che dovresti leggere quindi che spiega i numeri in virgola mobile: cosa dovrebbe sapere ogni scienziato informatico sull’aritmetica in virgola mobile .

Guarda Float.intBitsToFloat e Double.longBitsToDouble , che spiegano in che modo i bit corrispondono ai numeri in virgola mobile. In particolare, i bit di un normale float assomigliano a qualcosa

  s * 2^exp * 1.ABCDEFGHIJKLMNOPQRSTUVW 

dove A … W sono 23 bit – 0s e 1s – rappresenta una frazione in binario – s è +/- 1, rappresentato da 0 o 1 rispettivamente, e exp è un intero con 8 bit con segno.

Un float a 32 bit ha circa 7 cifre di precisione e un doppio a 64 bit ha circa 16 cifre di precisione

Risposta lunga:

I numeri in virgola mobile hanno tre componenti:

  1. Un segno di bit, per determinare se il numero è positivo o negativo.
  2. Un esponente, per determinare la grandezza del numero.
  3. Una frazione, che determina quanto è lontano tra due valori esponenziali. Questo è talvolta chiamato “il significato, la mantissa o il coefficiente”

Essenzialmente, questo funziona per sign * 2^exponent * (1 + fraction) . La “dimensione” del numero, è esponente, è irrilevante per noi, perché ridimensiona solo il valore della porzione frazione. Sapendo che log₁₀(n) fornisce il numero di cifre di n , † possiamo determinare la precisione di un numero in virgola mobile con log₁₀(largest_possible_fraction) . Poiché ogni bit in un float memorizza 2 possibilità, un numero binario di n bit può memorizzare un numero fino a 2ⁿ - 1 (un totale di 2ⁿ valori in cui uno dei valori è zero). Questo diventa un po ‘più peloso, perché risulta che i numeri in virgola mobile sono memorizzati con un meno di frazione di quello che possono usare, perché gli zeri sono rappresentati appositamente e tutti i numeri diversi da zero hanno almeno un bit binario diverso da zero.

Combinando questo, le cifre di precisione per un numero in virgola mobile sono log₁₀(2ⁿ) , dove n è il numero di bit della frazione del numero in virgola mobile. Un float a 32 bit ha 24 bit di frazione per ≈7.22 cifre decimali di precisione e una doppia a 64 bit ha 53 bit di frazione per dec15.95 cifre decimali di precisione.

Per ulteriori informazioni sulla precisione in virgola mobile, si potrebbe voler leggere il concetto di una macchina epsilon .


† Per n ≥ 1 almeno – per gli altri numeri la formula avrà un aspetto più simile a ⌊log₁₀(|n|)⌋ + 1 .

‡ “Questa regola viene chiamata in vario modo la convenzione bit principale, la convenzione bit implicita o la convenzione bit nascosta.” ( Wikipedia )