In questo tutorial, impareremo i tipi di dati float e double con l'aiuto di esempi. Vedremo anche alcune delle principali differenze tra loro e quando usarli.
In C ++, entrambi i tipi di dati float
e double
vengono utilizzati per i valori a virgola mobile. I numeri in virgola mobile vengono utilizzati per i valori decimali ed esponenziali . Per esempio,
// creating float type variables float num1 = 3.0f; float num2 = 3.5f; float num3 = 3E-5f; // 3x10^-5 // creating double type variables double num4 = 3.0; double num5 = 3.5; double num6 = 3E-5; // 3x10^-5
Dobbiamo aggiungere il suffisso f
o F
alla fine di un float
valore. Questo perché il compilatore interpreta i valori decimali senza il suffisso come double
.
Considera questo codice.
float a = 5.6;
Qui abbiamo assegnato un double
valore a una float
variabile.
In questo caso, 5.6 viene convertito in float
dal compilatore automaticamente prima di essere assegnato alla variabile a. Ciò potrebbe causare la perdita di dati. Per saperne di più, visita Conversione di tipi in C ++.
Differenza tra float e double
galleggiante | Doppio |
---|---|
Dimensione: 4 byte | Dimensione: 8 byte |
Precisione: in generale, 7 cifre decimali di precisione | Precisione: in generale, 15 cifre decimali di precisione |
Esempio: 3.56f , 3e5f etc. | Esempio: 3.56 , 3e5 etc. |
Nota: a meno che tu non abbia un requisito specifico, usa sempre double
invece di float
, poiché le float
variabili possono essere soggette a introdurre errori quando si lavora con numeri grandi.
Esempio 1: C ++ float e double
#include #include using namespace std; int main() ( // Creating a double type variable double a = 3.912348239293; // Creating a float type variable float b = 3.912348239293f; // Printing the two variables cout << "Double Type Number = " << a << endl; cout << "Float Type Number = " << b << endl; return 0; )
Produzione
Numero di tipo doppio = 3,91235 Numero di tipo galleggiante = 3,91235
Nota: il compilatore utilizzato per questo esempio (compilatore MinGW) ammette 6 cifre. Quindi, i nostri valori delle variabili sono stati arrotondati e troncati a 6 cifre dal compilatore.
setprecision () per specificare i punti decimali
Possiamo specificare il numero di punti decimali da stampare cout
utilizzando la setprecision()
funzione.
Questa funzione è definita nel iomanip
file di intestazione, che sta per manipolazione di input / output .
Esempio 2: utilizzo di setprecision () per numeri in virgola mobile
#include #include using namespace std; int main() ( // Creating a double type variable double a = 3.912348239293; // Creating a float type variable float b = 3.912348239293f; // Setting the precision to 12 decimal places cout << setprecision(13); // Printing the two variables cout << "Double Type Number = " << a << endl; cout << "Float Type Number = " << b << endl; return 0; )
Produzione
Numero di tipo doppio = 3,912348239293 Numero di tipo galleggiante = 3,912348270416
Come possiamo vedere dall'esempio sopra, abbiamo specificato la precisione fino a 13 cifre.
cout << setprecision(13);
Anche il valore in virgola mobile che abbiamo assegnato alle nostre variabili è composto da 13 cifre.
Tuttavia, poiché float
ha una precisione fino a sole 7 cifre, mostra i valori di spazzatura dopo che la sua precisione viene superata.
La nostra double
variabile mostra il numero corretto perché ha una precisione di 15 cifre, mentre il numero stesso è composto da 13 cifre.
In alternativa, possiamo specificare diverse precisioni per diverse variabili durante la stampa.
Esempio 3: differenti precisioni per differenti variabili
#include #include using namespace std; int main() ( // Creating a double type variable double a = 3.912348239293; // Creating a float type variable float b = 3.912348239293f; // Setting precision to 11 for double cout << "Double Type Number = " << setprecision(11) << a << endl; // Setting precision to 7 for float cout << "Float Type Number = " << setprecision(7) << b << endl; return 0; )
Produzione
Numero di tipo doppio = 3,9123482393 Numero di tipo galleggiante = 3,912348
Dal programma sopra, possiamo vedere che abbiamo impostato due diversi valori di precisione per float
e double
.
In entrambi i casi, la precisione è inferiore alle cifre effettive del numero. Quindi l'ultima cifra viene arrotondata e il resto viene troncato.
Nota: se specifichiamo una precisione maggiore della precisione del tipo di dati stesso (7 per float
e 15 per double
), il compilatore ci darà valori di spazzatura dopo che il limite di precisione è stato superato, come si può vedere con l' float
output nell'esempio 2 .
Lavora con numeri esponenziali
Come accennato in precedenza, float
e double
può anche essere utilizzato per rappresentare numeri esponenziali . Per esempio,
// ex = 325 X (10 25) double ex = 325E25;
C ++ restituisce numeri esponenziali e numeri molto grandi in un formato chiamato formato scientifico . La variabile ex verrà emessa in questo formato per impostazione predefinita poiché è un numero molto grande.
Per forzare C ++ a visualizzare i nostri numeri in virgola mobile nel scientific
formato indipendentemente dalla dimensione del numero, usiamo l' identificatore di formato scientific
all'interno di cout
.
double num = 3.25; // ex = 325 X (10 25) double ex = 325E25; // using scientific format cout << scientific << num; cout << scientific << ex;
Oltre a questo, esiste un altro identificatore di formato noto come fixed
, che visualizza i numeri in virgola mobile nel formato decimale.
È simile alla visualizzazione di numeri in virgola mobile utilizzando solo cout
senza setprecision()
, tranne per il fatto che fixed
visualizza numeri fino a 6 punti decimali.
D'altra parte, utilizzando solo le cout
cifre di visualizzazione in base al compilatore specifico (6 cifre totali nel caso del compilatore MinGW , comprese le cifre prima del punto decimale).
Esempio 4: formati fissi e scientifici
#include #include using namespace std; int main() ( // Creating a decimal double type variable double a = 3.912348239293; // Creating an exponential double type variable double ex1 = 325e+2; // Creating a float type variable float b = 3.912348239293f; // Creating an exponential float type variable float ex2 = 325e+2f; // Displaying output with fixed cout << "Displaying Output With fixed:" << endl; cout << "Double Type Number 1 = " << fixed << a << endl; cout << "Double Type Number 2 = " << fixed << ex1 << endl; cout << "Float Type Number 1 = " << fixed << b << endl; cout << "Float Type Number 2 = " << fixed << ex2 << endl; // Displaying output with scientific cout << "Displaying Output With scientific:" << endl; cout << "Double Type Number 1 = " << scientific << a << endl; cout << "Double Type Number 2 = " << scientific << ex1 << endl; cout << "Float Type Number 1 = " << scientific << b << endl; cout << "Float Type Number 2 = " << scientific << ex2 << endl; return 0; )
Produzione
Displaying Output With fixed: Double Type Number 1 = 3.912348 Double Type Number 2 = 32500.000000 Float Type Number 1 = 3.912348 Float Type Number 2 = 32500.000000 Displaying Output With scientific: Double Type Number 1 = 3.912348e+000 Double Type Number 2 = 3.250000e+004 Float Type Number 1 = 3.912348e+000 Float Type Number 2 = 3.250000e+004
long double
Apart from float
and double
, there is another data type that can store floating-point numbers. This is known as long double
.
It usually occupies a space of 12 bytes (depends on the computer system in use), and its precision is at least the same as double
, though most of the time, it is greater than that of double
.
long double
values should end with L
. For example,
// declaring a long double variable long double num_ldb = 2.569L;
Nota: i tipi di dati a virgola mobile supportati da C ++ sono float
, double
e long double
. Non c'è long float
.