C ++ float και double

Σε αυτό το σεμινάριο, θα μάθουμε για τους τύπους δεδομένων 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.

ενδιαφέροντα άρθρα...