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?

È stato utile?

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 dati float è 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 per byte   e short , utilizzare un float (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 copre BigDecimal e   altre classi utili fornite dal   Piattaforma Java.

  •   
  • double : il tipo di dati double è 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.

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