AKO 2009 cz 7

background image

Identyfikacja nadmiaru w

Identyfikacja nadmiaru w

trakcie dodawania i

trakcie dodawania i

odejmowania (1)

odejmowania (1)

algorytmy dodawania i odejmowania liczb
kodowanych w systemie U2 są takie same jak dla
liczb bez znaku (tj. liczb kodowanych w
naturalnym kodzie binarnym)

z tego powodu rozkaz dodawania ADD może
służyć zarówno do dodawania liczb bez znaku, jak
i do dodawania liczb ze znakiem w kodzie U2;
również rozkaz odejmowania SUB może
wykonywać działania na obu typach liczb

jednak dla obu typów inaczej określone są
warunki powstania nadmiaru – ilustruje to
przykład

background image

Identyfikacja nadmiaru w

Identyfikacja nadmiaru w

trakcie dodawania i

trakcie dodawania i

odejmowania (2)

odejmowania (2)

za pomocą rozkazu ADD zostały dodane dwie
liczby binarne — liczba podana w nawiasie
wpisywana jest do znacznika CF i stanowi wartość
przeniesienia, które wystąpiło w trakcie
dodawania najstarszych bitów obu liczb

0 0 1 1 1 0 0 1

0 0 1 1 1 0 0 1

1 1 1 1 1 1 1 1

1 1 1 1 1 1 1 1

---------------

---------------

(1)

(1)

0 0 1 1 1 0 0 0

0 0 1 1 1 0 0 0

background image

Identyfikacja nadmiaru w

Identyfikacja nadmiaru w

trakcie dodawania i

trakcie dodawania i

odejmowania (3)

odejmowania (3)

czy uzyskany wynik dodawania jest poprawny?

czy uzyskany wynik dodawania jest poprawny?

udzielenie odpowiedzi na to pytanie jest możliwe

udzielenie odpowiedzi na to pytanie jest możliwe

tylko wówczas, gdy znamy typy dodawanych liczb

tylko wówczas, gdy znamy typy dodawanych liczb

jeśli przyjąć, że sumowanie wykonywane na

jeśli przyjąć, że sumowanie wykonywane na

liczbach w kodzie U2, tzn. wykonano obliczenie

liczbach w kodzie U2, tzn. wykonano obliczenie

57+(–1)=56, to wynik jest poprawny

57+(–1)=56, to wynik jest poprawny

jeśli jednak sumowane liczby interpretowano jako

jeśli jednak sumowane liczby interpretowano jako

liczby bez znaku, tzn. wykonano dodawanie

liczby bez znaku, tzn. wykonano dodawanie

57+255=312, to wynik (=56) jest niepoprawny —

57+255=312, to wynik (=56) jest niepoprawny —

w tym przypadku uzyskany wynik (312) nie mógł

w tym przypadku uzyskany wynik (312) nie mógł

być zapisany na 8 bitach, wskutek czego

być zapisany na 8 bitach, wskutek czego

wystąpiło przepełnienie

wystąpiło przepełnienie

background image

Identyfikacja nadmiaru w

Identyfikacja nadmiaru w

trakcie dodawania i

trakcie dodawania i

odejmowania (4)

odejmowania (4)

w przypadku dodawania liczb bez znaku

w przypadku dodawania liczb bez znaku

ustawienie znacznika CF w stan 1 oznacza

ustawienie znacznika CF w stan 1 oznacza

wystąpienie przeniesienia, co w podanym

wystąpienie przeniesienia, co w podanym

przykładzie interpretujemy jako nadmiar, a co z

przykładzie interpretujemy jako nadmiar, a co z

tym idzie niepoprawny wynik dodawania

tym idzie niepoprawny wynik dodawania

przeniesienie to nie ma jednak wpływu na

przeniesienie to nie ma jednak wpływu na

poprawność wyniku, jeśli liczby interpretowane są

poprawność wyniku, jeśli liczby interpretowane są

jako liczby ze znakiem w kodzie U2

jako liczby ze znakiem w kodzie U2

na podstawie analizy podanego przykładu można

na podstawie analizy podanego przykładu można

stwierdzić, że identyfikacja nadmiaru powinna być

stwierdzić, że identyfikacja nadmiaru powinna być

prowadzona oddzielnie dla liczb ze znakiem (w

prowadzona oddzielnie dla liczb ze znakiem (w

kodzie U2) i dla liczb bez znaku

kodzie U2) i dla liczb bez znaku

background image

Znaczniki CF i OF (1)

Znaczniki CF i OF (1)

w trakcie wykonywania rozkazu dodawania ADD procesor

w trakcie wykonywania rozkazu dodawania ADD procesor

nie posiada żadnych informacji czy dodawane liczby

nie posiada żadnych informacji czy dodawane liczby

zakodowane są jako liczby bez znaku czy też jako liczby

zakodowane są jako liczby bez znaku czy też jako liczby

w kodzie U2 — informacje takie posiada jedynie autor

w kodzie U2 — informacje takie posiada jedynie autor

programu (czy kompilatora, który wytworzył te rozkazy)

programu (czy kompilatora, który wytworzył te rozkazy)

w tej sytuacji procesor udziela informacji o nadmiarze za

w tej sytuacji procesor udziela informacji o nadmiarze za

pomocą dwóch znaczników:

pomocą dwóch znaczników:

CF (ang. carry flag) — dla przypadku, gdy dodawano liczby bez

CF (ang. carry flag) — dla przypadku, gdy dodawano liczby bez

