Qual è la gamma inclusiva di float e double in Java?
-
22-07-2019 - |
Domanda
Qual è la gamma inclusiva di float e double in Java?
Perché non è consigliabile utilizzare float o double per qualsiasi cosa in cui la precisione è fondamentale?
Soluzione
Java Double
ha membri che contengono il valore Min e Max per il tipo.
2^-1074 <= x <= (2-2^-52)·2^1023 // where x is the double.
Scopri i Min_VALUE
e MAX_VALUE
membri finali statici di Double
.
(alcuni) Le persone suggeriranno di non utilizzare tipi in virgola mobile per cose in cui l'accuratezza e la precisione sono fondamentali perché gli errori di arrotondamento possono annullare i calcoli con importi misurabili (piccoli).
Altri suggerimenti
Tipi di dati primitivi di Java
booleano: 1-bit. Può assumere solo i valori vero e falso.
Byte: 1 byte con segno (complemento a due). Copre valori da -128 a 127.
breve: 2 byte, firmato (complemento a due), da -32.768 a 32.767
int: 4 byte, firmato (complemento a due). Da -2.147.483.648 a 2.147.483.647.
long: Firmato 8 byte (complemento a due). Varia da -9.223.372.036.854.775.808 a +9.223.372.036.854.775.807.
float: 4 byte, IEEE 754. Copre un intervallo compreso tra 1.40129846432481707e-45 e 3.40282346638528860e + 38 (positivo o negativo).
doppia: 8 byte IEEE 754. Copre un intervallo compreso tra 4.94065645841246544e-324d e 1.79769313486231570e + 308d (positivo o negativo).
char: 2 byte, senza segno, Unicode, da 0 a 65.535
I numeri binari in virgola mobile hanno interessanti caratteristiche di precisione, poiché il valore viene memorizzato come numero intero binario elevato a una potenza binaria. Quando si ha a che fare con valori di numeri interi (ovvero valori compresi tra 0 e 1), i poteri negativi di due "arrotondano". in modo molto diverso rispetto ai poteri negativi di dieci.
Ad esempio, il numero 0.1 può essere rappresentato da 1 x 10 -1 , ma non esiste una combinazione di esponente base-2 e mantissa che può rappresentare con precisione 0.1 - il più vicino che ottieni è 0.10000000000000001.
Quindi se hai un'applicazione in cui lavori con valori come 0,1 o 0,01 molto, ma dove errori piccoli (meno di 0,000000000000001%) non possono essere tollerati, allora i numeri binari in virgola mobile non fanno per te.
Al contrario, se i poteri di dieci non sono "speciali" per la tua applicazione (i poteri di dieci sono importanti nei calcoli delle valute, ma non, per esempio, nella maggior parte delle applicazioni della fisica), quindi in realtà stai meglio usando il virgola mobile binario, poiché di solito è almeno un ordine di grandezza più veloce, e è molto più efficiente in termini di memoria.
L'articolo della documentazione di Python su problemi e limitazioni in virgola mobile fa un lavoro eccellente di spiegare questo problema in una forma di facile comprensione. Wikipedia ha anche un buon articolo su virgola mobile che spiega la matematica dietro la rappresentazione.
Da Tipi di dati sulle primitive :
float:
Il tipo di datifloat
è un IEEE 754 a 32 bit a precisione singola virgola mobile. La sua gamma di valori è oltre lo scopo di questa discussione, ma è specificato nella sezione 4.2.3 delle specifiche del linguaggio Java. Come con le raccomandazioni perbyte
eshort
, utilizzare unfloat
(anzichédouble
) se è necessario risparmiare memoria in grandi matrici di virgola mobile numeri. Questo tipo di dati non dovrebbe mai essere utilizzato per valori precisi, come ad esempio moneta. Per questo, dovrai farlo usa java.math.BigDecimal classe invece. Numeri e Stringhe copreBigDecimal
e altre classi utili fornite dal Piattaforma Java.
double
: il tipo di datidouble
è un IEEE 754 a 64 bit a doppia precisione virgola mobile. La sua gamma di valori è oltre lo scopo di questa discussione, ma è specificato nella sezione 4.2.3 delle specifiche del linguaggio Java. Per i valori decimali, questo tipo di dati è generalmente la scelta predefinita. Come menzionato sopra, questo tipo di dati dovrebbe mai essere usato per valori precisi, ad esempio come valuta.
Per l'intervallo di valori, consultare la sezione 4.2.3 Tipi, formati e valori in virgola mobile del JLS.
Ovviamente puoi usare float o double per " critical " cose ... Molte applicazioni non fanno altro che sgretolare i numeri usando questi tipi di dati.
Potresti aver frainteso alcune delle varie avvertenze relative ai numeri in virgola mobile, come la raccomandazione di non confronta per l'uguaglianza esatta e così via.