Ad un certo punto nello sviluppo della tecnologia informatica, divenne chiaro che le unità di elaborazione centrale necessitavano di dispositivi hardware per elaborare i numeri in virgola mobile. Oggi tutte le architetture informatiche possono funzionare efficacemente con tali numeri. Naturalmente anche nei linguaggi di programmazione non si può fare a meno dei corrispondenti tipi di dati. In Java esistono due tipi di dati in virgola mobile: float e double. La parola chiave Java Float definisce un numero reale che occupa 32 bit in memoria. Parleremo di tali numeri in questo articolo.
Quindi la parola chiave Float indica un numero, un valore a precisione singola che occupa 32 bit o 4 byte in memoria. Su alcuni processori, lavorare con tali numeri è più veloce e, come già accennato, occupano meno spazio rispetto ai numeri con doppia precisione. Tuttavia, è impossibile dirlo in modo inequivocabile con rapidità. Diciamo che alcuni processori moderni elaborano esattamente i numeri a precisione doppia più velocemente.
Numeri in virgola mobile. Come vengono memorizzati i numeri reali in un computer?
Per memorizzare i numeri reali nella memoria del computer, viene allocato un certo numero di bit. Un numero reale viene memorizzato come segno (più o meno), mantide ed esponente. Qual è la mantissa e l'esponente è meglio spiegato con un esempio. La massa approssimativa della luna è 7* 1022. Qui 7 è la mantide, in 22 l'esponente. Quando si visualizzano numeri grandi o, viceversa, molto piccoli sullo schermo, è possibile vedere una voce come 7E22. Questo è il numero in virgola mobile, e 7 qui è la mantide, e 22 è l'esponente o potenza di 10. Questa notazione è chiamata notazione esponenziale.Parola chiave Java float e parola chiave Java doppia
I valori float (numeri in virgola mobile o numeri reali) in Java sono rappresentati dai tipi float e double . Sono queste parole chiave che vengono utilizzate per memorizzare valori fino a un certo segno dopo la virgola decimale. double sono numeri con doppia precisione, il più vicino possibile ai valori dati o ottenuti a seguito di calcoli. Java Double viene utilizzato per qualsiasi calcolo matematico (radice quadrata, seno, coseno, ..), nonché per tutti i calcoli in cui è importante una certa precisione. il tipo di dati float viene utilizzato per un tipo a virgola mobile meno preciso. Viene utilizzato molto raramente per risparmiare memoria. Qui sotto abbiamo una tabella con le informazioni principali su float e double, nonché le loro differenze.Galleggiante | Doppio | |
---|---|---|
Principale | Float è un valore a precisione singola | È un valore a doppia precisione |
Dimensione predefinita | 4 byte (32 bit) | 8 byte (64 bit) |
Valore di default | 0.0f | 0,0 |
Allineare | da 1.4e–045 a 3.4e+038 | da 4.9e–324 a 1.8e+308 |
A cosa serve | Per risparmiare memoria | lavorare con i numeri frazionari in modo relativamente accurato |
Java Float e doppia dichiarazione
Puoi dichiarare un numero di tipo double allo stesso modo dei numeri di altri tipi:
double myDouble = 2.7;
Tuttavia, se rappresenti un numero in virgola mobile in questo modo, il compilatore ti richiederà di modificare il tipo del numero in double. Ecco un esempio errato di variabile float :
public class FloatExample {
public static void main(String[] args) {
//double and float variables
double myDouble = 2.7;
float myFloat = 3.14;
}
}
Ecco cosa succede se esegui questo programma:
Error:(4, 25) java: incompatible types: possible lossy conversion from double to float
Il fatto è che non è desiderabile utilizzare numeri float e questo dovrebbe essere fatto solo per risparmiare memoria. Tutti i numeri frazionari reali in Java sono Double per impostazione predefinita e anche la sintassi del linguaggio lo enfatizza. Se vuoi veramente lavorare con il tipo float, devi specificarlo esplicitamente con una f che termina il numero.
public class FloatExample {
public static void main(String[] args) {
//double and float variables
double myDouble = 2.7;
float myFloat = 3.14f;
}
}
A proposito, i numeri float e double possono essere scritti in forma esponenziale.
float myFloat2 = 2E22f;
double myDouble2 = 3e10;
Se si utilizzano numeri sufficientemente grandi nella loro rappresentazione "normale", Java li visualizzerà immediatamente in forma esponenziale. Facciamo un esempio:
public class FloatExample {
public static void main(String[] args) {
//float variables
float myFloatNumber1=2182818284590.45f;
float myFloatNumber2=19822612787260.141592181f;
System.out.println("myFloatNumber1 = " + myFloatNumber1);
System.out.println("myFloatNumber2 = " + myFloatNumber2);
System.out.println("myFloatNumber1 + myFloatNumber2 = " + myFloatNumber1 + myFloatNumber2);
}
}
Il risultato del lavoro di questo programma è qui:
mioFloatNumber1 = 2.1828183E12 mioFloatNumber2 = 1.98226121E13 mioFloatNumber1 + mioFloatNumber2 = 2.1828183E121.98226121E13
Esempio di numeri speciali float e doppi
Esistono tre numeri speciali in virgola mobile nel linguaggio Java, utilizzati per indicare overflow ed errori. Eccoli:-
L'infinito positivo è il risultato della divisione di un numero positivo per 0. Rappresentato dalle costanti Double.POSITIVE_INFINITY e Float.POSITIVE_INFINITY .
-
L'infinito negativo è il risultato della divisione di un numero negativo per 0. Rappresentato dalle costanti Double.NEGATIVE_INFINITY e Float.NEGATIVE_INFINITY .
-
NaN (non un numero) rappresenta il calcolo di 0/0 o la radice quadrata di un numero negativo. Rappresentato dalle costanti Double.NaN e Float.NAN .
public class FloatExample {
public static void main(String[] args) {
int myInt = 1;
float zero = 0.0f;
double negZero = -0.0;
double negativeInfinity = Double.NEGATIVE_INFINITY;
double positiveInfinity = Float.POSITIVE_INFINITY;
System.out.println(myInt / zero);
System.out.println(myInt / negZero);
System.out.println(zero == negZero);
System.out.println(negativeInfinity * 0);
System.out.println(positiveInfinity+negativeInfinity);
}
}
Il risultato è:
Infinito -Infinito vero NaN NaN
La doppia precisione è sufficiente?
Infatti, nonostante la doppia precisione del tipo Double , utilizzare numeri in virgola mobile, ad esempio, nei calcoli finanziari, non è la soluzione migliore perché gli errori di arrotondamento sono inaccettabili. Quindi, prova a visualizzare sullo schermo l'output del seguente programma.
public class FloatExample {
public static void main(String[] args) {
System.out. println( "2.0 - 1.1 = " + (2.0 - 1.1));
}
}
Otterrai il seguente risultato:
2,0 - 1,1 = 0,8999999999999999
Sarebbe logico supporre che il risultato sarà 0,9. Tuttavia, tali errori sono abbastanza comuni e sono associati alla rappresentazione binaria interna dei numeri. Non possiamo, ad esempio, rappresentare il valore esatto di ⅓ come frazione decimale; ovviamente, ci sono restrizioni simili nel sistema binario. Se l'attività richiede l'eliminazione degli errori di arrotondamento, Java dispone della classe BigDecimal per questo.
GO TO FULL VERSION