Σε αυτό το σεμινάριο, θα μάθουμε για τους τύπους δεδομένων float και double με τη βοήθεια παραδειγμάτων. Θα εξετάσουμε επίσης μερικές από τις βασικές διαφορές μεταξύ τους και πότε θα τις χρησιμοποιήσουμε.
Στο C ++, float
και οι δύο και double
οι τύποι δεδομένων χρησιμοποιούνται για τιμές κυμαινόμενου σημείου. Οι αριθμοί κινούμενου σημείου χρησιμοποιούνται για δεκαδικές και εκθετικές τιμές. Για παράδειγμα,
// 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
Πρέπει να προσθέσουμε το επίθημα f
ή F
στο τέλος μιας float
τιμής. Αυτό συμβαίνει επειδή ο μεταγλωττιστής ερμηνεύει δεκαδικές τιμές χωρίς το επίθημα ως double
.
Εξετάστε αυτόν τον κωδικό.
float a = 5.6;
Εδώ, έχουμε εκχωρήσει μια double
τιμή σε μια float
μεταβλητή.
Σε αυτήν την περίπτωση, το 5.6 μετατρέπεται float
αυτόματα από τον μεταγλωττιστή πριν εκχωρηθεί στη μεταβλητή Αυτό μπορεί να οδηγήσει σε απώλεια δεδομένων. Για να μάθετε περισσότερα, επισκεφτείτε τη μετατροπή τύπου C ++.
Διαφορά μεταξύ float και double
φλοτέρ | διπλό |
---|---|
Μέγεθος: 4 byte | Μέγεθος: 8 byte |
Ακρίβεια: Γενικά, ακρίβεια 7 δεκαδικών ψηφίων | Ακρίβεια: Γενικά, ακρίβεια 15 δεκαδικών ψηφίων |
Παράδειγμα: 3.56f , 3e5f κλπ | Παράδειγμα: 3.56 , 3e5 κλπ |
Σημείωση: Εκτός αν έχετε μια συγκεκριμένη απαίτηση, χρησιμοποιήστε πάντα double
αντί για float
, καθώς οι float
μεταβλητές ενδέχεται να είναι επιρρεπείς σε σφάλματα όταν εργάζεστε με μεγάλους αριθμούς.
Παράδειγμα 1: C ++ float και 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; )
Παραγωγή
Αριθμός διπλού τύπου = 3.91235 Αριθμός τύπου πλωτήρα = 3.91235
Σημείωση: Ο μεταγλωττιστής που χρησιμοποιήθηκε για αυτό το παράδειγμα (μεταγλωττιστής MinGW) επέτρεπε 6 ψηφία. Έτσι, οι μεταβλητές τιμές μας στρογγυλοποιήθηκαν και μειώθηκαν σε 6 ψηφία από τον μεταγλωττιστή.
setprecision () για τον καθορισμό δεκαδικών σημείων
Μπορούμε να καθορίσουμε τον αριθμό των δεκαδικών σημείων προς εκτύπωση cout
χρησιμοποιώντας τη setprecision()
συνάρτηση.
Αυτή η συνάρτηση ορίζεται στο iomanip
αρχείο κεφαλίδας, το οποίο σημαίνει χειρισμό εισόδου / εξόδου .
Παράδειγμα 2: Χρήση του setprecision () για αριθμούς κινούμενου σημείου
#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; )
Παραγωγή
Αριθμός διπλού τύπου = 3.912348239293 Αριθμός τύπου πλωτήρα = 3.912348270416
Όπως μπορούμε να δούμε από το παραπάνω παράδειγμα, έχουμε καθορίσει την ακρίβεια έως και 13 ψηφία.
cout << setprecision(13);
Η τιμή κυμαινόμενου σημείου που έχουμε εκχωρήσει στις μεταβλητές μας αποτελείται επίσης από 13 ψηφία.
Ωστόσο, δεδομένου ότι float
έχει ακρίβεια έως και 7 ψηφία, δείχνει τιμές σκουπιδιών μετά την υπέρβαση της ακρίβειας.
Η double
μεταβλητή μας δείχνει τον σωστό αριθμό επειδή έχει ακρίβεια 15 ψηφίων, ενώ ο ίδιος ο αριθμός αποτελείται από 13 ψηφία.
Εναλλακτικά, μπορούμε να καθορίσουμε διαφορετικές ακρίβειες για διαφορετικές μεταβλητές κατά την εκτύπωση τους.
Παράδειγμα 3: Διαφορετικές ακρίβεια για διαφορετικές μεταβλητές
#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; )
Παραγωγή
Αριθμός διπλού τύπου = 3.9123482393 Αριθμός τύπου πλωτήρα = 3.912348
Από το παραπάνω πρόγραμμα, μπορούμε να δούμε ότι έχουμε ορίσει δύο διαφορετικές τιμές ακριβείας για float
και double
.
Και στις δύο περιπτώσεις, η ακρίβεια είναι μικρότερη από τα πραγματικά ψηφία του αριθμού. Έτσι, το τελευταίο ψηφίο στρογγυλοποιείται και τα υπόλοιπα περικόπτονται.
Σημείωση: Εάν καθορίσουμε την ακρίβεια μεγαλύτερη από την ακρίβεια του ίδιου του τύπου δεδομένων (7 για float
και 15 για double
), τότε ο μεταγλωττιστής θα μας δώσει τιμές σκουπιδιών μετά την υπέρβαση του ορίου ακριβείας, όπως φαίνεται με την float
έξοδο στο παράδειγμα 2 .
Εργαστείτε με εκθετικούς αριθμούς
Όπως αναφέρθηκε παραπάνω, float
και double
μπορεί επίσης να χρησιμοποιηθεί για την αναπαράσταση εκθετικών αριθμών . Για παράδειγμα,
// ex = 325 X (10 25) double ex = 325E25;
Το C ++ εξάγει εκθετικούς αριθμούς και πολύ μεγάλους αριθμούς σε μορφή που ονομάζεται επιστημονική μορφή. Η μεταβλητή ex θα εξάγεται σε αυτήν τη μορφή από προεπιλογή, δεδομένου ότι είναι ένας πολύ μεγάλος αριθμός.
Για να αναγκάσει C ++ για να εμφανίσετε τους αριθμούς κινητής υποδιαστολής μας σε scientific
μορφή ανεξάρτητα από το μέγεθος του αριθμού, χρησιμοποιούμε τη μορφή προσδιοριστή scientific
στο εσωτερικό της cout
.
double num = 3.25; // ex = 325 X (10 25) double ex = 325E25; // using scientific format cout << scientific << num; cout << scientific << ex;
Εκτός από αυτό, υπάρχει ένας άλλος προσδιοριστής μορφής γνωστός ως fixed
, ο οποίος εμφανίζει αριθμούς κινητής υποδιαστολής με τη δεκαδική μορφή.
Είναι παρόμοιο με την εμφάνιση αριθμών κυμαινόμενου σημείου χρησιμοποιώντας μόνο cout
χωρίς setprecision()
, εκτός από το γεγονός ότι fixed
εμφανίζει αριθμούς έως και 6 δεκαδικά σημεία.
Από την άλλη πλευρά, χρησιμοποιώντας μόνο cout
ψηφία οθόνης σύμφωνα με τον συγκεκριμένο μεταγλωττιστή (6 συνολικά ψηφία στην περίπτωση του μεταγλωττιστή MinGW , συμπεριλαμβανομένων των ψηφίων πριν από το δεκαδικό σημείο).
Παράδειγμα 4: Σταθερές και επιστημονικές μορφές
#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; )
Παραγωγή
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;
Σημείωση: Οι τύποι δεδομένων κινητής υποδιαστολής που υποστηρίζονται από το C ++ είναι float
, double
και long double
. Δεν υπάρχει long float
.