znaku

znaku

OF (ang. overflow flag) — dla przypadku, gdy dodawano liczby w

OF (ang. overflow flag) — dla przypadku, gdy dodawano liczby w

kodzie U2

kodzie U2

 

 

background image

Znaczniki CF i OF (2)

Znaczniki CF i OF (2)

w dalszej kolejności, w zależności od typu

w dalszej kolejności, w zależności od typu

dodawanych liczb programista testuje znacznik

dodawanych liczb programista testuje znacznik

CF albo OF (do testowania można zastosować

CF albo OF (do testowania można zastosować

rozkazy jc, jnc albo jo, jno)

rozkazy jc, jnc albo jo, jno)

procesor ustawia znacznik CF na podstawie

procesor ustawia znacznik CF na podstawie

wartości przeniesienia, które powstaje przy

wartości przeniesienia, które powstaje przy

dodawaniu najstarszych bitów obu liczb

dodawaniu najstarszych bitów obu liczb

procesor ustawia znacznik OF na podstawie

procesor ustawia znacznik OF na podstawie

wartości wyrażenia p

wartości wyrażenia p

n

n

p

p

n–1

n–1

, gdzie p

, gdzie p

n–1

n–1

i p

i p

n

n

oznaczają przeniesienia występujące podczas

oznaczają przeniesienia występujące podczas

dodawania dwóch najbardziej znaczących bitów

dodawania dwóch najbardziej znaczących bitów

background image

Nadmiar przy operacjach

Nadmiar przy operacjach

mnożenia i dzielenia (1)

mnożenia i dzielenia (1)

w typowych operacjach mnożenia (np. MUL,

w typowych operacjach mnożenia (np. MUL,

IMUL), mnożna i mnożnik zajmują jednakową

IMUL), mnożna i mnożnik zajmują jednakową

liczbę bitów, a iloczyn umieszczany jest w

liczbę bitów, a iloczyn umieszczany jest w

rejestrze dwukrotnie dłuższym (zazwyczaj

rejestrze dwukrotnie dłuższym (zazwyczaj

stanowiącym złożenie dwóch rejestrów, np.

stanowiącym złożenie dwóch rejestrów, np.

EDX:EAX) — w tej sytuacji nadmiar nigdy nie

EDX:EAX) — w tej sytuacji nadmiar nigdy nie

wystąpi

wystąpi

w typowych operacjach dzielenia (np. DIV, IDIV)

w typowych operacjach dzielenia (np. DIV, IDIV)

dzielna jest dwukrotnie dłuższa od dzielnika, a

dzielna jest dwukrotnie dłuższa od dzielnika, a

iloraz i reszta umieszczane w rejestrach tych

iloraz i reszta umieszczane w rejestrach tych

samych długości co dzielnik

samych długości co dzielnik

background image

Nadmiar przy operacjach

Nadmiar przy operacjach

mnożenia i dzielenia (2)

mnożenia i dzielenia (2)

błędne argumenty dzielenia mogą łatwo

błędne argumenty dzielenia mogą łatwo

doprowadzić do powstania nadmiaru, który w

doprowadzić do powstania nadmiaru, który w

przypadku rozkazu dzielenia prowadzi do

przypadku rozkazu dzielenia prowadzi do

wygenerowania

wygenerowania

wyjątku procesora

wyjątku procesora

, co powoduje

, co powoduje

przekazanie sterowania do systemu operacyjnego

przekazanie sterowania do systemu operacyjnego

i zakończenie wykonywania programu

i zakończenie wykonywania programu

wyjątki procesora omawiane będą w dalszej

wyjątki procesora omawiane będą w dalszej

części wykładu

części wykładu

podany niżej fragment programu wykonuje

podany niżej fragment programu wykonuje

dzielenie 256/1, co przy nieodpowiednio

dzielenie 256/1, co przy nieodpowiednio

dobranych długościach rejestrów prowadzi do

dobranych długościach rejestrów prowadzi do

wyjątku procesora (i zakończenia programu)

wyjątku procesora (i zakończenia programu)

background image

Nadmiar przy operacjach

Nadmiar przy operacjach

mnożenia i dzielenia (3)

mnożenia i dzielenia (3)

mov

mov

ax, 256

ax, 256

mov

mov

bh, 1

bh, 1

div

div

bh

bh

; wyjątek procesora !!!

; wyjątek procesora !!!

Podany rozkaz dzielenia DIV dzieli liczbę zawartą

Podany rozkaz dzielenia DIV dzieli liczbę zawartą

w 16-bitowym rejestrze AX przez liczbę

w 16-bitowym rejestrze AX przez liczbę

umieszczoną w 8-bitowym rejestrze BH

umieszczoną w 8-bitowym rejestrze BH

Reszta z dzielenia wpisywana jest do rejestru AH,

Reszta z dzielenia wpisywana jest do rejestru AH,

a iloraz (tu: 256) do 8-bitowego rejestru AL —

a iloraz (tu: 256) do 8-bitowego rejestru AL —

ponieważ w rejestrze AL może być zapisana co

ponieważ w rejestrze AL może być zapisana co

najwyżej liczba 255, więc powstaje nadmiar, a

najwyżej liczba 255, więc powstaje nadmiar, a

ślad za tym generowany jest wyjątek procesora

ślad za tym generowany jest wyjątek procesora

background image

Operacje bitowe (1)

Operacje bitowe (1)

lista rozkazów procesora zawiera zazwyczaj

