0

Οπτικοποιητής κινητής υποδιαστολής IEEE‑754

Δείτε ακριβώς πώς ένας δεκαδικός αριθμός αποθηκεύεται ως κινητής υποδιαστολής IEEE‑754 — δυφίο προσήμου, δυφία εκθέτη και δυφία σημαντικής — και γιατί αριθμοί όπως το 0.1 δεν αποθηκεύονται ακριβώς.

🔒 Επεξεργάζεται εξ ολοκλήρου στο πρόγραμμα περιήγησής σας — τίποτα που εισάγετε εδώ δεν μεταφορτώνεται ποτέ.

Επεξεργασία... 0%
Κανονικοποίηση
Υπολογισμός πόλωσης εκθέτη
Επέκταση δυφίων σημαντικής
Ολοκληρώθηκε

Αποτέλεσμα

Κάθε αριθμός κινητής υποδιαστολής που αποθηκεύει ένας υπολογιστής — ένας αριθμός JavaScript, ένα float της C, ένα float της Python — κωδικοποιείται με τον ίδιο τρόπο κατά IEEE 754: ένα δυφίο προσήμου, ένα σύνολο δυφίων εκθέτη και ένα σύνολο δυφίων σημαντικής (κλασματικό μέρος). Η απλή ακρίβεια (32 δυφίων) χρησιμοποιεί 1 δυφίο προσήμου, 8 δυφία εκθέτη και 23 δυφία σημαντικής· η διπλή ακρίβεια (64 δυφίων), η μορφή πίσω από τον προεπιλεγμένο τύπο αριθμών σχεδόν κάθε γλώσσας, χρησιμοποιεί 1 δυφίο προσήμου, 11 δυφία εκθέτη και 52 δυφία σημαντικής. Αυτό το εργαλείο παίρνει όποιον δεκαδικό αριθμό πληκτρολογήσετε, τον κωδικοποιεί σε οποιοδήποτε από τα δύο πλάτη χρησιμοποιώντας τον ενσωματωμένο κωδικοποιητή κινητής υποδιαστολής του browser — τον ίδιο μηχανισμό πάνω στον οποίο τρέχει ο κώδικάς σας — και χρωματίζει κάθε δυφίο ανάλογα με την περιοχή στην οποία ανήκει.

Η ίδια η κωδικοποίηση ακολουθεί τρία βήματα, και αυτό το εργαλείο τα παρουσιάζει όλα αντί να δείχνει απλώς τα τελικά δυφία. Πρώτον, κανονικοποίηση: ο αριθμός ξαναγράφεται ως 1.σημαντική × 2^εκθέτης, με ακριβώς ένα μη μηδενικό ψηφίο πριν από την δυαδική υποδιαστολή (οι πολύ μικροί αριθμοί λαμβάνουν αντ' αυτού υποκανονική μεταχείριση, χωρίς το έμμεσο προπορευόμενο 1). Δεύτερον, πόλωση εκθέτη: εφόσον το πεδίο του εκθέτη πρέπει να αποθηκεύσει και θετικούς και αρνητικούς εκθέτες ως μη προσημασμένο αριθμό, προστίθεται μια σταθερή πόλωση (127 για απλή ακρίβεια, 1023 για διπλή) πριν το πεδίο γραφτεί σε δυαδικό. Τρίτον, η κλασματική σημαντική επεκτείνεται δυφίο προς δυφίο με την κλασική μέθοδο του «πολλαπλασίασε επί δύο, πάρε το ακέραιο μέρος ως επόμενο δυφίο, κράτα το υπόλοιπο» — επαναλαμβανόμενη μέχρι το πεδίο της σημαντικής να γεμίσει, οπότε τα εναπομείναντα δυφία καθορίζουν αν το αποτέλεσμα στρογγυλοποιείται προς τα πάνω ή προς τα κάτω (στρογγυλοποίηση στον πλησιέστερο άρτιο, η εξ ορισμού επιλογή του IEEE‑754).

Γι' αυτόν ακριβώς τον λόγο ένας τόσο συνηθισμένος αριθμός όσο το 0.1 δεν αποθηκεύεται ακριβώς. Στο δυαδικό, το 0.1 είναι ένα περιοδικό κλάσμα (0.0001100110011…, επ' άπειρον), επομένως καμία πεπερασμένη σημαντική δεν μπορεί να το συλλάβει με ακρίβεια — πρέπει να στρογγυλοποιηθεί κάπου. Κωδικοποιήστε το 0.1 ως float 32 δυφίων και διαβάστε τα δυφία πίσω, και δεν παίρνετε πίσω 0.1: παίρνετε ακριβώς 0.100000001490116119384765625. Η διπλή ακρίβεια διαθέτει 29 επιπλέον δυφία σημαντικής, οπότε το σφάλμα στρογγυλοποίησής της είναι πολύ μικρότερο, αλλά και πάλι δεν είναι μηδέν — το 0.1 ως double 64 δυφίων είναι ακριβώς 0.1000000000000000055511151231257827021181583404541015625. Αυτό το εργαλείο υπολογίζει την ακριβή αποθηκευμένη τιμή χρησιμοποιώντας αριθμητική μεγάλων ακεραίων (χωρίς συντομεύσεις κινητής υποδιαστολής), ώστε η απόκλιση ανάμεσα σε αυτό που πληκτρολογήσατε και σε αυτό που πραγματικά κρατά το υλικό να μην κρύβεται ούτε να προσεγγίζεται ποτέ.

Οι ειδικές τιμές λαμβάνουν ακριβή, δεσμευμένα μοτίβα δυφίων αντί για κανονική κωδικοποίηση: το μηδέν και το αρνητικό μηδέν έχουν όλα τα δυφία εκθέτη και σημαντικής μηδέν (μόνο το δυφίο προσήμου διαφέρει), το ±Άπειρο έχει όλα τα δυφία εκθέτη 1 με τη σημαντική μηδενική, και το NaN έχει όλα τα δυφία εκθέτη 1 με τουλάχιστον ένα δυφίο της σημαντικής ενεργό. Όλα εκτελούνται τοπικά στον browser σας — τίποτα από ό,τι πληκτρολογείτε δεν αποστέλλεται πουθενά — γεγονός που καθιστά το εργαλείο ασφαλές μέρος για να αναπτύξετε πραγματική διαίσθηση γύρω από τα σφάλματα κινητής υποδιαστολής: γιατί `0.1 + 0.2 !== 0.3` σχεδόν σε κάθε γλώσσα προγραμματισμού, γιατί οι υφές float32 στον κώδικα γραφικών χάνουν ακρίβεια που οι float64 δεν θα έχαναν, και γιατί ο οικονομικός κώδικας θα έπρεπε γενικά να αποφεύγει εντελώς την δυαδική κινητή υποδιαστολή.