Transcript Document

Architektura systemów komputerowych
(jesień 2014)
Wykład 2
Reprezentacja danych część 2
dr inż. Wojciech Bieniecki
Instytut Nauk Ekonomicznych
i Informatyki
http://wbieniec.kis.p.lodz.pl/pwsz
Nadmiar i niedomiar U2
W trakcie wykonywania działań arytmetycznych wynik operacji może przekroczyć
dozwolony zakres liczb zarówno powyżej górnej granicy (nadmiar) jak i poniżej
dolnej (niedomiar). Sytuacja objawia się nieoczekiwaną zmianą znaku.
0111
+ 0001
------1000
7(10)
+1(10)
-----8(10)
liczba 8 będąca sumą 7 i 1 wykracza poza górny zakres wartości 4 bitowego kodu U2
1010
+ 1101
------10111
-6(10)
+-3(10)
--7(10)
2
Nadmiar i niedomiar w U2
Wystąpienie nadmiaru lub niedomiaru wskazuje że programista źle dobrał typ
danych dla przetwarzanej informacji. Najprostszym rozwiązaniem jest zwiększenie
długości formatu U2 (np. z 16 bitów na 32 bity).
Reguły powstawania nadmiaru i niedomiaru przy różnych operacjach arytmetycznych na liczbach w
kodzie U2. Tabela zawiera stany bitów znakowych.
Operacja
Dodawanie
Odejmowanie
Mnożenie i dzielenie
Pierwszy Drugi
Wynik
argument argument
0
0
1
1
1
0
0
1
1
1
0
0
0
0
1
1
1
1
0
1
0
1
0
0
3
Mnożenie dwójkowe
Do wykonywania mnożenia
niezbędna jest znajomość tabliczki
mnożenia dwójkowego, czyli
wyników mnożenia każdej cyfry z
każdą inną:
0
0
1
1




0
1
0
1
=
=
=
=
0
0
0
1
Pomnożyć binarnie liczbę 1101(2) przez 1011(2)

1101 = 13
(10)
1011 = 11
(10)
1101
1101
0000
1101
Zwróć uwagę, iż wynikiem mnożenia mnożnej
przez cyfrę mnożnika jest powtórzenie
mnożnej z przesunięciem o pozycję cyfry (cyfra
mnożnika 1) lub same zera (cyfra mnożnika 0).
Spostrzeżenie to bardzo ułatwia konstrukcję
układów mnożących.
4
Mnożenie dwójkowe
Puste kolumny uzupełniamy zerami
i dodajemy do siebie wszystkie
cyfry w kolumnach.
Uważaj na przeniesienia