lista rozkazów procesora zawiera zazwyczaj

obszerną grupę rozkazów wykonujących działania

obszerną grupę rozkazów wykonujących działania

na pojedynczych bitach, w szczególności możliwe

na pojedynczych bitach, w szczególności możliwe

jest wykonanie różnych operacji logicznych:

jest wykonanie różnych operacji logicznych:

negacji, sumy, iloczynu, sumy modulo dwa

negacji, sumy, iloczynu, sumy modulo dwa

omawiana grupa rozkazów jest szczególnie

omawiana grupa rozkazów jest szczególnie

rozbudowana w procesorach przeznaczonych do

rozbudowana w procesorach przeznaczonych do

zastosowań w systemach sterowania

zastosowań w systemach sterowania

background image

Operacje bitowe (2)

Operacje bitowe (2)

w architekturze IA–32 dostępne są m.in. poniższe

w architekturze IA–32 dostępne są m.in. poniższe

rozkazy wykonujące działania na wybranym bicie,

rozkazy wykonujące działania na wybranym bicie,

przy czym przed wykonaniem operacji zawartość

przy czym przed wykonaniem operacji zawartość

bitu jest kopiowana do znacznika CF

bitu jest kopiowana do znacznika CF

BT

bit nie ulega zmianie

BTS

wpisanie 1 do bitu

BTR

wpisanie 0 do bitu

BTC

zanegowanie zawartości bitu

background image

Operacje bitowe (3)

Operacje bitowe (3)

każdy ww. rozkaz ma dwa operandy:

pierwszy operand określa rejestr lub komórkę
pamięci zawierającą modyfikowany bit

drugi operand wskazuje numer bitu, na którym
ma być wykonana operacja

przykład: rozkaz

btc edi, 29

powoduje

zanegowanie bitu nr 29 w rejestrze EDI

background image

Operacje bitowe (4)

Operacje bitowe (4)

bitowe

operacje

logiczne

zazwyczaj

wykonywane jednocześnie na grupach bitach
umieszczonych w rejestrach lub w komórkach
pamięci

rozkaz NOT jest jednoargumentowy — następuje
zanegowanie wszystkich bitów

rozkazy AND, OR, XOR wykonują operacje
logiczne na odpowiadających sobie bitach obu
operandów — rezultat wpisywany jest do
operandu docelowego

background image

Operacje bitowe (5)

Operacje bitowe (5)

0

1

2

3

4

5

6

7

0

1

2

3

4

5

6

7

suma logiczna

1 0 1 0 0 1 1 1

0 1 1 1 0 1 0 1

1 1 1 1 0 1 1 1

rejestr AH

rejestr BL

rozkazu OR AH, BL

zawartość AH
po wykonaniu

bitowa

background image

Przesunięcia logiczne

Przesunięcia logiczne

zawartość rejestru lub komórki pamięci traktowana jako
ciąg bitów może być przesunięta w lewo lub prawo o
podaną liczbę pozycji

jeśli w trakcie przesuwania bity wychodzące z rejestru
(lub z komórki pamięci) są tracone, to mówimy wówczas
o przesunięciu logicznym (np. w IA–32 rozkazy SHL, SHR)

7 6 5 4 3 2 1 0

CF

0

background image

Przesunięcia cykliczne (1)

Przesunięcia cykliczne (1)

jeśli bity wychodzące są zawracane i wprowadzane
z drugiej strony rejestru, to mówimy o przesunięciu
cyklicznym
, nazywanym także obrotem (np. w IA–
32 rozkazy ROL, ROR)

7 6 5 4 3 2 1 0

CF

background image

Przesunięcia cykliczne (2)

Przesunięcia cykliczne (2)

dostępne są także odmiany przesunięć cyklicznych: RCL i RCR

dostępne są także odmiany przesunięć cyklicznych: RCL i RCR

— w rozkazach tych przyjmuje się, że na czas ich wykonywania

— w rozkazach tych przyjmuje się, że na czas ich wykonywania

znacznik CF staje się 9-, 17- lub 33-bitem rejestru — poniższy

znacznik CF staje się 9-, 17- lub 33-bitem rejestru — poniższy

rysunek ilustruje przesunięcie w lewo (RCL)

rysunek ilustruje przesunięcie w lewo (RCL)

background image

Wyodrębnianie pól bitowych

0

1

2

3

4

5

6

7

0

1

2

3

4

5

6

7

1 0 1 0 0 1 1 1

0 0 1 1 1 0 0 0

rejestr AH

rejestr BL

0

1

2

3

4

5

6

7

iloczyn logiczny

0 0 1 0 0 0 0 0

rozkazu and ah, bl

zawartość AH
po wykonaniu

bitowy

na bitach 5-3

umieszczona jest

"maska" bitowa

liczba 3-bitowa

0

1

2

3

4

5

6

7

logiczne w prawo

0 0 0 0 0 1 0 0

rozkazu shr ah, 3

zawartość AH
po wykonaniu

przesunięcie

o 3 pozycje

background image

Przesunięcia arytmetyczne

Przesunięcia arytmetyczne

(1)

(1)

rozkazy przesunięć w mogą być zastosowane do

rozkazy przesunięć w mogą być zastosowane do

mnożenia i dzielenia przez 2, 4, 8, ... (ogólnie:

mnożenia i dzielenia przez 2, 4, 8, ... (ogólnie:

przez 2

przez 2

k

k

) — w przypadku dzielenia pozwala to

) — w przypadku dzielenia pozwala to

