User Tools

Site Tools


qna:c:values-operators:rounding-values

This is an old revision of the document!


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

ή

Η 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", ( ((double)8.) / (4.)));                 // 2.0000000000000000
    printf("%.16lf\n", ((double) (10.2 - 2.2) / (2.2 + 1.8)));  // 1.9999999999999998   => floor = 1

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

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