1101 = 13
1011 = 11
(10)
(10)
00001101
00011010
00000000
+ 01101000
10001111= 143
(10)
5
Mnożenie dwójkowe – dalsze
przykłady
1
×
1
1
1 0
+ 1 0 1
1 0 0 0
0 1
1 1
0 1
1
1 1
1 0
×
1
0 0
1 0 1
+ 1 0 1 1
1 0 0 0 0
1 1
1 0
0 0
1
1 0
1
×
1
1
1 1
+ 1 1 1
1 1 0 0
1 1
1 1
1 1
1
0 1
Uwaga:
Z uwagi na ustalone formaty danych binarnych w komputerach (8, 16 i 32
bity) mnożenie również może dawać niepoprawne rezultaty, gdy wynik będzie
większy od górnego zakresu liczb dla danego formatu, czyli od
max = 2n - 1, gdzie n - liczba bitów w danym formacie
6
Dzielenie dwójkowe
Algorytm szkolny polega na cyklicznym odejmowaniu odpowiednio
przesuniętego dzielnika od dzielnej.
W systemie dwójkowym jest to szczególnie proste, ponieważ
dzielnika nie musimy mnożyć
Przykład:
Podzielmy liczbę 1101(2) przez 10(2) (13(10) : 2(10)).
1. Przesuwamy w lewo dzielnik, aż zrówna się
jego najstarszy, niezerowy bit z najstarszym,
niezerowym bitem dzielnej. Nad dzielną
rysujemy kreseczkę:
2. Porównujemy dzielną z dzielnikiem. Jeśli
dzielna jest większa lub równa dzielnikowi,
to odejmujemy od niej dzielnik. Ponad
kreską na pozycji ostatniej cyfry dzielnika
piszemy 1.
1101
- dzielna
10
- przesunięty dzielnik
1
- pierwsza cyfra wyniku dzielenia
1 1 0 1 - dzielna
- 1 0
- przesunięty dzielnik
0 1 0 1 - wynik odejmowania
7
Dzielenie dwójkowe
3. Dzielnik przesuwamy o jeden bit w prawo i próbujemy tego samego z
otrzymaną różnicą.
1
1
0
1
1
0
1
- 1
0
0
0 0
1 0 - wynik dzielenia = 6(10)
0 1 - dzielna
- przesunięty dzielnik
0
0
0
1
0
1 - dzielna po pierwszym odejmowaniu przesuniętego dzielnika
- przesunięty dzielnik
1 - dzielna po drugim odejmowaniu przesuniętego dzielnika
0 - dzielnik na swoim miejscu, odejmowanie niemożliwe
1 - reszta z dzielenia
a) Jeśli odejmowanie jest możliwe, to nad kreską w następnej kolumnie
dopisujemy 1, odejmujemy dzielnik od różnicy, przesuwamy go o 1 bit w prawo i
kontynuujemy.
b) Jeśli odejmowanie nie jest możliwe, to dopisujemy nad kreską 0, przesuwamy
8
dzielnik o 1 bit w prawo i kontynuujemy.
Dzielenie dwójkowe - wprawka
Podzielić liczbę 110101101(2) przez 111(2) (429(10) przez 7(10)):
0111101
110101101 : 111
111
- nie da się odjąć, nad kreską 0
110101101
111
- da się odjąć, nad kreską 1
11001101
111
- da się odjąć, nad kreską 1
1011101
111
- da się odjąć, nad kreską 1
100101
111
- da się odjąć, nad kreską 1
1001
111 - nie da się odjąć, nad kreską 0
1001
111 - da się odjąć, nad kreską 1, koniec
10 - reszta z dzielenia
9
Mnożenie liczb w kodzie U2
Przed wykonaniem tej operacji arytmetycznej musimy rozszerzyć znakowo obie
mnożone liczby tak, aby ich długość (liczba bitów) wzrosła dwukrotnie.
Rozszerzenie znakowe polega na powielaniu bitu znaku na wszystkie dodane bity.
Jeżeli liczby są różnej długości, to rozszerzamy znakowo względem dłuższej liczby.
0111(U2) = 00000111(U2) - rozszerzyliśmy znakowo liczbę 4 bitową do 8 bitowej
1011(U2) = 11111011(U2) - to samo dla liczby ujemnej
Rozszerzenie znakowe nie zmienia wartości liczby w kodzie U2. Po wykonaniu
rozszerzenia znakowego liczby mnożymy standardowo.
10
Mnożenie w kodzie U2
Przykład:
Pomnóżmy (-2) × 3:
-2 = 1110(U2) = 11111110(U2)
3 = 0011(U2) = 00000011(U2)
x
11111110
00000011
+
011111110
111111100
1011111010
??
Wynik mnożenia może być liczbą o długości równej sumie długości mnożonych
liczb. Dlatego bity wykraczające w naszym przykładzie poza 8 bitów ignorujemy.
11111010(U2) = -6(10)
11
Dzielenie liczb w kodzie U2
Najprostszym rozwiązaniem jest zapamiętanie znaków dzielonych liczb, zamiana
ich na liczby dodatnie, dokonanie dzielenia dla liczb naturalnych, a następnie
zmiana znaku wyniku, jeśli znaki dzielnej i dzielnika różnią się.
6 = 0110(U2)
-3 = 1101(U2) - zmieniamy na 3 = 0011(U2)
Dzielimy liczbę 0110 przez 0011
10
0110:0011
-0110
0000
Otrzymaliśmy wynik 0010 (liczba 2).
Znaki dzielnej i dzielnika są różne
Zmieniamy wartość na przeciwną: 1110(U2) = (-2).
12
Dzielenie w kodzie U2
Jeśli w trakcie dzielenia otrzymamy resztę, to musi ona mieć ten sam znak, co
dzielna.
Reguły znaków przy dzieleniu liczb
całkowitych
Dzielna
Dzielnik
Wynik
Reszta
0
0
0
0
0
1
1
0
1
0
1
1
1
1
0
1
13
Mnożenie w rejestrach procesora
Metoda przesuń i dodaj
X (mnożna)
Y (mnożnik)
stosuje się układ rejestrów
podłączonych do
sumatora binarnego
Rejestr Q zawiera X,
rejestr M zawiera Y.
Rejestr A jest połączony z Q i rejestrem S. Rejestry M, A, Q są n-bitowe. Rejestr S jest 1bitowy. Rejestr SAQ przechowuje wynik końcowy i częściowe wyniki w trakcie mnożenia.
Dodaj Y do siebie tyle razy, ile wynosi X. Zawartość M jest dodawana do A dla kolejnych
jedynek w X w rejestrze Q, począwszy od bitu najmniej znaczącego, z przesuwaniem całego
rejestru SAQ o jedną pozycję w prawo po każdym dodaniu M oraz po każdym wykryciu
zerowego bitu mnożnika na zerowej pozycji rejestru Q.
Otrzymany wynik ma podwójną liczbę bitów w porównaniu z argumentami mnożenia. 14
Mnożenie – przesuń i dodaj
A=0; S=0;
// Inicjalizacja A i S.
M=Y;
// Wprowadzenie mnożnej do M.
Q=X;
// Wprowadzenie mnożnika do Q.
if (Q(n -1)= "1" // Jeśli mnożnik jest ujemny, zastąp M i Q
{
M= - M;
// przez ich uzupełnienia do 2,
Q = -Q;
// wtedy Q zawsze będzie dodatni.
}
S = M(n-1);
// Wprowadzenie znaku M do S.
15
Mnożenie – przesuń i dodaj
for i in 1 to n
{
if(Q(0) = "1"
{
A = M + A;
// Dodanie M do A Q razy.
}
for j in 1 to 2n
{
SAQ(j-1) = SAQ (j); //Przesunięcie SAQ o 1 pozycje w prawo,
} //bez zmiany znaku S.
}
16
Mnożenie – przesuń i dodaj
Pomnóż X = 01010 przez Y = 11001 czyli 10(10)  -7(10).
S
A
Q
0
00000 01010 przesuń w prawo
0
00000 00101 dodaj M do A
1
11001 00101 przesuń w prawo
1
11100 10010 przesuń w prawo
1
11110 01001 dodaj M do A
1
10111 01001 przesuń w prawo
1
11011 10100 przesuń w prawo
1
11101 11010
Operacja do wykonania
Wynik 1110111010 czyli -70(10).
17
Mnożenie metodą Booth'a/Wallace'a
Metoda Booth'a/Wallace'a jest szybka – wykorzystuje równoległe przetwarzanie danych
Wykorzystuje się wiele równolegle pracujących układów mnożących mnożną przez trójki
bitów mnożnika metodą Booth'a.
Wiele równolegle
pracujących układów
sumatorów
ustawionych w
strukturę drzewa
Wallace'a
18
Metoda Bootha
19
CSA i CLA
W strukturze drzewa Wallace'a wykorzystane są specjalne sumatory
trójargumentowe z pamiętaniem przeniesień (CSA - Carry Save Adder), które
pozostawiają wynik dodawania w postaci dwu słów: słowa bitów sumy i słowa
bitów przeniesień.
Takie sumatory działają bardzo szybko, gdyż całkowicie wyeliminowane jest w nich
propagowanie przeniesień a bity słowa przeniesień są generowane bardzo szybko
na podstawie jedynie trójek bitów na argumentów na kolejnych pozycjach.
20
CSA i CLA
Na końcu serii dodawań, gdzie chcemy wynik sprowadzić do postaci
jednego słowa, stosowany jest sumator z przeniesieniami
jednoczesnymi (CLA - Carry Look-Ahead Adder).
21
Metoda macierzowa
Formułę mnożenia argumentów binarnych wyrażonych jako sumy iloczynów
wartości bitów i wag na poszczególnych pozycjach w zapisie uzupełnień do 2,
można sprowadzić, poprzez odpowiednie grupowanie wyrazów i wprowadzenie
negacji bitów, do postaci, która stanowi podstawę dla zbudowania macierzowego
(matrycowego) układu mnożącego zbudowanego z sumatorów elementarnych (1bitowych).
W matrycy elementarnych sumatorów występuje tyle wierszy sumatorów ile
bitów maja mnożone liczby.
Na wejścia początkowej warstwy sumatorów elementarnych oraz na wejścia
przeniesień w niższych warstwach, wprowadzane są odpowiednie iloczyny
logiczne bitów mnożnika i mnożnej (proste lub zanegowane).
Wyniki elementarnych sumowań (bity sumy i przeniesień) są podawane na
wejścia sumatorów w niższych warstwach lub stanowią bity wyniku iloczynu, w
zależności od pozycji danego sumatora w matrycy.
22
Mnożenie metodą macierzową
23
Formaty liczb niecałkowitych
format słowa - budowę słowa z pól bitowych i ich przeznaczenie
Obliczenia pojedynczej precyzji: liczba jest zapisana w jednym słowie komputera
wielokrotna precyzja obliczeń: do zapisu liczby wykorzystuje się dwa lub więcej
słów
formaty zapisu liczb
stałoprzecinkowy
zmiennoprzecinkowy
24
Format stałoprzecinkowy
Unikalną reprezentacją liczby o wartości L jest zbiór
cyfr {an-1,… ,a1,a0,a-1, … , a-m} takich, że
25
Przykład obliczania wartości
Obliczyć wartość dziesiętną liczby stałoprzecinkowej 213,132(4)
213,132(4)
= 2×42 + 1×41 + 3×40 + 1×4-1 + 3×4-2 + 2×4-3
= 2×16 + 1×4 + 3×1 + 1×1/4 + 3×1/16 + 2×1/64
= 39
30/
64
Obliczyć wartość dziesiętną liczby stałoprzecinkowej 537,462(8)
537,462(4)
= 5×82 + 3×81 + 7×80 + 4×8-1 + 6×8-2 + 2×8-3
= 5×64 + 3×8 + 7 + 4×1/8 + 6×1/64 + 2×1/512
= 1311,59765625
26
Przykłady obliczania wartości
Znaleźć rozwinięcie dziesiętnej liczby 128/9 na system trójkowy
z dokładnością do dwóch miejsc po przecinku.
w ← 12 8/9 x 32 = 12 8/9 x 9 = 116 (mnożymy przez podstawę podniesioną do odpowiedniej
potęgi)
w ← 116 div 3 = 38 i reszta 2
w ← 38 div 3 = 12 i reszta 2
w ← 12 div 3 = 4 i reszta 0
w ← 4 div 3 = 1 i reszta 1
w ← 1 div 3 = 0 i reszta 1 (koniec)
Otrzymaliśmy kolejne cyfry 11022.
Dwie ostatnie cyfry umieszczamy po
przecinku.
12 8/9 = 110,22(3)
27
Przykład obliczania wartości
Znaleźć zapis dziesiętnej liczby 1/10 w systemie dwójkowym z
dokładnością do 8 miejsc po przecinku.
w ← 1/10 x 28 = 1/10 x 256 = 256/10 = 26 (zaokrąglamy do najbliższej wartości całkowitej)
26 div 2 = 13 i reszta 0
13 div 2 = 6 i reszta 1
6 div 2 = 3 i reszta 0
3 div 2 = 1 i reszta 1
0.00011010
28
Skala obliczeń
Skalowanie polega na pomnożeniu wszystkich liczb uczestniczących w obliczeniu przez stały
współczynnik równy p-k, gdzie p jest podstawą systemu liczbowego a k nazywa się skalą
obliczeń.
skalowanie powoduje zmianę miejsca przecinka w zapisach liczbowych argumentów przed
wykonaniem stałoprzecinkowych operacji arytmetycznych.
Pomnożenie liczby binarnej przez 2-k , k ¹ 0 powoduje
a) przesunięcie przecinka binarnego o k pozycji w lewo, jeśli k jest całkowite i dodatnie
(jeśli wykroczymy poza początkową liczbę cyfr w zapisie binarnym liczby, to dla liczby
dodatniej wstawiamy cyfry równe 0, a dla liczby ujemnej wstawiamy cyfry równe 1).
b) przesunięcie przecinka binarnego o k pozycji w prawo, jeśli k jest całkowite i ujemne
(jeśli wykroczymy poza początkową liczbę cyfr w zapisie liczby, to wstawiamy cyfry
równe 0).
Skalę obliczeń należy ustawić tak, by wyniki obliczeń mieściły się na liczbie miejsc przed
przecinkiem wyznaczonej przez przyjętą skalę dla argumentów
Liczba 5.25 w skali 0 ma zapis 00101,010
Ta liczba w skali 3 ma zapis 0,1010100
W skali 5 0,0010101
W skali -4 01010100
Liczba -5.25 ma skali 0 zapis 110101,110
Ta liczba w skali 3 ma zapis 110,101110
W skali 5 1,10101110
29
W skali -4 110101110
Liczby stałoprzecinkowe U2
Zasada obliczania wartości liczby stałoprzecinkowej U2 w niczym nie różni się od
zasad dla liczb całkowitych
Przykład:
0110,1011(U2) = 22 + 21 + 2-1 + 2-3 + 2-4
0110,1011(U2) = 4 + 2 + 1/2 + 1/8 + 1/16
0110,1011(U2) = 6
11/
16
1101,0011(U2) = (-23) + 22 + 20 + 2-3 + 2-4
1101,0011(U2) = (-8) + 4 + 1 + 1/8 + 1/16
1101,0011(U2) = (-8) + 5 3/16
1101,0011(U2) = -(2
13/ )
16
30
Obliczanie liczby przeciwnej
1. Negujemy wszystkie bity
2. Dodajemy 1 na najmłodszej pozycji
Obliczmy liczbę przeciwną do 1101,1001(U2) = (-2 7/16)
NOT
1101,1001
0010,0110
+
0000,0001
0010,0111
= 2 7/16
31
Konwersja dziesiętnej na U2
Znaleźć zapis U2 liczby 3,125.
Zapis U2 posiada 4 bity całkowite i 4 bity ułamkowe
3(10) = 11(2) - część całkowita
0,125(10) = 1/8 = 0,001(2) - część ułamkowa
3,125(10) = 11,001(2) = 0011,0010(U2)
Znaleźć zapis U2 liczby -2,125.
Zapis U2 posiada 3 bity całkowite oraz 5 bitów ułamkowych.
Ponieważ bitów całkowitych jest n=3, to liczbę -2,125 sumujemy z liczbą 23 = 8
8 + (-2,125) = 5,875 = 5 7/8
5,875(10) = 101,111(2) = 101,11100