znaczne skrócenie czasu operacji (np. 10 razy)

znaczne skrócenie czasu operacji (np. 10 razy)

ze względu na specyfikę kodowania liczb ze

ze względu na specyfikę kodowania liczb ze

znakiem w systemie U2 w architekturze IA–32

znakiem w systemie U2 w architekturze IA–32

wprowadzono rozkazy przesunięć

wprowadzono rozkazy przesunięć

arytmetycznych, (np. SAL, SAR), które są bardzo

arytmetycznych, (np. SAL, SAR), które są bardzo

podobne lub identyczne do przesunięć bitowych

podobne lub identyczne do przesunięć bitowych

background image

Przesunięcia arytmetyczne

Przesunięcia arytmetyczne

(2)

(2)

przykład realizacji mnożenia przez 2 za pomocą

przykład realizacji mnożenia przez 2 za pomocą

rozkazu przesunięcia arytmetycznego w lewo o

rozkazu przesunięcia arytmetycznego w lewo o

jedną pozycję (

jedną pozycję (

SAL BH, 1

SAL BH, 1

)

)

znacznik CF sygnalizuje nadmiar w trakcie działań

znacznik CF sygnalizuje nadmiar w trakcie działań

na liczbach bez znaku, a znacznik OF — na

na liczbach bez znaku, a znacznik OF — na

liczbach ze znakiem

liczbach ze znakiem

Zawartość rejestru BH

Rozkaz

przed wykonaniem

rozkazu

po wykonaniu rozkazu

11111111 (–1)

11111110 (–2) OF=0, CF=1

11000000 (–64)

10000000 (–128) OF=0, CF=1

00111111 (+63)

01111110 (+126) OF=0, CF=0

SAL BH, 1

10111111 (–65)

01111110 (+126) OF=1,CF=1

background image

Kodowanie liczb mieszanych

Kodowanie liczb mieszanych

opisy rozkazów arytmetycznych wykonywanych
przez procesor podawane są zazwyczaj przy
założeniu, że operacje wykonywane są na
liczbach całkowitych

działania mogą być wykonywane także na
liczbach ułamkowych i mieszanych — wymaga to
przekształcenia algorytmu w taki sposób, by
operacje na ułamkach zostały zastąpione przez
operacje na liczbach całkowitych

background image

Przykład kodowania liczby

Przykład kodowania liczby

mieszanej

mieszanej

0

1

2

3

4

5

6

7

8

9

11

12

13

14

15

10

bit znaku

2

–2

2

–3

2

–4

2

–5

3

2

2

2

1

2

0

2

–1

2

6

2

5

2

4

2

2

9

2

8

2

7

0

0 0 0

0 0

0

0

0

0

1

1

1 1

1

1

5625

.

549

0625

.

0

5

.

0

1

4

32

512

2

2

2

2

2

2

4

1

0

2

5

9

background image

Formaty liczb mieszanych

Formaty liczb mieszanych

nie ma standardowych formatów liczb

nie ma standardowych formatów liczb

mieszanych — przypisanie wag poszczególnym

mieszanych — przypisanie wag poszczególnym

bitom, a więc ustalenie położenia kropki

bitom, a więc ustalenie położenia kropki

rozdzielającej część całkowitą i ułamkową liczby

rozdzielającej część całkowitą i ułamkową liczby

zależy od decyzji programisty

zależy od decyzji programisty

ustalenie formatu wynika z zakresu zmienności

ustalenie formatu wynika z zakresu zmienności

danych i wyników pośrednich, jak również z

danych i wyników pośrednich, jak również z

wymagań dotyczących dokładności obliczeń

wymagań dotyczących dokładności obliczeń

dość często spotyka się format

dość często spotyka się format

śródprzecinkowy

śródprzecinkowy

,

,

w którym połowa bitów ma przypisane wagi o

w którym połowa bitów ma przypisane wagi o

wartościach całkowitych, a pozostałe – ułamkowe

wartościach całkowitych, a pozostałe – ułamkowe

background image

Ułamki dziesiętne a ułamki

Ułamki dziesiętne a ułamki

binarne (1)

binarne (1)

zazwyczaj dane przekazywane są do programu w
postaci liczb dziesiętnych

reprezentacja binarna części całkowitej liczby jest
zawsze dokładna

reprezentacja ułamka dziesiętnego w postaci
binarnej stanowi na ogół przybliżenie — tylko
niektóre liczby, jak np. 0.625 (tj. 0.5 + 0.125)
mają dokładną reprezentację binarną

background image

Ułamki dziesiętne a ułamki

Ułamki dziesiętne a ułamki

binarne (2)

binarne (2)

rozwinięcie binarne liczby 0.3 ma postać

0.010 011

001 100 110 011 001 100 110 011 001 100 ... = 0.0(1001)

w poniższym programie

int i; float a =

0, b = 0; for (i=0; i < 100; i++)

{

a = a + 0.3; b = b + 0.25;

}

printf("\na = %f b = %f", a, b);

zostały wyświetlone wyniki

a = 29.999971 b =

25.000000

background image

Obliczenia na liczbach bardzo

Obliczenia na liczbach bardzo

dużych

dużych

i bardzo małych (1)

i bardzo małych (1)

przykład: obliczenie stałej czasowej obwodu RC

wartość R (=

4 700 000)

4 700 000) w postaci 24-bitowej

liczby binarnej:

R=01000111 10110111 01100000

