Κεφάλαιο 3 Αριθμητική Υπολογιστών (Arithmetic for Computers) 1
Αριθμοί και Υπολογιστές Μια λέξη μηχανής (computer word) αποτελείται από ένα αριθμό δυαδικών ψηφίων (bits) η λέξη αναπαρίσταται ως ένας δυαδικός αριθμός Δυαδικοί αριθμοί (βάση 2) 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001... Φυσικά, το πρόβλημα της αναπαράστασης μπορεί να γίνει πολύπλοκο: Οι αριθμοί είναι πεπερασμένοι (πρόβλημα υπερχείλισης) Ποιος είναι ο μεγαλύτερος αριθμός που μπορεί να αναπαρασταθεί; Κλάσματα και πραγματικοί αριθμοί Αρνητικοί αριθμοί Π.χ., δεν υπάρχει η εντολή subi στη MIPS. Η εντολή addi μπορεί να χρησιμοποιηθεί για να προσθέσει ένα αρνητικό αριθμό Πως αναπαριστούμε αρνητικούς αριθμούς; δηλ. ποιες σχηματομορφές δυαδικών ψηφίων (bit patterns) αντιστοιχούν σε ποιους αριθμούς; 2
Επισκόπηση Σε κάθε βάση αριθμητικού συστήματος, η δεκαδική τιμή του κ ου ψηφίου δ υπολογίζεται από δ * Βάση κ π.χ., (10101) 2 = (1*2 4 ) + (0*2 3 ) + (1*2 2 ) + (0*2 1 ) + (1*2 0 ) = 16 + 0 + 4 + 0 + 1 = (21) 10 Ποιο είναι το κόστος (σε # bits) της αναπαράστασης του αριθμού 1,000,000 σε κώδικα ASCII; Ποιο το κόστος στο δυαδικό σύστημα; Υπερχείλιση (Overflow): Συμβαίνει όταν ένας αριθμός δεν μπορεί να αναπαρασταθεί με ένα συγκεκριμένο αριθμό ψηφίων (bits) και το/τα πιοσημαντικόψηφίο/ψηφία (MSBs) υπερχειλίζουν. Το O/S επιλαμβάνεται συνήθως τέτοια προβλήματα. Προσημασμένοι (Signed) και Μη-Προσημασμένοι (Unsigned) αριθμοί 3
Συστήματα Αναπαράστασης Αριθμών (1) Προσημασμένου (2) Συμπλήρωμα (3) Συμπλήρωμα Μεγέθους του Ένα του Δύο (Sign Magnitude) (One's Complement) (Two's Complement) 000 = +0 000 = +0 000 = +0 001 = +1 001 = +1 001 = +1 010 = +2 010 = +2 010 = +2 011 = +3 011 = +3 011 = +3 100 = -0 100 = -3 100 = -4 101 = -1 1 01 = -2 101 = -3 110 = -2 110 = -1 110 = -2 111 = -3 111 = -0 111 = -1 Το (1) έχει πολλά προβλήματα: που βρίσκεται το πρόσημο, πολύπλοκη υλοποίηση σε υλικό για πρόσθεση/αφαίρεση, υπάρχει το +0 και το -0 Το (2) επίσης έχει το πρόβλημα με τα διπλά μηδενικά (+0 και -0) Ποιο είναι το καλύτερο και γιατί; 4
Αριθμοί στη MIPS (Singed 2 s Complement) Προσημασμένοι αριθμοί 32-bit : 0000 0000 0000 0000 0000 0000 0000 0000 2 = 0 10 0000 0000 0000 0000 0000 0000 0000 0001 2 = + 1 10 0000 0000 0000 0000 0000 0000 0000 0010 2 = + 2 10... 0111 1111 1111 1111 1111 1111 1111 1110 2 = + 2,147,483,6 10 0111 1111 1111 1111 1111 1111 1111 1111 2 = + 2,147,483,7 10 1000 0000 0000 0000 0000 0000 0000 0000 2 = 2,147,483,8 10 1000 0000 0000 0000 0000 0000 0000 0001 2 = 2,147,483,7 10 1000 0000 0000 0000 0000 0000 0000 0010 2 = 2,147,483,6 10... 1111 1111 1111 1111 1111 1111 1111 1101 2 = 3 10 1111 1111 1111 1111 1111 1111 1111 1110 2 = 2 10 1111 1111 1111 1111 1111 1111 1111 1111 2 = 1 10 maxint minint Γενικά, ο αριθμός δ 31 δ 30 δ 29 δ 28 δ 1 δ 0 υπολογίζεται από: (δ 31 x(-2 31 )) + (δ 30 x2 30 ) + (δ 29 x2 29 ) + + (δ 1 x2 1 ) + (δ 0 x2 0 ) 5
Λειτουργία του Two's Complement Για αλλαγή πρόσημου (negate) ενός αριθμού σε συμπλήρωμα του 2: αντιστρέφουμε (invert) όλα τα bits και προσθέτουμε 1 ( negate invert ) Θυμάστε άλλο ευκολότερο τρόπο για αυτή την πράξη; Μετατροπή αριθμού με n bits σε αριθμό με κ > n bits: Ο 16-μπιτος σταθερός (immediate) στη MIPS μετατρέπεται σε 32-bits για αριθμητικές πράξεις Αντιγράφουμε το MSB (bit προσήμου) στα κ-n bits αυτό ονομάζεται «επέκταση προσήμου» (sign extension) 0010 -> 0000 0010 1010 -> 1111 1010 lbu # φόρτωση μη-προσημασμένου byte (χρησιμοποιείται κυρίως για φόρτωση χαρακτήρων), lb # χρησιμοποιεί προσημασμένη αριθμητική 6
Προσημασμένοι vs Μη-Προσημασμένοι Αριθμοί Ένας μικροεπεξεργαστής πρέπει να μπορεί να χειρίζεται προσημασμένους ΚΑΙ μη-προσημασμένους αριθμούς. Π.χ., προσημασμένους για αριθμούς, μη-προσημασμένους για διευθύνσεις Η C έχει τον τύπο δεδομένων int (για προσημασμένους αριθμούς) και τον τύπο unsigned int (για θετικούς μόνο = μηπροσηνασμένους αριθμούς) Θεωρήστε: $s0 = 1111 1111 1111 1111 1111 1111 1111 1111 $s1 = 0000 0000 0000 0000 0000 0000 0000 0001 slt $t0, $s0, $s1 sltu $t1, $s0, $s1 $t0 = ; $t1 = ; 7
Πρόσθεση και Αφαίρεση Τη διαδικασία την γνωρίζεται από το δημοτικό! 1 για κρατούμενο (carry) ή δανειζόμενο (borrow) 0111 0111 0101 + 0110-0110 - 0110 1101(=13 10 ) 0001 (=1 10 ) 1111 (=-1 10 ) Οι λειτουργίες για 2 s complement γίνονται εύκολα: Αφαίρεση με χρήση πρόσθεσης αρνητικών αριθμών 0111 + 1010 (=-6 10 ) 0001 Υπερχείλιση (το αποτέλεσμα είναι μεγάλο για την πεπερασμένη λέξη του υπολογιστή): Π.χ., πρόσθεση 2 αριθμών των n-bits δεν έχει ως αποτέλεσμα ένα αριθμό των n-bits 111 + 001 1000 8
Ανίχνευση Υπερχείλισης (Overflow Detection) ΔΕΝ υπάρχει υπερχείλιση όταν προσθέτουμε ένα θετικό με ένα αρνητικό αριθμό ΔΕΝ υπάρχει υπερχείλιση όταν τα πρόσημα είναι τα ίδια στην αφαίρεση Υπερχείλιση ΜΠΟΡΕΙ ΝΑ ΥΠΑΡΞΕΙ όταν το μέγεθος (magnitude) του αριθμού επηρεάζει την τιμή του πρόσημου: Πρόσθεση 2 θετικών μπορεί να δώσει αρνητικό αποτέλεσμα ή, πρόσθεση 2 αρνητικών μπορεί να δώσει θετικό αποτέλεσμα ή, αφαίρεση αρνητικού από θετικό δίνει αρνητικό ή, αφαίρεση θετικού από αρνητικό δίνει θετικό Επομένως, το τελικό κρατούμενο (carry out) ήτοτελικόδανειζόμενο (borrow bit) υπερεγγράφει το bit του προσήμου! Θεωρήστε τις πράξεις A + B και A B Υπάρχει υπερχείλιση αν το B είναι 0? Υπάρχει υπερχείλιση αν το A είναι 0? 9
Επιπτώσεις Υπερχείλισης Για αναγνώριση υπερχείλισης: Εμφανίζεται μια εξαίρεση(exception)/διακοπή(interrupt), από τις εντολές add, addi, ή sub Η κανονική ροή του προγράμματος διακόπτεται και προχωρεί σε μια προκαθορισμένη διεύθυνση για να εκτελέσει το «exception routine» Η διεύθυνση της εντολής που ανίχνευσε την διακοπή φυλάγεται για πιθανή επανάληψη των εντολών που διακόπηκαν Καταχωρητής $epc (exception program counter) κρατά την πιο πάνω διεύθυνση move from system control mfco $t0, $epc # αντιγράφει τον $epc στον $t0 Οι λεπτομέρειες εξαρτώνται από το λογισμικό / γλώσσα προγραμματισμού / κλπ Δεν είναι πάντα επιθυμητή/απαραίτητη η ανίχνευση υπερχείλισης π.χ., για μη-προσημασμένους αριθμούς (χρησιμοποιούνται για διευθύνσεις μνήμης) η υπερχείλιση αγνοείται Καινούριες εντολές MIPS addu, addiu, subu σημείωση: addiu sign-extends! σημείωση: sltu, sltiu για μη-προσημασμένες συγκρίσεις 10
Πολλαπλασιασμός Πιο πολύπλοκος από πρόσθεση ή αφαίρεση Υλοποιείται με ολίσθηση και πρόσθεση (shift-and-add) Προϋποθέτει περισσότερο χρόνο και χώρο Θυμηθείτε τον αλγόριθμο από το δημοτικό: 0010 (πολλαπλασιαστέος / multiplicand) (πολλαπλασιαστής / multiplier) x 1011 0010 0010 0000 + 0010 0010110 (αποτέλεσμα / product) Αρνητικοί αριθμοί: μετατροπή πρώτα και μετά πολ/σμός Υπάρχουν καλύτεροι αλγόριθμοι/υλοποιήσεις (δεν θα τους εξετάσουμε σε αυτό το σημείο) 11
Ακολουθιακή Υλοποίηση Πολλαπλασιαστή Ο πολλαπλασιασμός εκτελείται με μια σειρά από ολισθήσεις και προσθέσεις των -bit Απλό αλλά αργό! Ποιο μέρος είναι το Datapath? Multiplier[0]=1 Add Multiplicand to Product, save result in Product Start Test Multiplier[0] Multiplier[0]=0 Multiplicand -bit ALU Product Shift left Shift right Multiplier Controller 32 Shift Multiplicand left Shift Multiplier right 32 nd iteration? Done Yes No Control Flow (Ροή Μονάδας Ελέγχου) 12
Ακολουθιακή Υλοποίηση Πολλαπλασιαστή (Θεωρήστε 4-μπιτο πολλαπλασιασμό) 0010 (multiplicand) x 1001 0010 0000 0000 + 0010 0010010 (product) (multiplier) Multiplier[0]=1 Add Multiplicand to Product, save result in Product Start Test Multiplier[0] Multiplier[0]=0 0010 -bit ALU 1001 0 Controller Shift left Shift right 32 Shift Multiplicand left Shift Multiplier right 32 nd iteration? Done Yes No Control Flow (Ροή Μονάδας Ελέγχου) 13
Ακολουθιακή Υλοποίηση Πολλαπλασιαστή (Θεωρήστε 4-μπιτο πολλαπλασιασμό) (συν.) 0010 (multiplicand) x 1001 0010 0000 0000 + 0010 0010010 (product) (multiplier) Multiplier[0]=1 Add Multiplicand to Product, save result in Product Start Test Multiplier[0] Multiplier[0]=0 00100 -bit ALU 100 0010 Controller Shift left Shift right 32 Shift Multiplicand left Shift Multiplier right 32 nd iteration? Done Yes No Control Flow (Ροή Μονάδας Ελέγχου) 14
Ακολουθιακή Υλοποίηση Πολλαπλασιαστή (Θεωρήστε 4-μπιτο πολλαπλασιασμό) (συν.) 0010 (multiplicand) x 1001 0010 0000 0000 + 0010 0010010 (product) (multiplier) Multiplier[0]=1 Add Multiplicand to Product, save result in Product Start Test Multiplier[0] Multiplier[0]=0 001000 -bit ALU 10 0010 Controller Shift left Shift right 32 Shift Multiplicand left Shift Multiplier right 32 nd iteration? Done Yes No Control Flow (Ροή Μονάδας Ελέγχου) 15
Ακολουθιακή Υλοποίηση Πολλαπλασιαστή (Θεωρήστε 4-μπιτο πολλαπλασιασμό) (συν.) 0010 (multiplicand) x 1001 0010 0000 0000 + 0010 0010010 (product) (multiplier) Multiplier[0]=1 Add Multiplicand to Product, save result in Product Start Test Multiplier[0] Multiplier[0]=0 0010000 -bit ALU 0010 Controller Shift left Shift right 1 32 Shift Multiplicand left Shift Multiplier right 32 nd iteration? Done Yes No Control Flow (Ροή Μονάδας Ελέγχου) 16
Ακολουθιακή Υλοποίηση Πολλαπλασιαστή (Θεωρήστε 4-μπιτο πολλαπλασιασμό) (συν.) 0010 (multiplicand) x 1001 0010 0000 0000 + 0010000 0010010 (product) (multiplier) Multiplier[0]=1 Add Multiplicand to Product, save result in Product Start Test Multiplier[0] Multiplier[0]=0 Shift left 00100000 Shift right Shift Multiplicand left Shift Multiplier right -bit ALU 0010010 Controller 32 32 nd iteration? Done Yes No Control Flow (Ροή Μονάδας Ελέγχου) 17
Υλοποίηση για καλύτερη απόδοση Απαιτεί 1 κύκλο ρολογιού για κάθε βήμα αύξηση απόδοσης Οι πράξεις εκτελούνται παράλληλα: ολίσθηση για τον πολ/στη και τον πολ/στέο, ενώ ο πολ/στέος προστίθεται στο αποτέλεσμα. Οπολ/στής (Multiplier) ξεκινά στο δεξί μισό του αποτελέσματος (Product) Άλλα θέματα: Product[0]=1 έλεγχος ορθού bit του πολ/στη (πριν την ολίσθηση) χρήση του περιεχόμενου του πολ/στέου πριν την ολίσθηση Start Test Product[0] Product[0]=0 Multiplicand? 32 32-bit ALU Shift Product right 32 Product Multiplier shift right write Controller 32 nd iteration? No Yes Done Control Flow (Ροή Μονάδας Ελέγχου) 18
Πολλαπλασιασμός Προσημασμένων Αριθμών Μπορεί αυτό να χρησιμοποιηθεί για προσημασμένους αριθμούς; Ποιες αλλαγές χρειάζονται; Shift left Multiplicand -bit ALU Product Shift right Multiplier 32 Controller 19
Διαίρεση Πιο πολύπλοκη και από πολ/σμό Πρέπει να χειρίζεται διαίρεση δια 0 Και πάλι, θυμηθείτε τον αλγόριθμο του δημοτικού: 54 1001 Quotient (Πηλίκο) Divisor 3 163 1000 1001010 Dividend (Διαιρετέος) (Διαιρέτης) -15-1000 13 10-12 101 1 1010-1000 10 Remainder(Υπόλοιπο) Dividend = Quotient x Divisor + Remainder 163 / 3 = 54x3 +1, 1,001,010 / 1000 = 1001x1000 + 10 20
Αλγόριθμος Διαίρεσης και Υλοποίηση Start Το Πηλίκο αρχικοποιείται σε 0 Το Υπόλοιπο αρχικοποιείται στην τιμή του Διαιρετέου Subtract Divisor from Remainder, place result in Remainder Check if divisor < dividend Remainder >= 0 Test Remainder < 0 Quotient bit 1 Remainder Quotient bit 0 Shift right Divisor Shift Quotient left, set rightmost bit to 1 Shift left Restore original value by adding Divisor to Remainder, place sum in Remainder. Shift Quotient left, set its LSB to 0 -bit ALU Quotient 32 bits Shift Divisor right Remainder Controller 33 rd iteration? No Done Yes 21
Υλοποίηση καλύτερης απόδοσης Ολισθήσεις και αφαιρέσεις εκτελούνται παράλληλα ΑπαιτείτομισόμέγεθοςγιαDivisor και ALU Το Quotient φυλάγεται στο λιγότερο σημαντικό μισό του Remainder, << (αριστερά) Remainder στο περισσότερο σημαντικό του Remainder, >> (δεξιά) Divisor 32 32-bit ALU 32 Quotient shift right Remainder shift left write Controller 22
Πολλαπλασιασμός και Διαίρεση στη MIPS Η MIPS παρέχει ένα ξεχωριστό ζευγάρι καταχωρητών για το -μπιτο Product ή Remainder, και 2 καινούριες εντολές Καταχωρητές $Hi και $Lo mflo $s1 # $s1 = $Lo, get a copy of Lo mfhi $s1 # $s1 = $Hi, get a copy of Hi 4 νέες εντολές για πολ/σμό και διαίρεση: mult $s2, $s3 # εντολή για προσημασμένο πολ/σμό # $Hi,$Lo=$s2 x $s3, -bit Product στους $Hi,$Lo multu $s2, $s3 # εντολή για μη-προσημασμένο πολ/σμό # -bit product στους $Hi,$Lo=$s2 x $s3 div $s2, $s3 # εντολή για προσημασμένη διαίρεση # Quotient στον $Lo = $s2 / $s3, Remainder στον $Hi = $s2 mod $s3 divu $s2, $s3 # εντολή για μη-προσημασμένη διαίρεση # Quotient στον $Lo = $s2 / $s3, Remainder στον $Hi = $s2 mod $s3 23
Αριθμητική Κινητής Υποδιαστολής (Floating Point Arithmetic) Χρειαζόμαστε ένα τρόπο για αναπαράσταση: κλασματικών αριθμών, π.χ., 3.14159265 πολύ μικρών αριθμών, π.χ., 0.000000001 ή 1.0 10-9 πολύ μεγάλων αριθμών, π.χ., 3,155,760,000 ή 3.15576 10 9 Επιστημονικός Συμβολισμός (Scientific Notation) Μόνο ένα ψηφίο αριστερά της υποδιαστολής Τα τελευταία δύο παραδείγματα πιο πάνω φαίνονται και σε μορφή επιστημονικού συμβολισμού Κανονικοποιημένη Tιμή (Normalized Value) Ένας αριθμός σε μορφή επιστημονικού συμβολισμού, αλλά χωρίς μηδενικά (0) στην αρχή Π.χ., 1.0 10-9 είναι κανονικοποιημένο ενώ 0.10 10-8 δεν είναι 24
Περιγραφή Δυαδικών με Κινητή Υποδιαστολή 3 μέρη: Πρόσημο (S), Κλάσμα (F) και Εκθέτης (Ε) Γενική Μορφή: (-1) S x F x 2 E Το μέγεθος του F καθορίζει την ακρίβεια (ή προσέγγιση) (accuracy or precision) Το μέγεθος του E καθορίζει το εύρος (range) των τιμών F+E είναι σταθερό, άρα πρέπει να αποφασίσουμε μεταξύ F και Ε! 25
Κινητή Υποδιαστολή στη MIPS Αναπαράσταση sign-and-magnitude (όχι 2 s complement) Μονής Ακριβείας Μπορεί να αναπαραστήσει κλάσματα μεταξύ 2 x 10-38 2 x 10 38 Διπλής Ακριβείας Μπορεί να αναπαραστήσει κλάσματα μεταξύ 2 x 10-308 2 x 100 308 26
Κινητή Υποδιαστολή στη MIPS (συν.) Υπερχείλιση για κινητή υποδιαστολή (Overflow) Θετικός Εκθέτης πολύ μεγάλος για να χωρέσει στο πεδίο E E > 2 7-1 (=127) για μονή ακρίβεια E > 2 10-1 (=1023) για διπλή ακρίβεια Υπορροή για κινητή υποδιαστολή (Underflow) Αρνητικός Εκθέτης πολύ μεγάλος για να χωρέσει στο πεδίο E E < -2-7 - 2 (= -126) για μονή ακρίβεια E < -2-10 - 2 (= -1022) για διπλή ακρίβεια 27
Πρότυπο IEEE 754 για αριθμητική κινητής υποδιαστολής Χρησιμοποιείται σχεδόν από όλους του υπολογιστές που σχεδιάστηκαν μετά το 1980, ως πρότυπο αριθμητικής για κινητή υποδιαστολή Το αρχικό 1 ενός κανονικοποιημένου αριθμού εννοείται (δεν χρειάζεται ρητή αναπαράσταση) Το πεδίο του κλάσματος (F) περιέχει ΜΟΝΟ το κλασματικό μέρος Το νέο πεδίο F αυξάνεται κατά 1 bit (23-bits για μονή ακρίβεια και 52-bits για διπλή ακρίβεια) Ορίζει: Significand = 1 + Fraction Το 0 αναπαρίσταται ως 00.002 (ΟΧΙ σε μορφή κανονικοποιημένου επιστημονικού συμβολισμού!) Οι υπόλοιποι αριθμοί αναπαρίστανται από: (-1) Sign (1+Fraction) 2 Exponent 28
Πρότυπο IEEE 754 για αριθμητική κινητής υποδιαστολής (συν.) Μονής Ακρίβειας Εκθέτης (Ε) Κλάσμα (F) Διπλής Ακρίβειας Εκθέτης (Ε) Κλάσμα (F) Τρόπος Αναπαράστασης 0 0 0 0 0 0 0 0 0 ± μη-κανονικοποιημένος αριθμός 1-254 οτιδήποτε 1-2046 οτιδήποτε ± αριθμός κινητής υποδιαστολής 255 0 2047 0 ± άπειρο 255 0 2047 0 ΝaΝ (Not-a-Number) Όχι αριθμός Η κωδικοποίηση αριθμών με το πρότυπα IEEE 754. - Ένα ξεχωριστό bit καθορίζει το πρόσημο. - Μη κανονικοποιημένοι αριθμοί αναφέρονται σε αριθμούς μεγαλύτερης ακρίβειας. - Ο εκθέτης είναι BIASED (βλέπει επόμενες διαφάνειες) 29
Αρνητικοί Εκθέτες Αρνητικός Εκθέτης σε 2 s complement Θετικός Εκθέτης 30
Αρνητικοί Εκθέτες (συν.) Μπορούμε να έχουμε κάποιον τρόπο αναπαράστασης αριθμών κινητής υποδιαστολής που να ευκολύνει συγκρίσεις μεταξύ ακεραίων, π.χ., για ταξινόμηση ακεραίων; Η προηγούμενη αναπαράσταση κάνει αυτό το πρόβλημα πολύπλοκο Λύση: Χρησιμοποιούμε το E = 00000000 2 ως τον «πιο» αρνητικό εκθέτη Χρησιμοποιούμε το E = 11111111 2 ως τον «πιο» θετικό εκθέτη Πολωμένος Συμβολισμός (Biased Notation) Η Πόλωση (Bias) είναι ο αριθμός που αφαιρούμε από την 8-μπιτη, μη-προσημασμένη αναπαράσταση του εκθέτη για να υπολογίσουμε τον πραγματικό εκθέτη Το IEEE 754 χρησιμοποιεί Bias = 127 για αναπαραστάσεις μονής ακριβείας (1023 για διπλή ακρίβεια): -1-1+127 = 126 = 011111102 +1 1+127 = 128 = 100000002 Τελική γενική μορφή: (-1) Sign (1+Fraction) 2 (Exponent Bias) 31
Αντιπροσώπευση κινητής υποδιαστολής Παράδειγμα 1 Θεωρήστε τον αριθμό -0.75 10 = -0.11 2 και μονή ακρίβεια: -0.11 2 2 0 -- σε επιστημονικό συμβολισμό -1.1 2 2-1 -- κανονικοποιημένος Για IEEE 754, έχουμε (-1) Sign (1+Fraction) 2 Biased_Exponent Πρόσημο S = 1 Κλάσμα F = 10000000000000000000000 Εκθέτης E = -1 Bias = 127 Biased_Exponent = Εκθέτης + Bias = -1 + 127 = 126 = 01111110 32
Αντιπροσώπευση κινητής υποδιαστολής Παράδειγμα 2 Θεωρήστε τον αριθμό +1.25 10 = +1.01 2 και μονή ακρίβεια: 1.01 2 2 0 -- σε επιστημονικό συμβολισμό 1.10 2 2 0 -- κανονικοποιημένος Για IEEE 754, έχουμε (-1) Sign (1+Fraction) 2 Biased_Exponent Πρόσημο S = 0 Κλάσμα F = 01000000000000000000000 Εκθέτης E = 0 Bias = 127 Biased_Exponent = Εκθέτης + Bias = 0 + 127 = 01111111 33
Αντιπροσώπευση κινητής υποδιαστολής Παράδειγμα 3 Ποια είναι η δεκαδική τιμή των πιο κάτω αριθμών; 34
Πρόσθεση Κινητής Υποδιαστολής Παράδειγμα (σε δεκαδικό): Θεωρήστε μόνο 4 δεκαδικά ψηφία για το significand και 2 για τον εκθέτη Προσθέστε 9.999 10 x 10 1 και 1.610 10 x 10-1 1 ο Βήμα: Ο 1.610 10 x 10-1 έχει τον μικρότερο εκθέτη, άρα ολίσθηση 2 φορές δεξιά για να πάρουμε 0.01610 10 x 10 1. Αφού έχουμε μόνο 4 ψηφία για το significand, παίρνουμε 0.016 10 x 10 1 2 ο Βήμα: Υπολογίζουμε 9.999 10 + 0.016 10 = 10.015 10 3 ο Βήμα: Κανονικοποίηση αποτελέσματος ολίσθηση 1 φορά δεξιά και αύξηση του εκθέτη κατά ένα 1.0015 10 x 10 2 4 ο Βήμα: Στρογγυλοποίηση αριθμού σε 4 ψηφία 1.002 10 x 10 2 35
Υλοποίηση Σύγκριση εκθέτων, υπολογισμός διαφοράς ΜUXes για κατάλληλη επιλογή Ολίσθηση μικρότερου εκθέτη δεξιά Πρόσθεση Κανονικοποίηση, αύξηση/μείωση εκθέτη Στρογγυλοποίηση, κανονικοποίηση αν χρειάζεται 36
Πολλαπλασιασμός Κινητής Υποδιαστολής Παράδειγμα (σε δεκαδικό): Θεωρήστε μόνο 4 δεκαδικά ψηφία για το significand και 2 για τον εκθέτη Πολ/στε 1.110 10 x 10 10 επί 9.200 10 x 10-5 1 ο Βήμα: Υπολογισμός εκθέτη αποτελέσματος με πρόσθεση: Νέος Εκθέτης = 10 + (-5) = 5 (Θυμηθείτε να υπολογίσετε το Bias) 2 ο Βήμα: Πολ/σμός significands: 1.100 10 x9.200 10 =10212000 10 Βρείτε τη θέση της υποδιαστολής 10.212000 10 x10 5 3 ο Βήμα: Κανονικοποίηση αποτελέσματος ολίσθηση 1 φορά δεξιά και αύξηση του εκθέτη κατά ένα 1.212000 10 x 10 6 4 ο Βήμα: Στρογγυλοποίηση αριθμού σε 4 ψηφία 1.212 10 x 10 6 5 ο Βήμα: Υπολογισμός προσήμου (ίδιο) +1.212 10 x 10 6 37
Εντολές Κινητής Υποδιαστολής για MIPS 32 νέοι καταχωρητές για πράξεις αριθμητικής με κινητή υποδιαστολή: $f0, $f1, $f2,, $f31 (χρησιμοποιούνται σε ζευγάρια για διπλή ακρίβεια) Πρόσθεση / Αφαίρεση / Πολ/σμός / Διαίρεση add.s $f0, $f4, $f6 # πρόσθεση, μονής ακρίβειας add.d $f0, $f4, $f6 # πρόσθεση, διπλής ακρίβειας sub.s $f0, $f4, $f6 # αφαίρεση, μονής ακρίβειας sub.d $f0, $f4, $f6 # αφαίρεση, διπλής ακρίβειας mul.s $f0, $f4, $f6 # πολ/σμός, μονής ακρίβειας mul.d $f0, $f4, $f6 # πολ/σμός, διπλής ακρίβειας div.s $f0, $f4, $f6 # διαίρεση, μονής ακρίβειας div.d $f0, $f4, $f6 # διαίρεση, διπλής ακρίβειας Καταχωρητές διπλής ακρίβειας: αποτελούνται από ένα ζευγάρι άρτιων-περιττών καραχωρητών μονής ακρίβειας, όπου το όνομα του άρτιου καταχωρητή καθορίζει το όνομα του διπλού καταχωρητή, π.χ. ο καταταχωρητής διπλής ακρίβειας ($f2,$f3) ορίζεται ως $f2. Πόσοι καταχωρητές διπλής ακρίβειας υπάρχουν; 38
Εντολές Κινητής Υποδιαστολής για MIPS (συν.) Σύγκριση c.eq.s $f2, $f4 # σύγκριση ισότητας, μονής ακρίβειας # θέτει cond=1 εάν True, cond=0 εαν False c.eq.d $f2, $f4 # σύγκριση ισότητας, διπλής ακρίβειας c.neq.s $f2, $f4 # σύγκριση ανισότητας, μονής ακρίβειας c.neq.d $f2, $f4 # σύγκριση ανισότητας, διπλής ακρίβειας c.lt.s $f2, $f4 # σύγκριση για λιγότερο από, μονής ακρίβειας c.lt.d $f2, $f4 # σύγκριση για λιγότερο από, διπλής ακρίβειας c.le.s $f2, $f4 # σύγκριση για λιγότερο από ή ίσα, μονής ακρίβειας c.le.d $f2, $f4 # σύγκριση για λιγότερο από ή ίσα, διπλής ακρίβειας c.gt.s $f2, $f4 # σύγκριση για μεγαλύτερο από, μονής ακρίβειας c.gt.d $f2, $f4 # σύγκριση για μεγαλύτερο από, διπλής ακρίβειας c.ge.s $f2, $f4 # σύγκριση για μεγαλύτερο από ή ίσα, μονής ακρίβειας c.ge.d $f2, $f4 # σύγκριση για μεγαλύτερο από ή ίσα, διπλής ακρίβειας 39
Εντολές Κινητής Υποδιαστολής για MIPS (συν.) Διακλαδώσεις $bc1t 25 # Εάν cond==1 (True) branch στη διεύθυνση $bc1f 25 # Εάν cond==0 (False) branch στη διεύθυνση Χρησιμοποιείται με εντολές συγκρίσεως Φόρτωση / Αποθήκευση $lwc1 $f1, 100($s2) # f1 = Memory[s2+100] $swc1 $f1, 100($s2) # Memory[s2+100] = f1 Καραχωρητής βάσεως (base register) μένει ακέραιος! Παράδειγμα για φόρτωση 2 αριθμών μονής ακρίβειας, πρόσθεση και αποθήκευση του αποτελέσματος στη μνήμη: $lwc1 $f4, x($sp) # f4 = Memory[sp+ x] $lwc1 $f6, y($sp) # f6 = Memory[sp+ y] $add.s $f2, $f4, $f6 # f2 = f4 + f6 $swc1 $f2, z($sp) # Memory[sp+ z] = f2 40
Παράδειγμα: C MIPS Απλό πρόγραμμα για την μετατροπή της θερμοκρασίας από Fahrenheit σε Celsius: float f2c (float fahr) { return ( (5.0/9.0) * (fahr 32.0) ); } fahr $f12, result $f0 lwc1 $f16, const5($gp) # f16 = 5 lwc1 $f18, const9($gp) # f18 = 9 div.s $f16, $f16, $f18 # f16 = 5/9 lwc1 $f18, const32($gp) # f18 = 32 sub.s $f18, $f12, $f18 # f18 = fahr-32 mul.s $f0, $f16, $f18 # f0 = (5/9)*(fahr 32) jr $ra # επιστρέφει 41
Αριθμητική Ακριβείας Σε αναπαραστάσεις κινητής υποδιαστολής, ο αριθμόςδίνεται κατά προσέγγιση του πραγματικού αριθμού. Αυτό συμβαίνει λόγω της περιορισμένης/πεπερασμένης ακρίβειας. Χρειαζόμαστε μεθόδους για ακριβή στρογγυλοποίηση! Στο IEEE 754, κρατούνται δύο επιπλέον bits, τα guard και round, για κάθε ενδιάμεση αναπαράσταση (αλλιώς δεν μπορεί να γίνει η στρογγυλοποίηση) 4 τρόποι στρογγυλοποίησης θετικό δια 0 δίνει άπειρο 0 δια 0 δίνει ΝaΝ Υλοποίηση του προτύπου IEEE 754 μπορεί να γίνει πολύπλοκη Εάν δεν χρησιμοποιηθεί το πρότυπο, είναι ακόμη χειρότερο βλέπε βιβλίο μαθήματος για περιγραφή του σφάλματος (bug) στους 80x86 και Pentium μικροεπεξεργαστές! 42
Περίληψη 3 ου Κεφαλαίου Κύρια Σημεία Η αριθμητική των υπολογιστών έχει περιορισμένη ακρίβεια Οι στοιχειοσειρές (bit patterns) δεν έχουν καμία ενυπάρχουσα έννοια Χρησιμοποιούμε πρότυπα αναπαράστασης Συμπλήρωμα του 2 (2 s complement) IEEE 754 floating point Οι εντολές ορίζουν πώς να «διαβαστούν» οι στοιχειοσειρές: - add ακέραιοι αριθμοί 2 s complement - add.s πραγματικοί αριθμοί ΙΕΕΕ 754, μονή ακρίβεια - add.d πραγματικοί αριθμοί ΙΕΕΕ 754, διπλή ακρίβεια Η απόδοση και η ακρίβεια είναι σημαντικές και γι αυτό και υπάρχουν πολλές περιπλοκές σε πραγματικές μηχανές Η επιλογή κατάλληλου αλγορίθμου είναι εξίσου σημαντική αφού μπορεί να οδηγήσει σε βελτιστοποιήσεις του υλικού, από άποψη χρόνου (συχνότητα ρολογιού) και χώρου (βλέπε πολ/σμό) 43