Έχω διαβάσει για τη διαφορά μεταξύ διπλής ακρίβειας και απλής ακρίβειας. Ωστόσο, στις περισσότερες περιπτώσεις, το float
και το double
φαίνεται να είναι εναλλάξιμα, δηλαδή η χρήση του ενός ή του άλλου δεν φαίνεται να επηρεάζει τα αποτελέσματα. Ισχύει πράγματι αυτό; Πότε οι float και οι doubles είναι εναλλάξιμες; Ποιες είναι οι διαφορές μεταξύ τους;
Ακολουθούν τα πρότυπα C99 (ISO-IEC 9899 6.2.5 §10) ή C++2003 (ISO-IEC 14882-2003 3.1.9 §8):
Υπάρχουν τρεις τύποι κινητής υποδιαστολής:
float
,double
καιlong double
. Ο τύποςdouble
παρέχει τουλάχιστον την ίδια ακρίβεια με τον τύποfloat
και ο τύποςlong double
παρέχει τουλάχιστον την ίδια ακρίβεια με τον τύποdouble
. Το σύνολο των τιμών του τύπουfloat
είναι υποσύνολο του συνόλου των τιμών του τύπουdouble
- το σύνολο των τιμών του τύπουdouble
είναι υποσύνολο του συνόλου των τιμών του τύπουlong double
.
Το πρότυπο της C++ προσθέτει:
Η αναπαράσταση τιμών των τύπων κινητής υποδιαστολής καθορίζεται από την εφαρμογή.
Θα πρότεινα να ρίξετε μια ματιά στο εξαιρετικό What Every Computer Scientist Should Know About Floating-Point Arithmetic που καλύπτει σε βάθος το πρότυπο κινητής υποδιαστολής IEEE. Θα μάθετε για τις λεπτομέρειες της αναπαράστασης και θα συνειδητοποιήσετε ότι υπάρχει ένας συμβιβασμός μεταξύ μεγέθους και ακρίβειας. Η ακρίβεια της αναπαράστασης κινητής υποδιαστολής αυξάνεται όσο μειώνεται το μέγεθος, επομένως οι αριθμοί κινητής υποδιαστολής μεταξύ -1 και 1 είναι αυτοί με τη μεγαλύτερη ακρίβεια.
Οι κινητές μονάδες έχουν μικρότερη ακρίβεια από τις διπλές. Αν και το γνωρίζετε ήδη, διαβάστε Τι πρέπει να γνωρίζουμε για την αριθμητική κινητής υποδιαστολής για καλύτερη κατανόηση.