User Tools

Site Tools


qna:c:values-operators:rounding-values

Κάποιες τιμές στον υπολογιστή δεν παριστάνονται επακριβώς

ή

Η ceil & η floor δίνουν απρόσμενα αποτελέσματα

Η αναπαράσταση των πραγματικών αριθμών στον υπολογιστή, επειδή γίνεται με πεπερασμένο πλήθος ψηφίων, προφανώς δεν καλύπτει την πλειονότητα των πραγματικών τιμών. Αυτό έχει σαν συνέπεια οι τιμές στον υπολογιστή να παριστάνονται σχεδόν πάντα στρογγυλευμένες προς την καταλληλότερη εφικτή αναπαράσταση. Αυτό έχει σαν αποτέλεσμα να εισάγεται ένα σφάλμα που ονομάζεται σφάλμα στρογγύλευσης (θα μάθετε σχετικά στο κομμάτι της θεωρίας, αλλά μπορείτε να δείτε και ένα άρθρο εδώ - δεν είναι όμως της ώρας).

Αυτό έχει σαν αποτέλεσμα όταν εκτυπώνουμε τις τιμές με την printf με αρκετά ψηφία να βλέπουμε περιπτώσεις όπως παρακάτω.

printf("%.16lf\n", 10.2);
// 10.1999999999999990
 
printf("%.16lf\n", 2.2);
//  2.2000000000000002 => ceil = 3
 
printf("%.16lf\n", 1.8);
//  1.8000000000000000
 
printf("%.16lf\n", 8. / 4.);
//  2.0000000000000000
 
printf("%.16lf\n", (10.2 - 2.2) / (2.2 + 1.8));
//  1.9999999999999998 => floor = 1

Και όπως φαίνεται αυτό έχει και σαν αποτέλεσμα, εάν πάνω σε αυτές τις τιμές εφαρμοστούν οι συναρτήσεις floor ή ceil να προκύψουν απρόσμενες τιμές. Αυτό όμως είναι ένα εγγενές πρόβλημα στους υπολογιστές, το οποίο όμως ξεφεύγει από τα πλαίσια της ροής της “Εισαγωγής στον προγραμματισμό” του μαθήματός μας.

qna/c/values-operators/rounding-values.txt · Last modified: 2021/03/13 20:13 by xallos