Για να το δείτε με τα μάτια σας (το συγκεκριμένο παράδειγμα το έχω από πολλά χρόνια και είναι ανεξάρτητο από την python)
- Κώδικας: Επιλογή όλων
>>> 0.2 == 0.2
True
>>> 1.2 - 1.0 == 0.2
False
>>> 1.2 - 1.0
0.19999999999999996
>>> print 1.2 - 1.0
0.2
>>> print 1.0/3.0
0.333333333333
>>> (1.0 / 3.0) * 3.0
1.0
>>>
Παρατηρήσεις:
Το σφάλμα είναι απρόβλεπτο. Μην κάνετε υποθέσεις για το πότε θα εμφανιστεί και πώς, δεν αξίζει τον κόπο απλά αρκεστείτε ότι οι αριθμοί είναι προσεγγιστικοί.
Το σφάλμα δεν εξαρτάται από την Python. Η Python χρησιμοποιεί απλά την C. Επομένως η ευθύνη πέφτει στην C.
Το σφάλμα δεν οφείλεται σε κακό προγραμματισμό. Η φύση τού προβλήματος το δημιουργεί. Δεν θα μπορούσαμε να απαλλαγούμε.
Για να πάρετε πάντως μια ιδέα γιατί εμφανίζεται στο 1.2 - 1.0, σκεφτείτε πώς αναπαριστά τούς αριθμούς ο υπολογιστής. όταν κάνει την αφαίρεση 1.2 - 1.0 = 0.2 το αποτέλεσμα πρέπει να το εκφράσει σαν πραγματικό, δηλαδή σε μια μορφή κοντύτερα στην 2.0 * 10^(-1). Πάνω σε αυτήν την πράξη μάς λείπουν κάποια ψηφία. Λάβετε υπόψιν σας ότι 0.2 = 1/5. Το 5 όμως δεν είναι δύναμη τού 2 ούτε υποπολλαπλάσιό του, ούτε γινόμενο υποπολλαπλάσιών του. Η διαίρεση στο δυαδικό σύστημα δημιουργεί μια ατελείωτη σειρά ψηφίων όπως στο δεκαδικό έχουμε με τις διαιρέσεις 1/3, 1/7 κλπ.
(το παραπάνω θυμίζει και γιατί οι πραγματικοί στούς υπολογιστές λέγονται και αριθμοί κινητής υποδιαστολής. Αυτό το όνομα τούς διαχωρίζει από την μαθηματική έννοια τού πραγματικού και είναι ενδεχομένως ακριβέστερο)
Ερώτηση κρίσεως: τι είναι ταχύτερο για τον υπολογιστή, η πρόσθεση ή ο πολλαπλασιασμός πραγματικών;
Κάτι ακόμα για το σφάλμα. Ο τρόπος που συσσωρεύεται είναι χαοτικός, και θυμηθείτε ότι βασικό χαρακτηριστικό τού χάους είναι η εκθετική συνάρτηση. Εκθετική ανάπτυξη σημαίνει ότι θα κάνει κάμποση ώρα ίσως να γίνει αισθητό, αλλά από την στιγμή που θα συμβεί αυτό πολύ γρήγορα χάνεται ο έλεγχος.
Παράδειγμα: Ελκυστής τού Λόρεντζ.
Η φύση τού υπολογισμού αυτού τού χαοτικού σχήματος είναι... χαοτική. Αυτό σημαίνει ότι πέρα από έναν ορίζοντα προβλεψιμότητας, δεν υπάρχει καμμία ακρίβεια στον υπολογισμό τών σημείων. Επειδή όμως είναι ελκυστής, έστω και παράξενος, το σχήμα για το «ανθρώπινο μάτι» είναι σωστό!