Συστήματα Αρίθμησης Αριθμοί σταθερής και κινητής υποδιαστολής
Εισαγωγή Οι Η/Υ χρησιμοποιούν δυαδικό αριθμητικό σύστημα Η αναπαράσταση αριθμών σε έναν Η/Υ μπορεί να είναι άλλη μια πηγή σφαλμάτων κατά τους υπολογισμούς Απαραίτητη η αναπαράσταση αριθμών σε διαφορετικές βάσεις
Διάγραμμα παρουσίασης Αναπαράσταση σταθερής υποδιαστολής Αναπαράσταση πραγματικού αριθμού σε βάση β (2, 8, 16, 10) Αναπαράσταση πραγματικού αριθμού σε βάση β (2, 8, 16, 10) Πράξεις με δυαδικούς αριθμούς Πράξεις με δυαδικούς αριθμούς Μετατροπή αριθμού σε διαφορετικές βάσεις Μετατροπή αριθμού σε διαφορετικές βάσεις Μετατροπή ακέραιου μέρουςΜετατροπή ακέραιου μέρους Μετατροπή δεκαδικού μέρουςΜετατροπή δεκαδικού μέρους Αναπαράσταση κινητής υποδιαστολής Μέθοδος αποκοπής Μέθοδος αποκοπής Μέθοδος στρογγύλευσης Μέθοδος στρογγύλευσης Αποθήκευση ακεραίου αριθμού σε Η/Υ
Αναπαράσταση σταθερής Υποδιαστολής Έστω x ένας πραγματικός αριθμός με παράσταση σε αριθμητικό σύστημα με βάση β: x = (a n a n-1... a 1 a 0. b 1 b 2...) β και αριθμητική τιμή*: Όπου a i, b i {0, 1, …, β-1} Η τελεία (. ) διαχωρίζει το ακέραιο μέρος του αριθμού: από το κλασματικό: * Πάντα στο δεκαδικό σύστημα a n a n-1... a 1 a 0 b 1 b 2 b 3...
Χρησιμοποιούμενες Βάσεις Όνομα ΒάσηςΒάσηΣύνολο ψηφίων Παράδειγμα Δυαδικό2 {0, 1} Δεκαδικό10 {0,1,2,3,4,5,6,7,8,9} Δεκαεξαδικό16 {0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F} FF 16 Οκταδικό8 {0,1,2,3,4,5,6,7} Δεκαδικό Δεκαεξαδ Δυαδικό A B C D E F 1111
Παραδείγματα αριθμών (ABC) 16 = C + 16*B *A = * * 10 = (2748) 10 (7634) 8 = 4 + 8* * *7 = 4 + 8(3 + 8(6 + 8(7))) = (3996) 10 (.263) 8 = 2* * *8 -3 = 8 -3 (3 + 8(6 + 8(2))) = 179/512 = ( ) 10 (1101) 2 = 1 + 0*2 + 1* *2 3 = 1 + 2(0 + 2(1 + 2(1))) = (13) 10 (0.1) 10 = ( ) 8 = ( ) 2 Η μετατροπή από ένα σύστημα σε άλλο μπορεί να παράγει αριθμούς με άπειρο αριθμό δεκαδικών ψηφίων
Βασικές πράξεις με δυαδικούς * 5 7 ΠΡΟΣΘΕΣΗΑΦΑΙΡΕΣΗΠΟΛ/ΣΜΟΣΔΙΑΙΡΕΣΗ
Βασικές πράξεις με δυαδικούς ΠΟΛ/ΣΜΟΣ ΔΙΑΙΡΕΣΗ
Μετατροπή σε διαφορετικές βάσεις Μετατροπή από δυαδικό σε οκταδικό και δεκαεξαδικό και αντίστροφα Μετατροπή από βάση α σε βάση β. Ακέραιου μέρους Ακέραιου μέρους Με αριθμητική του συστήματος β.Με αριθμητική του συστήματος β. Με αριθμητική του συστήματος α (Διαιρέσεις, αφαιρέσεις).Με αριθμητική του συστήματος α (Διαιρέσεις, αφαιρέσεις). Δεκαδικού μέρους Δεκαδικού μέρους Με αριθμητική του συστήματος β.Με αριθμητική του συστήματος β. Με αριθμητική του συστήματος α. (Πολλαπλασιασμός)Με αριθμητική του συστήματος α. (Πολλαπλασιασμός)
2 αδικό (8 αδικό, 16 αδικό ) Οκταδικό Δυαδικό Δεκαεξαδ Δυαδικό A 1010 B 1011 C 1100 D 1101 E 1110 F 1111 Κανόνας 1: Αντιστοίχηση τριών δυαδικών ψηφίων σε ένα οκταδικό, ή τεσσάρων δυαδικών ψηφίων σε ένα δεκαεξαδικό. Κανόνας 2: Το ακέραιο μέρος ομαδοποιείται από την υποδιαστολή και αριστερά και το δεκαδικό από την υποδιαστολή και δεξιά 0
Παραδείγματα ( ) 2 = ( ) 2 = (3363) 8 = ( ) 2 = (6F3) 16 ( ) 2 = ( ) 2 = ( ) 8 = ( ) 2 = (2DED.93) 16 (CB3.15) 16 = ( ) 2 C B (123.45) 8 = ( )
Μετατροπή από βάση α σε βάση β Μετατροπή ακέραιου μέρους Έστω Ν = (a n a n-1... a 1 a 0 ) α ένας ακέραιος αριθμός με βάση το α. Για τη μετατροπή του σε αριθμό του συστήματος β, υπάρχουν δυο αλγόριθμοι Α. Χρησιμοποιώντας αριθμ. με βάση το β Α. Χρησιμοποιώντας αριθμ. με βάση το β Β. Χρησιμοποιώντας αριθμ. με βάση το α 1. Με διαιρέσεις 2. Με αφαιρέσεις Β. Χρησιμοποιώντας αριθμ. με βάση το α 1. Με διαιρέσεις 2. Με αφαιρέσεις
Α. Αριθμητική στο σύστημα βάσης β Γράφουμε τον Ν ως εξής: Αντικαθιστούμε τα a i και α με τα αντίστοιχα στοιχεία της βάσης β. Υπολογίζουμε την παράσταση κάνοντας πράξεις στο β-αδικό σύστημα
Παράδειγμα Έστω Ν = (187)10 (187) 10 = 7 + 8*10 + 1*102 = (8 + 1(10)) (10) 2 = 1010, (8) 2 =1000, (7) 2 =0111) = (111) 2 + (1010) 2 [(1000) 2 + (1010) 2 (1) 2 ] = ( ) 2 (1110) 2 = 0 + 2* * *1 = (0) 8 + (2) 8 [(1) 8 + (2) 8 [(1) 8 + (2) 8 (1) 8 ]] = (16) 8
Β. Αριθμητική στο σύστημα βάσης α Q 1 = πηλ(Ν, β) = c 1 + β(c β(c k ))...) υπο(Ν, β) = c 0 Q 2 = πηλ(Q1, β) = c 2 + β(c β(c k ))...) υπο(Ν, β) = c Q i+1 = πηλ(Q i, β) υπο(Q i, β) = c i Έστω τελική αναπαράσταση του Ν = (c k c k-1...c 1 c 0 ) b. Η τιμή του Επανάληψη έως Q i+1 = 0
Β. Αριθμητική στο σύστημα βάσης α Είσοδος του αριθμού Ν σε σύστημα βάσης α Αποθηκεύω το υπόλοιπο του Ν με το β Θέτω Επαναλαμβάνω όσο Ν > 0 Η λύση είναι τα αποθηκευμένα υπόλοιπα με ανάποδη σειρά Μέθοδος επαναληπτικής διαίρεσης (Όλες οι πράξεις γίνονται σε αριθμητική α)
Παράδειγμα: Μετατροπή δεκαδικού σε δυαδικό Δεκαδικός 67 Δυαδικός Ανάποδη σειρά
Παράδειγμα: Μετατροπή δεκαδικού σε δεκαεξαδικό (87) 16 =(135) (8B) 16 =(139) (C4) 16 =(139) 10 B C
main(){ int number, i = 0, bits[Ν]; int number, i = 0, bits[Ν]; printf(“Dose ton arithmo >> “); printf(“Dose ton arithmo >> “); scanf(“%d”, &number); scanf(“%d”, &number); while(number>0) while(number>0) { bits[i] = number % 2; number = number / 2; i = i + 1; }} ΠΡΟΓΡΑΜΜΑ C ΓΙΑ ΜΕΤΑΤΡΟΠΗ AKERAIOY ΣΕ ΔYΑΔΙΚΟ Προσοχή: Ο πίνακας bits περιέχει ανάποδα τα δυαδικά ψηφία Επαναληπτική διαίρεση
10 αδικό (2 αδικό ) Μέθοδος επαναληπτικής αφαίρεσης Βήμα 1: Βήμα 1: Καταγράφουμε από αριστερά προς τα δεξιά όλες τις δυνάμεις του 2, μέχρι να φτάσουμε στην πρώτη δύναμη που είναι μεγαλύτερη από τον αριθμό Ν πχ.Καταγράφουμε από αριστερά προς τα δεξιά όλες τις δυνάμεις του 2, μέχρι να φτάσουμε στην πρώτη δύναμη που είναι μεγαλύτερη από τον αριθμό Ν πχ
Βήμα 2: Βήμα 2: Σβήνουμε τη μεγαλύτερη δύναμη από τον αριθμό Ν. Η θέση της δείχνει τον αριθμό των ψηφίων του τελικού αριθμού. πχ.Σβήνουμε τη μεγαλύτερη δύναμη από τον αριθμό Ν. Η θέση της δείχνει τον αριθμό των ψηφίων του τελικού αριθμού. πχ … Συνέχεια
Βήμα 3: Βήμα 3: Αφαιρώ τη μεγαλύτερη τιμή που απομένει από τον αριθμό Ν και βάζω «1» κάτω από τη θέση πχ.Αφαιρώ τη μεγαλύτερη τιμή που απομένει από τον αριθμό Ν και βάζω «1» κάτω από τη θέση πχ = … Συνέχεια
Βήμα 4: Για τις υπόλοιπες θέσεις, προσπαθώ να αφαιρέσω κάθε δύναμη του 2 από το προηγούμενο αποτέλεσμα. Βήμα 4: Για τις υπόλοιπες θέσεις, προσπαθώ να αφαιρέσω κάθε δύναμη του 2 από το προηγούμενο αποτέλεσμα. Αν μπορώ να αφαιρέσω βάζω «1» στη συγκεκριμένη θέσηΑν μπορώ να αφαιρέσω βάζω «1» στη συγκεκριμένη θέση Αν δεν μπορώ να αφαιρέσω βάζω «0» στη συγκεκριμένη θέσηΑν δεν μπορώ να αφαιρέσω βάζω «0» στη συγκεκριμένη θέση Επαναλαμβάνω το Βήμα 4, μέχρι να τελειώσουν οι θέσεις Επαναλαμβάνω το Βήμα 4, μέχρι να τελειώσουν οι θέσεις
Παράδειγμα X X X X
Μετατροπή από βάση α σε βάση β Μετατροπή δεκαδικού μέρους Έστω Χ = (.b 1 b 2... B n-1 b n ) α ένας δεκαδικός αριθμός με βάση το α. Για τη μετατροπή του σε αριθμό του συστήματος β, υπάρχουν δυο αλγόριθμοι Α. Χρησιμοποιώντας αριθμ. με βάση το β Α. Χρησιμοποιώντας αριθμ. με βάση το β Β. Χρησιμοποιώντας αριθμ. με βάση το α 1. Με διαιρέσεις 2. Με αφαιρέσεις Β. Χρησιμοποιώντας αριθμ. με βάση το α 1. Με διαιρέσεις 2. Με αφαιρέσεις
Α. Αριθμητική στο σύστημα βάσης β Παρόμοια με την περίπτωση του ακεραίου Αντικαθιστώ τους αριθμούς α και b i και κάνω πράξεις στο β-αδικό πχ. ( ) 8 = 2* * * * * *8 -6 = 8-6(2+8(7+8(3+8(5+8(6+8(2)))))) = 92922/ = ( ) 10
Β. Αριθμητική στο σύστημα βάσης α Έστω τελική αναπαράσταση του (X) β = (.d 1 d 2...d k-1 d k ) β στο β-αδικό σύστημα. Παρατηρούμε ότι β*(Χ) β = (d 1.d 2...d k-1 d k ) β δηλαδή d 1 = β*(Χ) β Με τον ίδιο τρόπο καταλήγουμε στο συμπέρασμα: d 2 = β*(.d 2 d 3...d k ) β Η διαδικασία μπορεί να επαναληφθεί έως ότου κάποιο γινόμενο δώσει μόνο ακέραια τιμή (όχι δεκαδικά)
Β. Αριθμητική στο σύστημα βάσης α Είσοδος του δεκ. αριθμού Χ σε σύστημα βάσης α Αποθηκεύω το ψηφίο που προκύπτει από το ακέραιο μέρος του (β*Χ) α Θέτω Χ Δεκαδ[(β*Χ) α ] Επαναλαμβάνω έως ότου Χ = 0 ή φτάσω έναν προκαθορισμένο αριθμό δεκ. ψηφίων Η λύση είναι τα αποθηκευμένα υπόλοιπα με την σειρά που υπολογίστηκαν Μέθοδος επαναληπτικού πολλαπλασιασμού (Όλες οι πράξεις γίνονται σε αριθμητική α)
main(){ int i = 0, bits[Ν]; float number; int i = 0, bits[Ν]; float number; printf(“Dose ton arithmo >> “); printf(“Dose ton arithmo >> “); scanf(“%f”, &number); scanf(“%f”, &number); while(number!=0 || i<N) while(number!=0 || i<N) { bits[i] = number * 2; number = number-bits[i]; i = i + 1; }} ΠΡΟΓΡΑΜΜΑ C ΓΙΑ ΜΕΤΑΤΡΟΠΗ ΔEKΑΔΙΚΟΥ ΣΕ ΔYΑΔΙΚΟ Προσοχή: Ο πίνακας bits περιέχει σωστά τα δυαδικά ψηφία Επαναληπτικός πολλαπ/μος
Παράδειγμα (.2652) 10 σε οκταδικό g0 = (.2652) 10 g1 = Dec(.2652*8) = (.1216) 10 d1 = 2 (8*.2652 = ) g2 = Dec(.1216*8) = (.9728) 10 d2 = 0 (8*.1216 = ) g3 = Dec(.9728*8) = (.7824) 10 d3 = 7 (8*.9728 = ) g4 = Dec(.7824*8) = (.2592) 10 d4 = 6 g5 = Dec(.2592*8) = (.0736) 10 d5 = Επομένως: (.2652) 10 = ( …) 8 = ( …) 2 (.1) σε δυαδικόg0 = (.1) 10 g1 = Dec(0.1*2) = (0.2) 10 d1 = 0 g2 = Dec(0.2*2) = (0.4) 10 d2 = 0 g3 = Dec(0.4*2) = (0.8) 10 d3 = 0 g4 = Dec(0.8*2) = (0.6) 10 d4 = 1 g5 = Dec(0.6*2) = (0.2) 10 d5 = Eπομένως: (0.1) 10 = ( ) 2
Αναπαράσταση κινητής υποδιαστολής Έστω x ένας πραγματικός αριθμός με παράσταση σε αριθμητικό σύστημα με βάση β: x = q·β m Όπου ( ) το πρόσημο, β η βάση του αριθμητικού συστήματος και q κανονικοποιημένος αριθμός 1/β ≤ q < 1 Ο εκθέτης m δηλώνει την κανονικοποίηση: πχ = * = * 10 2 Γενικά q = (.b 1 b 2...) β με b 1 ≠ 0
Αναπαράσταση κινητής υποδιαστολής Σε ένα υπολογιστή m και q πεπερασμένα Το μέγιστο πλήθος ψηφίων για την αποθήκευση του q λέγεται «ακρίβεια» της μηχανής Ένας Η/Υ έχει ακρίβεια s: y = fl(x) = q · β m = (.d 1 d 2...d s ) β β m mantissa εκθέτης
Αναπαράσταση σε Η/Υ Για την αποθήκευση ενός πραγματικού x σε Η/Υ παίρνουμε τον πλησιέστερο αριθμό q* που επιτρέπει η ακρίβεια. πχ. s = 3, π = … fl(π) = Ο πλησιέστερος κλασματικός q* για τον x σε μηχανή με ακρίβεια s Μέθοδο αποκοπής: Αγνοούνται τα παραπάνω ψηφία Μέθοδο αποκοπής: Αγνοούνται τα παραπάνω ψηφία Μέθοδο στρογγύλευσης: Το ψηφίο στη θέση s γίνεται 1 αν αυτό που παραλείπεται > ½*β -s Μέθοδο στρογγύλευσης: Το ψηφίο στη θέση s γίνεται 1 αν αυτό που παραλείπεται > ½*β -s q*
Παράδειγμα στρογγύλευσης και αποκοπής Σε περίπτωση που |x| > β L, o αριθμός δεν μπορεί να παρασταθεί στη μηχανή (overflow) Σε περίπτωση που |x| < β l-1, ο αριθμός δεν μπορεί να παρασταθεί (underflow) Σε Η/Υ με s = 2 και βάση το 10: l < m < L, και συνήθως l = -L
Αποθήκευση σε Η/Υ n-1n-2ss-1s-210 πρόσημοεκθέτης mantissa Εκθέτης m: [0, 2 s-1 ] πχ. Ο αριθμός (16.5) 10 θα αποθηκευτεί σε σύστημα με n=26, s=6 ως εξής: (16.5) 10 = ( ) 2 = ( ) 2 *2 5 άρα m=(5) 10 = (101)