-2,125(10) = 101,11100(U2)
32
Mnożenie liczb stałoprzecinkowych U2
metodą Bootha
X 
5
 1.1011(U 2)
16
Y 
7
14
   1.0010(U 2)
8
16
A
Q
Q-1
Operacja
00000
10010
0
A=0, Q-1=0 Q=Y M=X
00000
01001
0
Q0Q-1==00 więc ASR(AQQ-1)
00101
01001
0
Q0Q-1==10 więc A=A-M
00010
10100
1
ASR(AQQ-1)
11101
10100
1
Q0Q-1==01 więc A=A+M
11110
11010
0
ASR(AQQ-1)
11111
01101
0
Q0Q-1==00 więc ASR(AQQ-1)
00100
01101
0
Q0Q-1==10 więc A=A-M
00010
00110
1
ASR(AQQ-1)
AQ  0001000110 X  Y  00.0100011
1 1
1
35
5
7



  
4 64 128 128
16 8
33
Metoda porównawcza dzielenia ZM
1.
2.
3.
Jeżeli przesunięta reszta częściowa jest większa lub równa od dzielnika, to
kolejny bit ilorazu qi = 1, odejmujemy dzielnik od tej reszty.
Jeżeli przesunięta reszta częściowa jest mniejsza od dzielnika, to kolejny bit
ilorazu qi = 0.
Dokonujemy przesunięcia otrzymanego wyniku o jedno miejsce w lewo i
przechodzimy do punktu pierwszego
Część całkowita w zapisie binarnym została pominięta – zapis jest
postaci bity_ułamka
Dzielenie odbywa się w kodzie znak-moduł z pominięciem bitu
znaku (operujemy na modułach liczb), w przeciwieństwie do
pozostałych metod
34
Metoda porównawcza
RC = A = 0011001
011001
−0101
-----000101
(RC ≥ B, więc q1 = 1)
<-
RC = 00101
<- (RC < B, więc q2 = 0)
RC = 0101
<- (RC ≥ B, więc q3 = 1)
−0101
---RC = 0000
(kolejna reszta częściowa = 0)
Otrzymany wynik, złożony z kolejnych bitów od q1 do q3 jest modułem liczby wynikowej,
postaci q1q2q3. Bit znaku (z) tej liczby określamy na podstawie bitów znaku dzielnej (a) i
dzielnika (b) przy pomocy operacji logicznej: z = a XOR b. Tak więc przy różnych bitach
znaku daje ona wynik 1, przy takich samych daje 0. Wynik otrzymujemy w kodzie znak35
moduł i jest on równy 1.101ZM
Wady liczb stałoprzecinkowych
nie możemy prosto zapisywać na niewielkiej liczbie
bajtów bardzo dużych i bardzo małych liczb
jeśli chcemy rozszerzyć zakres i liczbę miejsc po
przecinku musimy używać bardzo dużej liczby bajtów
trudny do oszacowania błąd obliczeń
36