Κεφάλαιο 3 Αριθμητική Υπολογιστών Review signed numbers, 2 s complement, hex/dec/bin, add/subtract, logical Hardware implementation of simple ALU Multiply/Divide Real Numbers 1 Προσημασμένοι και Απρόσημοι Αριθμοί Οι λέξεις στον MIPS είναι μεγέθους 32bits, -2 32 διαφορετικούς 32bits συνδυασμούς, δηλαδή από 0 μέχρι 2 32-1 two = 0 ten 0001 two = 1 ten two = 2 ten 1111 1111 1111 1111 1111 1111 1111 1101 two = 4,294,967,293 ten 1111 1111 1111 1111 1111 1111 1111 1110 two = 4,294,967,294 ten 1111 1111 1111 1111 1111 1111 1111 1111 two = 4,294,967,295 ten Απρόσημη Αριθμητική Αν έχουμε n bits η περιοχή των αριθμών είναι : 0 έως (2 n -1) πχ Για n=8 0 έως 255 Για n=16 0 έως 65535 Για n=32 0 έως (2 32-1) 2
Προσημασμένη Αριθμητική, n bits: -2 (n-1) έως 2 (n-1) -1 Για n=8-128 έως +127 Για n=16-32768 έως +32767 Για n=32-2 31 έως +2 31-1 Μετατροπή από δυαδικό σε δεκαδικό Παράδειγμα Ποια η δεκαδική τιμή του πιο κάτω δυαδικού αριθμού: 1111 1111 1111 1111 1111 1111 1111 1100 two Απάντηση (1x 2 31 )+ (1x2 30 )+ (1x2 29 )+ + (1x2 2 )+ (0x2 1 )+ (0x2 0 ) = -2 31 + 2 30 + 2 29 + + 2 2 + 0 + 0 = -2,147,483,648 ten + 2,147,483,644 ten = -4 ten 3 Προσημασμένη εναντίον απρόσημων συγκρίσεων Παράδειγμα Υποθέτουμε ότι ο καταχωρητής $s0 περιέχει τον δυαδικό αριθμό 1111 1111 1111 1111 1111 1111 1111 1111 two και ο καταχωρητής $s1 περιέχει τον αριθμό 0001 two ποιες είναι οι τιμές των καταχωρητών $t0, $t1 μετά από αυτές τις εντολές slt $t0, $s0, $s1 #signed comparison sltu $t1, $s0, $s1 #unsigned comparison 4
Απάντηση Η τιμή του καταχωρητή $s0 αναπαριστά το 1 εάν είναι ακέραιος και το 4,294,967,295 ten εάν είναι απρόσημος ακέραιος. Η τιμή του καταχωρητή $s1 αναπαριστά το 1 σε οποιαδήποτε περίπτωση. Ο καταχωρητής $t0 έχει τη τιμή 1, αφού 1 ten < 1 ten, Oκαταχωρητής $t1 έχει τη τιμή 0, αφού 4,294,967,295ten > 1 ten. 5 Μετατροπή πρόσημου 2 ten = two βρίσκουμε το συμπλήρωμα του 2 και προσθέτουμε 1 1111 1111 1111 1111 1111 1111 1111 1101 two + 1 two = 1111 1111 1111 1111 1111 1111 1111 1110 two = -2 ten επαληθεύοντας, 1111 1111 1111 1111 1111 1111 1111 1110 two 0001 two + 1 two = two = 2 ten 6
Ηex Bin Πίνακας μετατροπής δεκαεξαδικού αριθμού σε δυαδικό Hex Bin Hex Bin Hex Bin 0 hex two 4 hex 0100 two 8 hex 1000 two C hex 1100 two 1 hex 0001 two 5 hex 0101 two 9 hex 1001 two D hex 1101 two 2 hex two 6 hex 0110 two A hex 1010 two E hex 1110 two 3 hex 0011 two 7 hex 0111 two B hex 1011 two F hex 1111 two Παράδειγμα Μετάτρεψε τον ακόλουθο δεκαεξαδικό και δυαδικό αριθμό στην αντίστροφη βάση : eca8 6240 hex 0001 0011 0101 0111 1001 1011 1101 1111 two 7 Απάντηση eca8 6240 hex 1110 1100 1010 1000 0110 0100 two 0001 0011 0101 0111 1001 1011 1101 1111 two 1357 9bdf hex 8
Πρόσθεση και Αφαίρεση Τα ψηφία προσθέτονται ανά bit από τα δεξιά προς τα αριστερά. Τα κρατούμενα (carries) μεταφέρονται στο επόμενο ψηφίο στα αριστερά. Παράδειγμα Προσθέστε το 6 ten με το 7 ten και μετά αφαιρέστε το 6 ten από το 7 ten. Απάντηση 0111 two = 7 ten + 0110 two = 6 ten ------------------------------------------------------------------- 1101 two = 13 ten 9 Ηαφαίρεσητου6 ten απο το 7 ten μπορεί να γίνει απευθείας: 0111 two = 7 ten - 0110 two = 6 ten ------------------------------------------------------------------- 0001 two = 1 ten ή μπορεί να γίνει μέσω της πρόσθεσης χρησιμοποιώντας το συμπλήρωμα ως προς 2 (two s complement) του -6, 0111 two = 7 ten + 1111 1111 1111 1111 1111 1111 1111 1010 two = -6 ten ------------------------------------------------------------------ 0001 two = 1 ten 10
Υπάρχει ο κίνδυνος το άθροισμα των δύο 32 - bit αριθμών να είναι πολύ μεγάλο και να μην μπορεί να αναπαρασταθεί κανονικά από τα 32 bit. Το φαινόμενο αυτό ονομάζεται υπερχείλιση (overflow). H υπερχείλιση μπορεί επίσης να συμβεί και στην αφαίρεση. Για παράδειγμα, γιανααφαιρέσουμε2 από το -2,147,483,647 ten μετατρέπουμε το 2 σε -2 και το προσθέτουμε στο -2,147,483,647 ten. Κανονικά το αποτέλεσμα θα έπρεπε να ήταν -2,147,483,649 ten αλλά δεν μπορούμε να αναπαραστήσουμε αυτό το αποτέλεσμα σε 32 bits, έτσι παίρνουμε την λανθασμένη θετική τιμή του 2,147,483,647 ten. Η υπερχείλιση δεν μπορεί να συμβεί στη πρόσθεση δύο αριθμών με διαφορετικό πρόσημο και κατά συνέπεια δεν μπορεί να συμβεί ούτε στην αφαίρεση δυο αριθμών με το ίδιο πρόσημο. 11 Παράδειγμα Έστω ότι έχουμε μια μηχανή 5 + 5 =? των 4 bits Προσημασμένη αριθμητική 5 -> 0101 5 -> 0101 + 1010 overflow flag = 1 0 = 1 Αποτέλεσμα λάθος carry out flag = 0 sign flag = 1 zero flag = 0 (υποδηλώνει κατά πόσο το αποτέλεσμα δεν είναι μηδέν) 12
Στο πίνακα φαίνονται όλοι οι συνδυασμοί των λειτουργιών και των τελεστών που οδηγούν σε υπερχείλιση. Operation Operand A Operand B Result indicating an Overflow A + B >= 0 >= 0 < 0 A + B < 0 < 0 >= 0 A B >=0 < 0 < 0 A B < 0 >= 0 >= 0 Οι σχεδιαστές μηχανών πρέπει να βρουν ένα τρόπο που θα αγνοεί την υπερχείλιση σε κάποιες περιπτώσεις (π.χ. απρόσημους αριθμούς) και σε κάποιες άλλες να την αναγνωρίζει (π.χ. προσημασμένους αριθμούς). Η μηχανή MIPS έχει δύο είδη αριθμητικών εντολών για να αναγνωρίζει τις δύο επιλογές: Ηπρόσθεση(add), η add immediate (addi) και η αφαίρεση (sub) προκαλούν exceptions στην υπερχείλιση, δηλαδή αναγνωρίζεται. Η απρόσημη πρόσθεση (addu), η άμεση απρόσημη πρόσθεση (addiu) και η απρόσημη αφαίρεση (subu) δεν προκαλούν exceptions στην υπερχείλιση, δηλαδή δεν αναγνωρίζεται. 13 Λογικές Λειτουργίες ΗμηχανήMIPS παρέχει εντολές για επεξεργασία χαρακτήρων μέσα σε μια λέξη (32 bits). Μια ομάδα από τέτοιου είδους εντολές ονομάζονται μετακινήσεις (shifts). Αυτές οι εντολές μεταφέρουν όλα τα bits μιας λέξης στα αριστερά ή στα δεξιά, γεμίζοντας τα κενά με μηδενικά. Για παράδειγμα, αν ο καταχωρητής $16 περιέχει: 1101 και εκτελέσουμε την εντολή που μεταφέρει 8 bits αριστερά θα πάρουμε: 1101 14
Οι δύο εντολές μετακίνησης στον MIPS ονομάζονται λογική μετακίνηση προς τα αριστερά (shift left logical - sll) και λογική μετακίνηση προς τα δεξιά (shift right logical - srl). Αν θέλαμε να εκτελέσουμε την πιο πάνω λειτουργία, υποθέτοντας ότι το αποτέλεσμα θα αποθηκευτεί στο καταχωρητή $10, θα έχουμε: sll $10, $16, 8 # reg $10 + reg $16 << 8 bits H αναπαράσταση της πιο πάνω εντολής στη γλώσσα μηχανής θα είναι: Op rs Rt Rd Shamt funct 0 0 16 10 8 0 15 Μια άλλη εντολή που είναι χρήσιμη για απομόνωση πεδίων είναι η εντολή AND. H εντολή AND είναι μια bit προς bit λειτουργία που βάζει 1 στο αποτέλεσμα μόνο αν και τα δύο bits των τελεστών είναι 1. Αν για παράδειγμα ο καταχωρητής $9 περιέχει: 0011 1100 και ο καταχωρητής $10 περιέχει: 1101 1000 Μετά την εκτέλεση της εντολής, and $8, $9, $10 # reg $8 = reg $9 & reg $10 Η τιμή στο καταχωρητή $8 θα είναι: 1100 16
ΗεντολήOR είναι μια bit προς bit λειτουργία η οποία βάζει 1 στο αποτέλεσμα αν το bit οποιουδήποτε από τους τελεσταίους είναι 1. Αν για παράδειγμα έχουμε τους καταχωρητές $9 και $10 με τα ίδια περιεχόμενα όπως στο πιο πάνω παράδειγμα, το αποτέλεσμα της εντολής MIPS: or $8, $9, $10 # reg $8 = reg $9 reg $10 είναι το αποτέλεσμα στο καταχωρητή $8: 0011 1101 17 Οι λογικές εντολές στη γλώσσα C και MIPS. Logical Operations C Operators MIPS Instructions Shift Left Shift Right AND << >> & sll srl and, andi OR or, ori 18
Κατασκευή της αριθμητικής και λογικής μονάδας Η αριθμητική και λογική μονάδα είναι μια συσκευή που εκτελεί τις αριθμητικές λειτουργίες όπως πρόσθεση και αφαίρεση και τις λογικές εντολές όπως and και or στον υπολογιστή. Θα κατασκευάσουμε την ALU από τα τέσσερα κομμάτια υλικού που φαίνονται στο σχήμα 19 Επειδή οι λέξεις στον MIPS έχουν μέγεθος 32 bit, πρέπει και η ALU να έχει μέγεθος 32 bit. Ας υποθέσουμε ότι θα συνδέσουμε 32 ALU μεγέθους 1 bit ηκάθεμια. ALU του 1 bit Η ALU ενός bit λογική μονάδα για τις λειτουργίες AND και OR, απεικονίζεται πιο κάτω: Ο πολυπλέκτης στα δεξιά διαλέγει την λειτουργία a AND b ή a OR b, ανάλογα με την τιμή της Operation, αν είναι 1 ή 0. 20
Το επόμενο βήμα είναι να συμπεριλάβουμε και την λειτουργία της πρόσθεσης στο υλικό που κατασκευάζουμε. Ένας αθροιστής (adder) πρέπει να έχει δύο εισόδους για τους τελεσταίους και μια έξοδο 1 bit για το αποτέλεσμα (Sum). Μια δεύτερη έξοδος, CarryOut, μεταφέρει το κρατούμενο της πρόσθεσης αν υπάρχει. Αφού το CarryOut του γειτονικού αθροιστή πρέπει να συμπεριληφθεί ως είσοδος θα χρειαστούμε μια τρίτη είσοδο που θα ονομάσουμε CarryIn. Μπορούμε να εκφράσουμε τις συναρτήσεις εξόδου CarryOut και Sum ως λογικές εξισώσεις. 21 Ο πιο κάτω πίνακας δείχνει τις τιμές των εισόδων όταν το CarryOut είναι 1: Inputs a b CarryIn 0 1 1 1 0 1 1 1 0 1 1 1 Μπορούμε να μετατρέψουμε αυτόν τον αληθοπίνακα στην εξίσωση: CarryOut = (b. CarryIn) + (a. CarryIn) + (a. b) + (a. b. CarryIn) H οποία μετατρέπεται στην εξίσωση: CarryOut = (b. CarryIn) + (a. CarryIn) + (a. b) 22
To υλικό (hardware) του αθροιστή στο πιο κάτω σχήμα αποτελείται από τρεις πύλες AND και μια πύλη ΟR. Οι τρείς AND gates ανταποκρίνονται στις τρεις παρενθέσεις της πιο πάνω εξίσωσης για τον υπολογισμό του CarryOut και η πύλη OR αθροίζει τους τρεις όρους. 23 1-bit ALU η οποία εκτελεί τις λειτουργίες AND, OR, και πρόσθεσης 24
32-bit ALU φτιαγμένη από 32 1-bit ALU 25 Η 1-bit ALU ηοποίαεκτελεί τις λειτουργίες: AND, OR, και πρόσθεσης a+ b και a + NOT (b). Αφαίρεση μπορεί να γίνει με το να προσθέσουμε το Συμπλήρωμα του 2: Επιλέγουμε το Binvert και προσθέτουμε 1 (carryin=0 για το LSB) 26
Μετατροπή της 32-bit ALU για τον MIPS Το σύνολο εντολών add, subtract, AND, OR βρίσκεται στην ALU σε όλους σχεδόν τους υπολογιστές. Όλες σχεδόν οι εντολές του MIPS μπορούν να εκτελεστούν από την πιο πάνω ALU. Η εντολήset-on- less-than επιστρέφει 1 αν Rs < Rt, διαφορετικά επιστρέφει 0. Άρα η εντολή set on less than θα δώσει τιμή 0 σε όλα τα bits, εκτός από το least significant bit το οποίο θα πάρει τιμή ανάλογα με το αποτέλεσμα της σύγκρισης. Πρέπει να επεκτείνουμε τον πολυπλέκτη, γιαναδίνειμιατιμήγιατην σύγκριση less than, για κάθε bit στην ALU. 27 Ηκαινούρια1-bit ALU με τον επεκταμένο πολυπλέκτη. 28
Χρειαζόμαστε μια νέα ALU για το most significant bit που κάνει την έξοδο του αθροιστή διαθέσιμη για την πρόσθεση με το καθορισμένο αποτέλεσμα εξόδου (standard result output). Στο Σχήμα φαίνεται ο σχεδιασμός με αυτή την καινούρια έξοδο στον αθροιστή. Αφού χρειαζόμαστε μια καινούργια ALU για το most significant bit πρέπει να προσθέσουμε την τεχνική για ανίχνευση της υπερχείλισης (overflow), αφού σχετίζεται με αυτό το bit. Μια 1-bit ALU για το most significant bit. 29 Το Σχήμα δείχνει την τελική μορφή της 32 bit ALU. Προσέξτε ότι κάθε φορά που θέλουμε η ALU να εκτελέσει την λειτουργία της αφαίρεσης, το CarryIn και το Binvert παίρνουν τιμή 1. Για την πρόσθεση ή τις λογικές λειτουργίες θέλουμε και οι δύο γραμμές ελέγχου να έχουν τιμή 0. Άρα μπορούμε να απλοποιήσουμε την σχεδίαση της ALU, ενώνοντας την CarryIn και Binvert σε μια γραμμή που θα ονομάζεται Bnegate. 30
ALUγια την μηχανή MIPS πρέπει επίσης να υποστηρίζει τις εντολές διακλάδωσης υπό συνθήκη (conditional branch). Αυτές οι εντολές διακλαδώνονται αν τα περιεχόμενα των δύο καταχωρητών είναι ίσα ή αν δεν είναι ίσα. ΟπιοεύκολοςτρόποςγιαέλεγχοτηςισότηταςμετηνALU είναι να αφαιρέσεις τα περιεχόμενα του ενός καταχωρητή από τον άλλο και μετά να ελέγξεις αν το αποτέλεσμα είναι ίσο με μηδέν. Πρέπει να προσθέσουμε υλικό που θα ελέγχει αν η έξοδος είναι ίση με μηδέν. Αυτό μπορεί να γίνει με μια OR πύλη η οποία θα μαζεύει όλες τις εξόδους. 31 Ητελική32 bit ALU 32
ALU Control lines 000 001 010 110 111 Function And Or Add Subtract Set-on-lessthan Οι τιμές των τριών γραμμών ελέγχου της ALU, Bnegate και Operation και η αντίστοιχη ALU λειτουργία. 33 Στο σχήμα φαίνεται ο παγκόσμιος συμβολισμός για την ολοκληρωμένη ALU. Οι τρεις γραμμές λειτουργίας της ALU που αποτελούνται από τους συνδυασμούς της 1-bit Bnegate γραμμής και της 2-bit γραμμής λειτουργίας (operation line), κάνουν την ALU να παράγει τις επιθυμητές πράξεις: πρόσθεση, αφαίρεση, AND, OR, set on less than. 34
Πολλαπλασιασμός Ο multiplier βρίσκεται σε ένα 32-bit Multiplier καταχωρητή ενώ ο multiplicand βρίσκεται στο Multiplicand καταχωρητή που είναι 64-bit και το γινόμενο τοποθετείται στο καταχωρητή Product, είναι 64-bit και αρχικά έχει τιμή 0. Η πρώτη έκδοση του υλικού του πολλαπλασιασμού 35 Ο πρώτος αλγόριθμος πολλαπλασιασμού 1000ten 1001ten ----------------------------------- 1000 1000 ---------------------- 100 36
Παράδειγμα Χρησιμοποιώντας 4-bit αριθμούς πολλαπλασιάστε το 2 * 3 ( * 0011) Iteration Step Multiplier Multiplicand Product 0 Initial values 0011 1a: 1=>Prod=Prod+Mcand 0011 1 2: Shift left Multiplicand 0011 0100 3: Shift right Multiplier 0001 0100 1a: 1=>Prod=Prod+Mcand 0001 0100 0110 2 2: Shift left Multiplicand 0001 1000 0110 3: Shift right Multiplier 1000 0110 1: 0=>no operation 1000 0110 3 2: Shift left Multiplicand 0001 0110 3: Shift right Multiplier 0001 0110 1: 0=>no operation 0001 0110 4 2: Shift left Multiplicand 0110 3: Shift right Multiplier 0110 37 Πιο γρήγορος Πολλαπλασιασμός Ο Νόμος του Moore δίνει την δυνατότητα στους σχεδιαστές να δημιουργούν πιο γρήγορο MULT με την χρήση πιο πολλών κυκλωμάτων Στον σειριακό MULT έχουμε το κόστος του κύκλου για κάθε add. Η χρήση μεγάλου αριθμού ADDers μας δίνει την δυνατότητα να εφαρμόσουμε πολλές βελτιστοποίησης Carry Bit + 31 Bits LSB 38
* 0011 = 00110 Mplier1 Mcand 1 0011 Mplier0 Mcand 0 0011 Mplier2 Mcand 0 1 001 Mplier2 Mcand 0 1 000 000 1 Carry Bit + 31 Bits LSB 000110 3 2 1 0 39 0 3 0 2 1 1 1 0 00011 * = 01001 Mplier1 Mcand 1 1 0011 Mplier0 Mcand 1 0 0001 1 010 0 0 2 Mplier2 Mcand 0011 001 0 Carry Bit + 31 Bits Mplier2 Mcand 0 3 0011 0001 LSB 0001 1 0001 3 2 1 0 40
Πρώτη επανάληψη αλγόριθμου διαίρεσης Ο καταχωρητής Divisor, η ALU και ο καταχωρητής Remainder είναι 64-bits, ενώ ο καταχωρητής Quotient είναι 32-bits. Ο 32-bits divisor ξεκινά από το αριστερό μισό του καταχωρητή Divisor και μετακινείται δεξιά 1bitκάθε φορά. O Remainder παίρνει αρχική τιμή με τον dividend. Η μονάδα ελέγχου αποφασίζει πότε θα μετακινήσει τους καταχωρητές Divisor και Quotient και πότε θα γράψει την νέα τιμή στο καταχωρητή Remainder. Η πρώτη έκδοση υλικού της διαίρεσης 41 Initial value = Divisor + 32 zeros Initial value = 0 Initial value = dividend Ο πρώτος αλγόριθμος διαίρεσης 42
Παράδειγμα Διαιρέστε το 7 / 2 ( 0111 / ) Iteration 0 1 2 3 4 5 Step Initial values 1: Rem=Rem-Div 2b: Rem < 0 => +Div,sll Q,Q0 = 0 3: Shift Div right 1: Rem=Rem-Div 2b: Rem < 0 => +Div,sll Q,Q0 = 0 3: Shift Div right 1: Rem=Rem-Div 2b: Rem < 0 => +Div,sll Q,Q0 = 0 3: Shift Div right 1: Rem=Rem-Div 2a: Rem 0 => sll Q,Q0 = 1 3: Shift Div right 1: Rem=Rem-Div 2a: Rem 0 => sll Q,Q0 = 1 3: Shift Div right Quotient 0001 0001 0001 0011 0011 Divisor 0001 0001 0001 1000 1000 1000 0100 0100 0100 0001 Remainder 0111 1110 0111 0111 0111 1111 0111 0111 0111 1111 1111 0111 0111 0011 0011 0011 0001 0001 0001 43 Πράξεις κινητής υποδιαστολής Για πρακτικούς λόγους είναι καλύτερα οι αριθμοί κινητής υποδιαστολής (floating point numbers) να έχουν μέγεθος μια λέξη. Πιο κάτω φαίνεται η αναπαράσταση ενός αριθμού κινητής υποδιαστολής στον MIPS, s: πρόσημο του συγκεκριμένου αριθμού (1 για αρνητικό), exponent: τιμή του 8- Bit exponent πεδίου (συμπεριλαμβανομένου τουπρόσημουτου exponent) significant είναι ο 23-bit αριθμός μέσα στο fraction. Αυτή η αναπαράσταση ονομάζεται sign and magnitude representation. 22 21 20 19 18 31 30 29 28 27 26 25 24 s exponent 1 bit 8 bits 17 16 15 14 13 12 11 10 9 Significant 23 8 7 6 5 4 3 2 1 0 23 bits 44
Γενικά οι αριθμοί υποδιαστολής είναι της μορφής (-1) s x F x 2 E F είναι η τιμή του significant πεδίου Ε είναι η τιμή του exponent πεδίου. Τα μικρότερα κλάσματα (fractions) που μπορούν να αναπαρασταθούν από τον υπολογιστή είναι μεγέθους 2.0 x 10-38 Οι Μεγαλύτεροι αριθμοί που μπορούν να αναπαρασταθούν είναι μεγέθους 2.0x10 38. Η υπερχείλιση εδώ σημαίνει ότι ο exponent είναι πολύ μεγάλος για να μπορέσει να αναπαρασταθεί από το πεδίο exponent. Αν ο αρνητικός exponent είναι πολύ μεγάλος για να αναπαρασταθεί από το exponent πεδίο, έχουμε το φαινόμενο underflow. Το fraction που πρέπει να υπολογιστεί είναι τόσο μικρό που δεν μπορεί να αναπαρασταθεί. Για να ελαττωθούν οι περιπτώσεις υπερχείλισης ή underflow, πολλές γλώσσες προγραμματισμού παρέχουν μια γραφή (notation) με μεγάλο exponent. Στην C ονομάζεται double και οι λειτουργίες με doubles ονομάζονται double precision floating-point arithmetic. 45 Στον MIPS οι double precision λειτουργίες επιτρέπουν την αναπαράσταση αριθμών 2.0 x 10 308 μέχρι 2.0 x 10-308. Ηαναπαράστασηενόςdouble precision αριθμού κινητής υποδιαστολής έχει μέγεθος δύο λέξεις στη μηχανή MIPS, όπως φαίνεται πιο κάτω, όπου s είναι το πρόσημο του αριθμού, exponent είναι η τιμή του 11-bit πεδίου exponent και significant είναι ο 52-bit αριθμός μέσα στο fraction. 63 62 61 60 59 58 57 56 s exponent 1 bit 11 bits 55 54 53 52 51 50 49 significant 52 bits Η γενική αναπαράσταση για τους floating point αριθμούς είναι: (-1) s x (1 + significant) x 2 (exponent bias) 3 2 1 0 O exponent bias για single precision αριθμούς είναι 127 και για double precision αριθμούς είναι 1023. 46
Παράδειγμα Δείξτε την δυαδική αναπαράσταση της IEEE 754 για τον αριθμό -0,75 σε single και double precision. Απάντηση Οαριθμός-0,75 γράφεται επίσης ως -3/4 ή -3/2 2. Μπορεί επίσης να αναπαρασταθεί από το fraction -1.5/2 =-1,1 2 x 2-1. H γενική αναπαράσταση ενός single precision αριθμού είναι: (-1) s x (1 +.1000 000 two ) x 2 (126-127) H single precision δυαδική αναπαράσταση του -0,75 είναι: 31 1 30 29 28 27 26 25 24 23 0 1 1 1 1 1 1 0 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 47 Η double precision αναπαράσταση είναι: (-1) 1 x (1 +,1000 two ) x 2 (1022-1023) 63 1 62 61 60 59 58 57 56 55 54 53 52 0 1 1 1 1 1 1 1 1 1 0 51 50 49 3 2 1 0 1 0 0 0 0 0 0 - Παράδειγμα: Ποιόν δεκαδικό αριθμό αναπαριστά η πιο κάτω λέξη; 31 1 30 29 28 27 26 25 24 23 1 0 0 0 0 0 0 1 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 48
Απάντηση Το bit πρόσημου (sign bit) είναι 1, το πεδίο exponent περιέχει το 129 και το significant πεδίο περιέχει το 1 x 2-2 = ¼ h 0,25. Χρησιμοποιώντας την βασική εξίσωση: (-1) s x (1 + significant) x 2 (exponent bias) = (-1) 1 x (1 + 0,25) x 2 (129-127) = -1 x 1,25 x 2 2 = -1,25 x 4 = -5 49 Πρόσθεση κινητής υποδιαστολής Ας προσπαθήσουμε να προσθέσουμε τους αριθμούς 9,999 x 10 1 + 1,610 x 10-1. Υποθέστε ότι μόνο τέσσερα ψηφία του significant μπορούν να αποθηκευτούν και μόνο δύο δεκαδικά ψηφία από τον exponent. Δίνεται ο πιο κάτω αλγόριθμος. Αλγόριθμος Βήμα 1: Ο significant του μικρότερου αριθμού πρέπει να μετακινηθεί δεξιά μέχρι ο exponent να ταιριάζει με αυτόν του μεγαλύτερου αριθμού. Δηλαδή, 1,610 x 10-1 = 0,1610 x 10 0 = 0,01610 x 10 1, όμως μόνο τέσσερα δεκαδικά ψηφία μπορούν να αναπαρασταθούν, άρα ο μετακινημένος αριθμός θα είναι: 0,016 x 10 1 50
Βήμα 2: Μετά θα γίνει η πρόσθεση των significant 9,999 + 0,016 10,015 Άρα το άθροισμα είναι 10,015 x 10 1. Βήμα 3: Μετά την πρόσθεση πρέπει να μετακινήσουμε το άθροισμα για να φέρουμεσεκανονικήμορφή, κανονικοποιώντας τον exponent. Όταν αυξάνουμε ή μειώνουμε τον exponent πρέπει να ελέγχουμε αν υπάρχει υπερχείλιση ή Underflow. Στο συγκεκριμένο παράδειγμα θα έχουμε: 10,015 x 10 1 = 1,0015 x 10 2. Βήμα 4: Αφού υποθέσουμε ότι ο significant μπορεί να έχει μέγεθος μέχρι 4 ψηφία, τότε πρέπει να στρογγυλοποιήσουμε τον αριθμό. Δηλαδή, το ψηφίο στα δεξιά είναι μεταξύ του 0 και 4 τότε το αγνοούμε, αν είναι μεταξύ του 5 και του 9 τότε προσθέτουμε ένα στο συγκεκριμένο ψηφίο. Ο αριθμός 1,0015 x 10 2, μετατρέπεται στον αριθμό 1,002 x 10 2. 51 Βήμα 1: 1,610 x 10-1 = 0,1610 x 10 0 = 0,01610 x 10 1 Βήμα 2: 9,999 + 0,016 10,015 Βήμα 3: 10,015 x 10 1 = 1,0015 x 10 2. Βήμα 4: 1,002 x 10 2. Αλγόριθμος πρόσθεσης κινητής υποδιαστολής 52
53 Πολλαπλασιασμός κινητής υποδιαστολής Ας προσπαθήσουμε να πολλαπλασιάσουμε τους αριθμούς 1,110 x 10 10 x 9,100 x 10-5. Υποθέστε ότι μόνο τέσσερα ψηφία του significant μπορούν να αποθηκευτούν και μόνο δύο δεκαδικά ψηφία από τον exponent. Αλγόριθμος Βήμα 1: Υπολογίζουμε τον exponent του γινομένου προσθέτοντας απλά exponents των τελεσταίων: Νέος exponent: 10 + (-5) = 5 Ας κάνουμε την ίδια διαδικασία με τα biased exponent για να σιγουρευτούμε ότι θα πάρουμε το ίδιο αποτέλεσμα. 10 + 127 = 137 και -5 + 127 = 122, άρα, τους Νέος exponent: 137 + 122 = 259 Αυτό το αποτέλεσμα όμως είναι πολύ μεγάλο, αυτό είναι το πρόβλημα με την πρόσθεση των biases. Μπορούμε να πάρουμε το σωστό άθροισμα αν αφαιρέσουμε το άθροισμα των biased αριθμών από το άθροισμα: Νέος exponent: 137 + 122 127 = 259 127 = 132 = ( 5+ 127 ). 54
Βήμα 2: Μετά θα γίνει ο πολλαπλασιασμός των significants 1,110 x 9,200 2220 9990. 10212000 Υπάρχουν τρία ψηφία από δεξιά του δεκαδικού για κάθε τελεστή, άρα το δεκαδικό σημείο (τελεία) τοποθετείτε έξι ψηφία από τα δεξιά στον significant του γινομένου: 10,212000 Υποθέτοντας ότι μπορούμε να κρατήσουμε μόνο τρία ψηφία στα δεξιά του δεκαδικού σημείου, το γινόμενο είναι: 10,212 x 10 5. 55 Βήμα 3: Πρέπει να γίνει κανονικοποίηση του γινομένου. Δηλαδή, 10,212 x 10 5 = 1,0212 x 10 6. Άρα μετά τον πολλαπλασιασμό, το γινόμενο πρέπει να μετακινηθεί δεξιά ένα ψηφίο και να προστεθεί ένα στον exponent. Σε αυτό το σημείο μπορούμε να ελέγξουμε για υπερχείλιση ή underflow (υπορροή). Βήμα 4: Αφού υποθέσουμε ότι ο significant μπορεί να έχει μέγεθος μέχρι τέσσερα ψηφία, τότε πρέπει να στρογγυλοποιήσουμε τον αριθμό. Ο αριθμός, 1,0212 x 10 6, μετατρέπεται στον αριθμό, 1,021 x 10 6. Βήμα 5: Το πρόσημο του γινομένου εξαρτάται από τα πρόσημα των αρχικών τελεσταίων. Αν είναι τα ίδια και τα δύο τότε το πρόσημο είναι θετικό, διαφορετικά είναι αρνητικό. Άρατογινόμενοθαείναι: +1,021 x 10 6. 56
Αλγόριθμος πολλαπλασιασμού κινητής υποδιαστολής 57 Ενότητα 4 - Αριθμητική για υπολογιστές 58 Ενότητα 4 - Αριθμητική για υπολογιστές
59 Επιπρόσθετο Υλικό 60
Δεύτερη επανάληψη του αλγόριθμου πολλαπλασιασμού Τα μισά από τα bits του multiplicand στον πρώτο αλγόριθμο είναι πάντα 0, άρα μόνο τα μισά στοιχεία που περιέχει ο multiplicand είναι χρήσιμες πληροφορίες. Η 64-bit ALU είναι αργή και πιο μεγάλη από ότι χρειάζεται αφού τα μισά από τα Bits του adder προσθέτουν 0 στο άθροισμα. Η δεύτερη έκδοση υλικού για το πολλαπλασιασμό 61 Οδεύτεροςαλγόριθμος πολλαπλασιασμού 62
Παράδειγμα: 2 * 3 ( * 0011) Iteration Step Multiplier Multiplicand Product 0 Initial values 0011 1a: 1=>Prod=Prod+Mcand 0011 1 2: Shift right Product 0011 0001 3: Shift right Multiplier 0001 0001 1a: 1=>Prod=Prod+Mcand 0001 0011 2 2: Shift right Product 0001 0001 1000 3: Shift right Multiplier 0001 1000 1: 0=>no operation 0001 1000 3 2: Shift right Product 1100 3: Shift right Multiplier 1100 1: 0=>no operation 1100 4 2: Shift right Product 0110 3: Shift right Multiplier 0110 63 Τελική επανάληψη του αλγόριθμου πολλαπλασιασμού Ο καταχωρητής Register αφήνει αχρησιμοποίητο χώρο ακριβώς όσο είναι το μέγεθος του multiplier. Άρα στη τελευταία έκδοση του αλγόριθμου πολλαπλασιασμού το δεξιότερο μισό του γινόμενου ενώνεται με τον multiplier. Η Τρίτη έκδοση του υλικού του πολλαπλασιασμού 64
Ο τρίτος αλγόριθμος πολλαπλασιασμού 65 Παράδειγμα: 2 * 3 ( * 0011) Iteration Step Multiplicand Product 0 Initial values 0011 1a: 1=>Prod=Prod+Mcand 0011 1 2: Shift right Product 0001 0001 1a: 1=>Prod=Prod+Mcand 0011 0001 2 2: Shift right Product 0001 1000 1: 0=>no operation 0001 1000 3 2: Shift right Product 1100 1: 0=>no operation 1100 4 2: Shift right Product 0110 66
Δεύτερη επανάληψη αλγόριθμου διαίρεσης Μόνο ο μισός χώρος του Divisor περιέχει χρήσιμες πληροφορίες, έτσι τόσο ο divisor όσο και η ALU μπορούν να χωριστούν στη μέση. Η μετακίνηση του Remainder αριστερά αντί για την μετακίνηση του Divisor στα δεξιά, παράγει την ίδια ευθυγράμμιση, και πετυχαίνει τον σκοπό της απλοποίησης υλικού για την ALU και τον Divisor. Η δεύτερη έκδοση υλικού της διαίρεσης 67 Τελευταία επανάληψη αλγόριθμου διαίρεσης Ο καταχωρητής Quotient μπορεί να αφαιρεθεί αν μετακινήσουμε τα bits του Quotient στον καταχωρητή Remainder. Η τελευταία έκδοση υλικού της διαίρεσης 68
Ο τελικός αλγόριθμος διαίρεσης 69 Παράδειγμα 7 / 2 ( 0111 / ) Iteration Step Divisor Remainder 0 Initial values Shift Rem left 1 0111 1110 1 2: Rem = Rem Div 3b: Rem < 0 => + Div, sll R, R0 = 0 1110 1110 0001 1100 2 2: Rem = Rem Div 3b: Rem < 0 => + Div, sll R, R0 = 0 1111 1100 0011 1000 3 2: Rem = Rem Div 3a: Rem 0 => sll R, R0 = 1 0001 1000 0011 0001 4 2: Rem = Rem Div 3a: Rem 0 => sll R, R0 = 1 0001 0001 0011 Shift left half of Rem right 1 0001 0011 70