Σφαλμα του διερμηνευτή

Ξεκίνησε από Droic, 05 Απρ 2011, 04:22:59 ΠΜ

« προηγούμενο - επόμενο »

Droic

Γεια σας, είμαι 21 χρονών φοιτητής στο Πανεπιστήμιο Πειραιά στο τμήμα Βιομηχανικής Διοίκησης και Τεχνολογίας. Απ' ότι καταλάβατε οι σπουδές μου δεν έχουν σχέση με την πληροφορική και τον προγραμματισμό αν και ήταν κάτι που μου άρεσε από το λύκειο, καθώς και το αγαπημένο μου μάθημα ήταν η ανάπτυξη εφαρμογών. Ακόμα και μετά από τόσο καιρό χρησιμοποιώ τον διερμηνευτή της γλώσσας αρκετά για να φτιάξω ενδιαφέροντα αλλα και χρήσιμα προγράμματα με τον τρόπο που έμαθα στο μάθημα της τρίτης λυκείου και θέλω να ευχαριστήσω πολύ το δημιουργό του για αυτή του την προσφορά. Πέρα από αυτή την εισαγωγή, μιας και είναι το πρώτο μου post στο forum, θα ήθελα να σας δείξω ένα εξαιρετικά περίεργο σφάλμα που συμβαίνει με έναν συγκεκριμένο αριθμό, υπό συγκερκιμένες εντολές. Αυτός είναι ο κώδικας:

ΠΡΟΓΡΑΜΜΑ σφαλμα
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: α
  ΠΡΑΓΜΑΤΙΚΕΣ: χ
ΑΡΧΗ
  ΓΡΑΨΕ 'Δώσε την τιμή 4.06'
  ΔΙΑΒΑΣΕ χ
  χ <- χ*100
  α <- Α_Μ(χ)
  ΓΡΑΨΕ α
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ

Διευκρίνηση: Η εντολή "Α_Μ()" χρησιμοποιείται με τον ορισμό της πληροφορικής
Το αποτέλεσμα θα έπρεπε να ήταν "406" σωστά;
Δοκιμάστε το και ενημερώστε με αν βλέπετε και εσείς τι εννοώ. Ευχαριστώ.

alkisg

Έχει αναφερθεί 3-4 φορές εδώ στο φόρουμ, αλλά δεν είναι bug του Διερμηνευτή. Έχει σχέση με την ακρίβεια αναπαράστασης των πραγματικών αριθμών στον Η/Υ.
Το 4.06 για παράδειγμα μπορεί να είναι 4.05999999999999 οπότε αν το πολλαπλασιάσεις επί 100 να βγαίνει 405.999999999 και επομένως το ακέραιο μέρος του να είναι 405.

Επειδή η αναπαράσταση των πραγματικών αριθμών είναι εκτός ύλης και δυσνόητη για τους μαθητές, ο Διερμηνευτής έχει μια επιλογή με την οποία περιορίζει την ακρίβειά τους στις συγκρίσεις. Έτσι π.χ. ενώ η συνθήκη "ΑΝ 10*4.06 = 406" σε Pascal θα ήταν ΨΕΥΔΗΣ λόγω του προβλήματος με την ακρίβεια, στο Διερμηνευτή θεωρείται ΑΛΗΘΗΣ για να μην μπερδεύονται οι μαθητές.

Θα πρέπει μάλλον στην επόμενη έκδοση του Διερμηνευτή να εφαρμόζεται αυτή η επιλογή και στη συνάρτηση Α_Μ(), για τους ίδιους λόγους.
Documentation για την επιλογή «Στρογγυλοποίηση πραγματικών σε συγκρίσεις στο δεκαδικό» του Διερμηνευτή
Documentation για τους τύπους δεδομένων, και συγκεκριμένα για τους πραγματικούς αριθμούς

Νίκος Αδαμόπουλος