Αριθμός κυμαινόμενου σημείου: τι είναι αυτό; Απλώς εξηγείται με παραδείγματα
Σε αυτή την πρακτική συμβουλή, θα σας δείξουμε τι είναι ο αριθμός κινητής υποδιαστολής και πώς διαφέρει από τον αριθμό σταθερού σημείου.
Αριθμός κυμαινόμενου σημείου: τι είναι αυτό;
Στην επιστήμη των υπολογιστών, ο αριθμός του κινητού σημείου χρησιμοποιείται συχνά για τη μέτρηση των συσκευών που υποτίθεται ότι λειτουργούν με κάποια ακρίβεια.
- Ένας αριθμός κινητής υποδιαστολής (ή "αριθμός κινητής υποδιαστολής") είναι μια αναπαράσταση ενός αριθμού που χρησιμοποιεί εκθετική σημείωση. Σε εξαιρετικές περιπτώσεις, αυτό λειτουργεί μόνο περίπου. Μπορείτε επίσης να αντιπροσωπεύσετε τον αριθμό 1230000 με τον αριθμό 1.23 ⋅ 10⁶.
- Το 1.23 ονομάζεται "Mantissa". Το 10 είναι η "βάση" και το 6 είναι ο "εκθέτης". Παρεμπιπτόντως, ένα σημάδι μπορεί επίσης να προστεθεί στη μαντίζα. Ωστόσο, μπορείτε επίσης να εφαρμόσετε το όλο θέμα στο διπλό σύστημα. Μπορείτε επίσης να αναπαριστάτε τον αριθμό 10101100 με τον αριθμό 1.0101100 ⋅ 2⁷. Ο υπολογιστής αποθηκεύει μόνο την πινακίδα, τη μαντίζα και τον εκθέτη.
- Οι υπολογιστές συνήθως μετακινούν το κόμμα εμπρός και πίσω, μέχρι να υπάρχει μόνο 1 μπροστά από το κόμμα. Στη συνέχεια, ο υπολογιστής πρέπει μόνο να αποθηκεύσει τα δεκαδικά σημεία της μαντίνας και του εκθέτη.
- Για να μπορεί ο εκθέτης να αποθηκευτεί ως θετικός αριθμός, προστίθεται σταθερός αριθμός, η λεγόμενη προκατάληψη. Ο μικρότερος πιθανός εκθέτης του χώρου πριν από την υποδιαστολή (- προκατάληψη) αποθηκεύεται ως 0.
- Σε αντίθεση με τον αριθμό σταθερού σημείου, το κόμμα δεν βρίσκεται σε σταθερό σημείο σε αριθμό κινητής υποδιαστολής.
Half, Float & Double - Κοινή κωδικοποίηση αριθμών κυμαινόμενου σημείου
Σίγουρα έχετε σκοντάψει σε αυτούς τους τρεις όρους, ειδικά όταν προγραμματίζετε με τον Arduino. Πρόκειται για τυποποιημένες αναπαραστάσεις.
- Ο τύπος δεδομένων "μισό" είναι ένας αριθμός 16 bit. Το αριστερό κομμάτι είναι υπεύθυνο για το σύμβολο. Ο εκθέτης έχει 5 μπιτ και η μαντίζα 10. Η μεροληψία που χρησιμοποιείται είναι 15. Δεδομένου ότι το πρώτο κομμάτι της μαντίσας είναι (σχεδόν) πάντα 1, αυτό δεν σώζεται.
- Ο τύπος δεδομένων "float" (ή "single") είναι ένας αριθμός 32 bit. Εδώ, επίσης, λίγο χρησιμοποιείται για το σήμα. Ωστόσο, ο εκθέτης έχει 8 μπιτ (προκατάληψη = 127) και η μαντίζα 23.
- Ο τύπος δεδομένων "διπλό" χρησιμοποιεί επίσης ένα κομμάτι για το σημείο. Εδώ, όμως, ο εκθέτης έχει 11 bits (bias = 1023) και η μαντισσα ακόμα 52 bit. Συνολικά, αυτό είναι 64 bit, δηλαδή 8 bytes.
- Εκτός από αυτούς τους τρεις κοινούς τύπους δεδομένων, υπάρχουν και πολλά άλλα. Ωστόσο, αυτά δεν χρησιμοποιούνται ως επί το πλείστον επειδή η ακρίβεια του μισού, του πλωτήρα και του διπλού είναι ήδη αρκετά καλή.
Μετατροπή δεκαδικών αριθμών σε αριθμούς κυμαινόμενου σημείου - πώς λειτουργεί
Τέλος, θα θέλαμε να σας δείξουμε πώς μπορείτε να μετατρέψετε έναν κανονικό δεκαδικό αριθμό σε έναν αριθμό κινητού σημείου.
- Σε αυτό το παράδειγμα χρησιμοποιούμε τον δεκαδικό αριθμό 18.4. Ο αριθμός πριν από την υποδιαστολή μεταφέρεται πρώτα στο διπλό σύστημα. Ως αποτέλεσμα, πρέπει να πάρετε (10010) 2.
- Τότε θα πρέπει να μετατρέψετε το 0, 4. Πρώτα πολλαπλασιάστε το 0, 4 με το 2. Ως αποτέλεσμα έχετε το 0, 8. Σημειώστε τον αριθμό πριν από το κόμμα. Σε αυτή την περίπτωση είναι 0. Στη συνέχεια, πολλαπλασιάστε το 0, 8 με 2. Αυτή τη φορά παίρνετε 1, 6 ως αποτέλεσμα. Σημειώστε το 1 και συνεχίστε να το υπολογίζετε με 0, 6. Μετά από λίγο θα παρατηρήσετε ότι το μοτίβο επαναλαμβάνεται (σε αυτό το παράδειγμα). Τέλος, σημειώστε όλους τους αριθμούς από πάνω προς τα κάτω: 011001100110 ...
- Στη συνέχεια, προσθέστε τους αριθμούς μαζί: Προσθέστε επίσης (⋅ 2⁰) έτσι ώστε να λάβετε 10010.01100110 ... ⋅ 2⁰. Στη συνέχεια, μετακινήστε το κόμμα μέχρι να υπάρχει μόνο 1 μπροστά από την υποδιαστολή και επίσης να αλλάξετε την ισχύ κατάλληλα. Ως αποτέλεσμα, θα πρέπει να πάρετε το 1.001001100110 ... ⋅ 2⁴, αφού μετακινήσατε το δεκαδικό σημείο 4 θέσεις προς τα αριστερά. Αυτό το βήμα ονομάζεται επίσης "ομαλοποίηση".
- Σε αυτό το παράδειγμα χρησιμοποιούμε τον τύπο δεδομένων "float". Έτσι, προσθέστε την κατάλληλη τιμή προκατάληψη στον εκθέτη σας. Πρέπει επίσης να μετατρέψετε το αποτέλεσμα του υπολογισμού 4 + 127 = 131 σε δυαδικό αριθμό. Ο αριθμός 131 είναι ο αριθμός 10000011 στο διπλό σύστημα.
- Τώρα μπορείτε να γράψετε τον τελικό αριθμό του κινητού σημείου. Πρώτα γράψτε το κομμάτι του σημείου. Δεδομένου ότι είναι ένας θετικός αριθμός, το πρώτο bit είναι 0. Τότε πρέπει να γράψετε 131. Το όλο θέμα ταιριάζει απόλυτα σε αυτή την περίπτωση, δεδομένου ότι ο αριθμός αυτός απαιτεί 8 bits και 8 bits είναι διαθέσιμοι για ένα float. Τέλος, πρέπει να γράψετε τα πρώτα 23 μπιτς της μαντίσας, αφού η μαντισσα έχει 23 μπιτ διαθέσιμα για πλωτήρα.
- Επομένως, ο αριθμός τελικού κινητού σημείου θα πρέπει να είναι ο αριθμός 01000001100100110011001100110011. Λίγο πιο ξεκάθαρο είναι ο αριθμός 0 | 10000011 | 00100110011001100110011.
Μετατροπή αριθμού κυμαινόμενου σημείου σε δεκαδικό αριθμό - Δείτε πώς
Τέλος, θα θέλαμε να σας δείξουμε πώς μπορείτε να μετατρέψετε πάλι έναν αριθμό κινητού σημείου σε έναν δεκαδικό αριθμό. Για αυτό παίρνουμε τον αριθμό 1000001100100110011001100110011.
- Πρώτα πληκτρολογήστε τον αριθμό (μπροστά) με μηδενικά έως ότου λάβετε αριθμό 16, 32 ή 64 bit. Σε αυτή την περίπτωση είναι 01000001100100110011001100110011.
- Το πρώτο ψηφίο αντιπροσωπεύει το σημείο. Έτσι ο αριθμός μας είναι θετικός.
- Στη συνέχεια, γράψτε την επόμενη (σε αυτή την περίπτωση) 8 ψηφία και αφαιρέστε την προκατάληψη. (10000011) 2 = 131 → 131 - 127 = 4 → Έτσι υπάρχει "⋅ 2" στο πίσω μέρος.
- Τώρα γράψτε ένα "1", και στη συνέχεια όλους τους υπόλοιπους αριθμούς, καθώς και το "⋅ 2⁴": 1.00100110011001100110011 ⋅ 2⋅
- Στη συνέχεια, μετακινήστε το κόμμα 4 θέσεις προς τα δεξιά, ώστε να μπορείτε να παραλείψετε το "⋅ 2⁴": 10010.0110011001100110011
- Στη συνέχεια, μετατρέψτε το 10010 σε έναν ακέραιο ως συνήθως. Παίρνετε 18.
- Τώρα πρέπει να μετατρέψετε τα δεκαδικά ψηφία. Το πρώτο ψηφίο μετά το κόμμα έχει την τιμή 1: 2¹, το δεύτερο ψηφίο 1: 2² και ούτω καθεξής. Προσθέστε τις τιμές και ο αριθμός πριν το κόμμα σας δίνει τον αριθμό 18.3999996185302734375.
Στην επόμενη πρακτική συμβουλή θα σας δείξουμε πώς μπορείτε να μετατρέψετε τα γράμματα ASCII σε δυαδικούς αριθμούς.