wartość pojemności C (= 0.000 000 000 068) w
postaci binarnej ma rozwinięcie nieskończone
okresowe

6

12

6

10

6

.

319

10

68

10

7

.

4

RC

pF

68

=

C

,

M

4.7

=

R

background image

Obliczenia na liczbach bardzo

Obliczenia na liczbach bardzo

dużych

dużych

i bardzo małych (2)

i bardzo małych (2)

przyjmujemy, że część ułamkowa liczby będzie
zajmowała 40 bitów

trzy najbliższe 40-bitowe liczby binarne do
wartości 0.000 000 000 068 mają postać:

0.00000000 00000000 00000000 00000000 01001010

(= 0.

000 000 000 067 302 607 931 196 689 605 712 890 625)

000 000 000 067 302 607 931 196 689 605 712 890 625)

0.00000000 00000000 00000000 00000000 01001011

(= 0.

000 000 000 068 212 102 632 969 617 843 627 929 687 5

000 000 000 068 212 102 632 969 617 843 627 929 687 5)

0.00000000 00000000 00000000 00000000 01001100

(= 0.

000 000 000 069 121 597 334 742 546 081 542 968 75

000 000 000 069 121 597 334 742 546 081 542 968 75

liczba

0.00000000 00000000 00000000 00000000 01001011

stanowi więc najlepsze przybliżenie 40-bitowe

background image

Obliczenia na liczbach bardzo

Obliczenia na liczbach bardzo

dużych

dużych

i bardzo małych (3)

i bardzo małych (3)

zatem obliczenie wartości RC wymaga przyjęcia
formatu, w którym część całkowita liczby
zajmować będzie 24 bity, a część ułamkowa 40
bitów – łącznie 64 bity, czyli 8 bajtów

przy podanym formacie liczby R i C będą
zajmować w pamięci po 8 bajtów, przy czym w
reprezentacji binarnej liczby R część ułamkowa
będzie zawierała same zera (5 bajtów), a w
reprezentacji liczby C część całkowita liczby
będzie zawierała same zera (3 bajty), a także
początkowe 4 bajty części ułamkowej będą
wypełnione zerami

background image

Liczby zmiennoprzecinkowe

Liczby zmiennoprzecinkowe

(1)

(1)

podany poprzednio sposób kodowania liczb jest

podany poprzednio sposób kodowania liczb jest

szczególnie nieefektywny jeśli w obliczeniach

szczególnie nieefektywny jeśli w obliczeniach

występują liczby bardzo duże i bardzo małe, co

występują liczby bardzo duże i bardzo małe, co

jest charakterystyczne dla obliczeń naukowo-

jest charakterystyczne dla obliczeń naukowo-

technicznych

technicznych

radykalną poprawę w tym zakresie przynosi

radykalną poprawę w tym zakresie przynosi

kodowanie zmiennoprzecinkowe (zmienno-

kodowanie zmiennoprzecinkowe (zmienno-

pozycyjne), w którym skupia się uwagę na cyfrach

pozycyjne), w którym skupia się uwagę na cyfrach

znaczących liczby, rejestrując jednocześnie

znaczących liczby, rejestrując jednocześnie

położenie kropki rozdzielającej część całkowitą i

położenie kropki rozdzielającej część całkowitą i

ułamkową

ułamkową

background image

Liczby zmiennoprzecinkowe

Liczby zmiennoprzecinkowe

(2)

(2)

weźmy pod uwagę omawianą poprzednio liczbę

weźmy pod uwagę omawianą poprzednio liczbę

binarną

binarną

0.00000000 00000000 00000000 00000000 01001011

spróbujmy przesunąć kropkę w prawo, tak by

spróbujmy przesunąć kropkę w prawo, tak by

kropka znalazła się za po prawej stronie najbardziej

kropka znalazła się za po prawej stronie najbardziej

znaczącej cyfry 1 — otrzymamy:

znaczącej cyfry 1 — otrzymamy:

1.001011

w tym przypadku kropkę przesunęliśmy o 34

w tym przypadku kropkę przesunęliśmy o 34

pozycje w prawo

pozycje w prawo

późniejsze odtworzenie oryginalnej liczby będzie

późniejsze odtworzenie oryginalnej liczby będzie

możliwe, jeśli obok wartości liczby (z przesuniętą

możliwe, jeśli obok wartości liczby (z przesuniętą

kropką) zapiszemy także liczbę przesunięć (tu: 34)

kropką) zapiszemy także liczbę przesunięć (tu: 34)

background image

Liczby zmiennoprzecinkowe

Liczby zmiennoprzecinkowe

(3)

(3)

omawiany sposób kodowania wymaga więc

omawiany sposób kodowania wymaga więc

przechowywania liczby w postaci dwóch elementów:

przechowywania liczby w postaci dwóch elementów:

mantysy

mantysy

, stanowiącej wartość liczby znormalizowaną do

, stanowiącej wartość liczby znormalizowaną do

przedziału (–2,–1> lub <1,2)

przedziału (–2,–1> lub <1,2)

wykładnika

wykładnika

, opisującego liczbę przesunięć kropki w

, opisującego liczbę przesunięć kropki w

prawo lub w lewo

prawo lub w lewo

mantysa

wykładnik

background image

Liczby zmiennoprzecinkowe

Liczby zmiennoprzecinkowe

(4)

(4)

Powyższe wyrażenie określa wartość liczby

Powyższe wyrażenie określa wartość liczby

zmiennoprzecinkowej różnej od 0

zmiennoprzecinkowej różnej od 0

Liczba 0 kodowana jest jako wartość specjalna

Liczba 0 kodowana jest jako wartość specjalna

(pola mantysy i wykładnika wypełnione są

(pola mantysy i wykładnika wypełnione są

zerami)

zerami)

dla liczb różnych od zera wymaga się, by mantysa

dla liczb różnych od zera wymaga się, by mantysa

spełniała

spełniała

warunek normalizacji

warunek normalizacji

:

:

1

1

mantysa

mantysa

< 2

< 2

mantysa

wykladnik

2

background image

Liczby zmiennoprzecinkowe

Liczby zmiennoprzecinkowe

(5)

(5)

tak więc liczba omawiana liczba przykładowa

tak więc liczba omawiana liczba przykładowa

0.00000000 00000000 00000000 00000000 01001011

w

postaci zmiennoprzecinkowej może być zakodowana jako

:

mantysa

wykładnik

–34 (binarnie)

1.001011

background image

Standardy kodowania liczb

Standardy kodowania liczb

zmiennoprzecinkowych (1)

zmiennoprzecinkowych (1)

Podane zasady kodowania zostały sformalizowane

Podane zasady kodowania zostały sformalizowane

w postaci standardu znanego jako norma IEEE 754

w postaci standardu znanego jako norma IEEE 754

w standardzie zdefiniowano trzy formaty liczb

w standardzie zdefiniowano trzy formaty liczb

zmiennoprzecinkowych: 32-bitowy (float), 64-bitowy

zmiennoprzecinkowych: 32-bitowy (float), 64-bitowy

(double) i 80-bitowy; określono także reguły

(double) i 80-bitowy; określono także reguły

zaokrąglania, postępowanie w przypadków błędów

zaokrąglania, postępowanie w przypadków błędów

w obliczeniach, itd.

w obliczeniach, itd.

W formatach 32- i 64-bitowych pomija się

W formatach 32- i 64-bitowych pomija się

kodowanie części całkowitej mantysy (ale

kodowanie części całkowitej mantysy (ale

uwzględnia w obliczeniach!) – z warunku

uwzględnia w obliczeniach!) – z warunku

normalizacji wynika bowiem, że bit ten jest zawsze

normalizacji wynika bowiem, że bit ten jest zawsze

równy 1 (dla liczb różnych od 0)

równy 1 (dla liczb różnych od 0)

background image

Standardy kodowania liczb

Standardy kodowania liczb

zmiennoprzecinkowych (2)

zmiennoprzecinkowych (2)

Znak mantysy określa skrajny bit z lewej strony

Znak mantysy określa skrajny bit z lewej strony

w standardzie nie przewidziano bitu znaku

w standardzie nie przewidziano bitu znaku

wykładnika — zamiast tego w

wykładnika — zamiast tego w

polu wykładnika

polu wykładnika

zapisuje się wartość wykładnika powiększoną o

zapisuje się wartość wykładnika powiększoną o

stałą wartość (127 dla formatu 32-bitowego, 1023

stałą wartość (127 dla formatu 32-bitowego, 1023

dla formatu 64-bitowego i 16383 dla formatu 80-

dla formatu 64-bitowego i 16383 dla formatu 80-

bitowego)

bitowego)

w rezultacie liczba zapisywana w polu wykładnika

w rezultacie liczba zapisywana w polu wykładnika

jest zawsze dodatnia i bit znaku nie jest

jest zawsze dodatnia i bit znaku nie jest

potrzebny

potrzebny

background image

Formaty liczb

Formaty liczb

zmiennoprzecinkowych (1)

zmiennoprzecinkowych (1)

S wykładn.

mantysa

11 bitów

52 bity

umowna kropka rozdzielająca część całkowitą
i ułamkową mantysy

(w formacie 32- i 64-bitowym część całkowita

mantysy występuje w postaci niejawnej)

S

mantysa

8 bitów

23 bity

wykł.

format 32-bitowy

format

64-bitowy

background image

Formaty liczb

Formaty liczb

zmiennoprzecinkowych (2)

zmiennoprzecinkowych (2)

format 80-bitowy pośredni (ang. temporary real)

format 80-bitowy pośredni (ang. temporary real)

background image

Przykład kodowania

Przykład kodowania

liczby 12.25 w formacie 32-

liczby 12.25 w formacie 32-

bitowym (1)

bitowym (1)

k

m 2

Liczbę 12.25 przedstawiamy w postaci iloczynu

Liczbę 12.25 przedstawiamy w postaci iloczynu

Wykładnik potęgi

Wykładnik potęgi

k

k

musi być tak dobrany, by

musi być tak dobrany, by

spełniony był warunek normalizacji mantysy

spełniony był warunek normalizacji mantysy

czyli

czyli

2

|

|

1

m

2

2

25

.

12

1

k

background image

Przykład kodowania

Przykład kodowania

liczby 12.25 w formacie 32-

liczby 12.25 w formacie 32-

bitowym (2)

bitowym (2)

Łatwo zauważyć, że warunek normalizacji jest

Łatwo zauważyć, że warunek normalizacji jest

spełniony, gdy

spełniony, gdy

k

k

= 3. Zatem

= 3. Zatem

 

 

 

 

Ponieważ część całkowita mantysy nie jest

Ponieważ część całkowita mantysy nie jest

kodowana, więc w polu mantysy zostanie wpisana

kodowana, więc w polu mantysy zostanie wpisana

liczba (0.10001)

liczba (0.10001)

2

2

, zaś w polu wykładnika (po

, zaś w polu wykładnika (po

przesunięciu o 127) liczba (10000010)

przesunięciu o 127) liczba (10000010)

2

2

.

.

Ostatecznie otrzymamy

Ostatecznie otrzymamy

background image

Przykład kodowania

Przykład kodowania

liczby 12.25 w formacie 32-

liczby 12.25 w formacie 32-

bitowym (3)

bitowym (3)

background image

Przykład kodowania

Przykład kodowania

liczby 68*10

liczby 68*10

–12

–12

Poniżej podano liczbę 68*10

Poniżej podano liczbę 68*10

–12

–12

zakodowaną

zakodowaną

w formacie 32-bitowym (float)

w formacie 32-bitowym (float)

dokładna wartość zakodowanej liczby

dokładna wartość zakodowanej liczby

wynosi:

wynosi:

0.00000000006800000146300888559380837250500917434692

0.00000000006800000146300888559380837250500917434692

mantysa

wykładnik

01011101

00101011000100010011001

0

(–34+127=93)

background image

Zakresy liczb

Zakresy liczb

zmiennoprzecinkowych (1)

zmiennoprzecinkowych (1)

w formacie 32-bitowym można kodować liczby o
wartościach do

3.37*10

38

, a w formacie 64-

bitowym nawet do

1.67*10

308

;

w przypadku bardzo dużych liczb, ze względu na
ograniczoną długość pola mantysy, podane
wartości zastępowane są przez przybliżenia;
przykład:

float a = 17000000.0, b = 16999999.0;

float a = 17000000.0, b = 16999999.0;

printf("\n%e\n", a-b );

printf("\n%e\n", a-b );

// na ekranie zostanie wyświetlona wartość 0

// na ekranie zostanie wyświetlona wartość 0

background image

Zakresy liczb

Zakresy liczb

zmiennoprzecinkowych (2)

zmiennoprzecinkowych (2)

możliwe jest także kodowanie liczb bardzo
małych, np. w formacie 64-bitowym można
zakodować z zadowalającą dokładnością (ok. 14
cyfr dziesiętnych) liczby bliskie

2.23*10

–308

;

takie same zakresy dotyczą również liczb
ujemnych

background image

Zasady wykonywania obliczeń

Zasady wykonywania obliczeń

przez koprocesor arytmetyczny

przez koprocesor arytmetyczny

(1)

(1)

koprocesor arytmetyczny stanowi odrębny

koprocesor arytmetyczny stanowi odrębny

procesor, współdziałający z procesorem głównym

procesor, współdziałający z procesorem głównym

i znajdujący się w tej samej obudowie

i znajdujący się w tej samej obudowie

w przeszłości koprocesor stanowił oddzielny układ

w przeszłości koprocesor stanowił oddzielny układ

scalony instalowany na płycie głównej komputera

scalony instalowany na płycie głównej komputera

liczby, na których wykonywane są obliczenia,

liczby, na których wykonywane są obliczenia,

składowane są w 8 rejestrach 80-bitowych

składowane są w 8 rejestrach 80-bitowych

tworzących

tworzących

stos rejestrów koprocesora

stos rejestrów koprocesora

arytmetycznego

arytmetycznego

background image

Zasady wykonywania obliczeń

Zasady wykonywania obliczeń

przez koprocesor arytmetyczny

przez koprocesor arytmetyczny

(2)

(2)

background image

Zasady wykonywania obliczeń

Zasady wykonywania obliczeń

przez koprocesor arytmetyczny

przez koprocesor arytmetyczny

(3)

(3)

z każdym rejestrem związane jest 2-bitowe

z każdym rejestrem związane jest 2-bitowe

pole

pole

stanu rejestru

stanu rejestru

(nazywane także

(nazywane także

polem znaczeń

polem znaczeń

);

);

wszystkie pola stanu tworzą 16-bitowy rejestr

wszystkie pola stanu tworzą 16-bitowy rejestr

zwany

zwany

rejestrem stanu stosu koprocesora

rejestrem stanu stosu koprocesora

;

;

interpretacja pola stanu jest następująca:

interpretacja pola stanu jest następująca:

0 – rejestr zawiera liczbę różną od zera,

0 – rejestr zawiera liczbę różną od zera,

1 – rejestr zawiera zero,

1 – rejestr zawiera zero,

2 – rejestr zawiera błędny rezultat,

2 – rejestr zawiera błędny rezultat,

3 – rejestr jest pusty;

3 – rejestr jest pusty;

background image

Zasady wykonywania obliczeń

Zasady wykonywania obliczeń

przez koprocesor arytmetyczny

przez koprocesor arytmetyczny

(4)

(4)

rozkazy koprocesora adresują rejestry stosu nie

rozkazy koprocesora adresują rejestry stosu nie

bezpośrednio, ale względem wierzchołka stosu

bezpośrednio, ale względem wierzchołka stosu

w kodzie asemblerowym rejestr znajdujący się na

w kodzie asemblerowym rejestr znajdujący się na

wierzchołku stosu oznaczany jest ST(0) lub ST, a

wierzchołku stosu oznaczany jest ST(0) lub ST, a

dalsze ST(1), ST(2),..., ST(7)

dalsze ST(1), ST(2),..., ST(7)

ze względu na specyficzny sposób adresowania

ze względu na specyficzny sposób adresowania

koprocesor arytmetyczny zaliczany jest do

koprocesor arytmetyczny zaliczany jest do

procesorów o

procesorów o

architekturze stosowej

architekturze stosowej

mechanizmy stosu rejestrów koprocesora są

mechanizmy stosu rejestrów koprocesora są

analogiczne do mechanizmów stosu w procesorze

analogiczne do mechanizmów stosu w procesorze

(m.in. stos rośnie w kierunku malejących numerów

(m.in. stos rośnie w kierunku malejących numerów

rejestrów)

rejestrów)

background image

Lista rozkazów koprocesora

Lista rozkazów koprocesora

arytmetycznego (1)

arytmetycznego (1)

lista rozkazów koprocesora arytmetycznego

lista rozkazów koprocesora arytmetycznego

zawiera rozkazy wykonujące działania na liczbach

zawiera rozkazy wykonujące działania na liczbach

zmiennoprzecinkowych, w tym rozkazy

zmiennoprzecinkowych, w tym rozkazy

przesłania, działania arytmetyczne, obliczanie

przesłania, działania arytmetyczne, obliczanie

pierwiastka kwadratowego, funkcji

pierwiastka kwadratowego, funkcji

trygonometrycznych (sin, cos, tg, arc tg),

trygonometrycznych (sin, cos, tg, arc tg),

wykładniczych i logarytmicznych

wykładniczych i logarytmicznych

wszystkie mnemoniki rozkazów koprocesora

wszystkie mnemoniki rozkazów koprocesora

zaczynają się od litery F (ang. float)

zaczynają się od litery F (ang. float)

background image

Lista rozkazów koprocesora

Lista rozkazów koprocesora

arytmetycznego (2)

arytmetycznego (2)

prawie zawsze jeden z argumentów wykonywanej

prawie zawsze jeden z argumentów wykonywanej

operacji znajduje się na wierzchołku stosu ST(0),

operacji znajduje się na wierzchołku stosu ST(0),

nawet jeśli nie jest określony w postaci jawnej

nawet jeśli nie jest określony w postaci jawnej

przykładowo rozkaz mnożenia

przykładowo rozkaz mnożenia

fmul

fmul

  

  

vc

vc

powoduje pomnożenie liczby znajdującej się na

powoduje pomnożenie liczby znajdującej się na

wierzchołku stosu przez wartość zmiennej vc, a

wierzchołku stosu przez wartość zmiennej vc, a

wynik wpisywany w miejsce dotychczasowej

wynik wpisywany w miejsce dotychczasowej

wartości na wierzchołku stosu (wskaźnik stosu nie

wartości na wierzchołku stosu (wskaźnik stosu nie

zmienia się)

zmienia się)

background image

Przykład: obliczanie wartości tg

Przykład: obliczanie wartości tg

przykładowo, do obliczenia wartości funkcji

przykładowo, do obliczenia wartości funkcji

tangens używa się rozkazu FPTAN, który oblicza

tangens używa się rozkazu FPTAN, który oblicza

wartość funkcji dla argumentu (w radianach)

wartość funkcji dla argumentu (w radianach)

podanego na wierzchołku stosu koprocesora

podanego na wierzchołku stosu koprocesora

w wyniku podaje dwie liczby — ich iloraz stanowi

w wyniku podaje dwie liczby — ich iloraz stanowi

wartość funkcji (bezpośrednio po rozkazie FPTAN

wartość funkcji (bezpośrednio po rozkazie FPTAN

należy wykonać rozkaz FDIV (bez operandów))

należy wykonać rozkaz FDIV (bez operandów))

background image

Przykład: obliczanie wartości

Przykład: obliczanie wartości

wyróżnika trójmianu

wyróżnika trójmianu

kwadratowego (1)

kwadratowego (1)

zakładamy, że wartości współczynników trójmianu

zakładamy, że wartości współczynników trójmianu

a

a

,

,

b

b

,

,

c

c

przechowywane są w zmiennych,

przechowywane są w zmiennych,

odpowiednio

odpowiednio

va

va

,

,

vb

vb

,

,

vc

vc

va

va

dq

dq

1.0

1.0

vb

vb

dq

dq

5.5

5.5

vc

vc

dq

dq

-15.0

-15.0

liczba4

liczba4

dq

dq

4.0

4.0

background image

Przykład: obliczanie wartości

Przykład: obliczanie wartości

wyróżnika trójmianu

wyróżnika trójmianu

kwadratowego (2)

kwadratowego (2)

finit

finit

; inicjalizacja koprocesora

; inicjalizacja koprocesora

; załadowanie wartości 'b' na wierzchołek stosu

; załadowanie wartości 'b' na wierzchołek stosu

fld

fld

vb

vb

fmul

fmul

st(0), st(0) ; obliczenie b^2

st(0), st(0) ; obliczenie b^2

; załadowanie wartości 'a' na wierzchołek stosu

; załadowanie wartości 'a' na wierzchołek stosu

fld

fld

va

va

fmul

fmul

vc

vc

; mnożenie a * c

; mnożenie a * c

fmul

fmul

liczba4

liczba4

; obliczenie 4 * (a * c)

; obliczenie 4 * (a * c)

fsubp

fsubp

st(1), st(0)

st(1), st(0)

; obliczenie pierwiastka z liczby na wierz. stosu

; obliczenie pierwiastka z liczby na wierz. stosu

fsqrt

fsqrt


Document Outline


Wyszukiwarka

Podobne podstrony:
AKO 2009 cz 4
AKO 2009 cz 3

więcej podobnych podstron