background image

 

 

Procesory sygnałowe

Wykład 2 

Liczby stało- i zmienno-

przecinkowe

Dr inż. Robert 
Wielgat

background image

 

 

Reprezentacja liczb w formacie znak-

moduł oraz w kodzie U2 

a

0

a

1

a

2

a

3

a

4

a

5

a

6

a

7

0

0

1

1

0

1

0

1

1) Format znak-moduł. 

x = -1 

a7 . 

(a

6

.

2

6

 + a

5

.

2

5

 + a

4

.

2

4

 + a

3

.

2

3

 + a

2

.

2

2

 + 

a

1

.

2

1

 + a

0

.

2

0

 )

x = -1

1 . 

(32 + 8 + 4) = -44

 

a

0

a

1

a

2

a

3

a

4

a

5

a

6

a

7

0

0

1

1

0

1

0

1

1) Kod uzupełnień do dwóch (kod U2). 

x = - a

7

.

2

7

 + a

6

.

2

6

 + a

5

.

2

5

 + a

4

.

2

4

 + a

3

.

2

3

 + a

2

.

2

2

 + 

a

1

.

2

1

 + a

0

.

2

0

 

x = -1

.

128 + 32 + 8 + 4 = -128 + 44 = -84

 

background image

 

 

Procesory stało i 

zmiennoprzecinkowe

Procesory sygnałowe dzielą się na stało- i 
zmiennoprzecinkowe. Za pomocą liczb 
stało i zmiennoprzecinkowych są 
reprezentowane liczby rzeczywiste.

Procesory zmiennoprzecinkowe

 operują 

na liczbach zmiennoprzecinkowych, 
dopuszczają większy zakres dynamiki 
sygnału - nie wymagają skalowania 
wyników obliczeń, zmniejszają ryzyko 
przepełnienia.

Procesory stałoprzecinkowe

 operują na 

liczbach stałoprzecinkowych, są szybsze 
w działaniu i tańsze.

background image

 

 

Liczby stałoprzecinkowe

Liczba stałoprzecinkowa 16-bitowa w 
kodzie U2

a

7

a

6

a

5

a

4

a

3

a

2

a

1

a

0

a

-1

a

-2

a

-3

a

-4

a

-5

a

-6

a

-7

a

-8

7 bitów części 
całkowitej

8 bitów części 
ułamkowej

Bit znaku: 

0 „+”

 lub 

„-”

1

0

0

1

1

1

0

0

1

0

0

1

1

0

0

1

6

8

7

7

2

2

i

i

i

a

a

x

x = -1*2

7

+1*2

4

+1*2

3

+1*2

2

+1*2

-1

+1*2

-4

+1*2

-

5

+1*2

-8

x = -128 +16

+8

+4

+0,5

+0,06
25

+  2

-5

+ 2

-8

x = - 99 , 
40234375

background image

 

 

Zakres liczb stałoprzecinkowych 

w kodzie U2

N bitów części 
całkowitej

M bitów części 
ułamkowej

Bit znaku: 

0 „+”

 lub 

„-”

1

2

2

N

M

i

i

i

N

N

a

a

x

2

N

 - 

1

Przykładowo, jeżeli N = 7, a M = 8, wówczas zakres 
wartości liczb stałopozycyjnych w kodzie U2 będzie 
następujący: 
(

-128

127,99609375

)

-2

N

+ 1 - 2

-M

)

Zakres liczb: 
(

(

-2

N

,

 2

N

 - 2

-M

)

background image

 

 

Zamiana liczby dziesiętnej na liczbę 

stałoprzecinkową w kodzie U2

1) Sprawdzamy czy zamieniana liczba mieści się w 

zakresie liczb stałoprzecinkowych.

 

-2

< L <

 

2

– 2 

- M    

?

-128

 < -103,279 < 

127,99609375 

- prawda

Przykład:

Zamiana liczby L = –103,279 na liczbę stałoprzecinkową z N 
= 7 bitami części całkowitej i M = 8 bitami części 
ułamkowej

2) Do liczby dziesiętnej dodajemy wartość a

.

2

N

L’ = L + a

.

2

N  

-103,279 +128 =  24,721

3) Zamieniamy część całkowitą i część ułamkową liczby L’ 

na postać binarną

background image

 

 

Zamiana liczby dziesiętnej na liczbę 

stałoprzecinkową w kodzie U2 (c.d.)

3.a) Zamiana części 

całkowitej na postać 
binarną

a

7

a

6

a

5

a

4

a

3

a

2

a

1

a

0

a

-1

a

-2

a

-3

a

-4

a

-5

a

-6

a

-7

a

-8

24 : 2 = 12 

reszty 0

12 : 2 = 6 

reszty 0

6 : 2 = 3 reszty 

0

3 : 2 = 1 

reszty 

1

1 : 2 = 0 reszty 

1

0

1

1

0

0

3.b) Zamiana części 

ułamkowej na postać 
binarną

0,288 x 2 =  0,576 

->  0

0

0,768 x 2 =  1,536 

->  1

1

0,536 x 2 =  1,072 

->  1

1

0,072 x 2 =  0,144 

->  0

0

 

0,442 x 2 = 0,884  

->  0

0

0,884 x 2 =  1,768 

->  1

1

0,144 x 2 =  0,288 

->  0

0

0,721 x 2 = 1,442  
->  1

1

4) Dopisanie bitu znaku a

7

 co jest równoważne dodaniu - 

a

.

 2

= -128

1

0

0

dopisanie 

zer

24,72

1

background image

 

 

Sprawdzenie zamiany liczby

a

7

a

6

a

5

a

4

a

3

a

2

a

1

a

0

a

-1

a

-2

a

-3

a

-4

a

-5

a

-6

a

-7

a

-8

Zamieniana liczba dziesiętna:  

-103,279

Otrzymana liczba 

stałoprzecinkowa

0

1

1

0

0

0

1

1

0

0

1

0

1

1

0

0

x = -1*2

7

+1*2

4

+1*2

3

+1*2

-

1

+1*2

-3

+1*2

-4

+1*2

-

5

x = -128 +16 +8 +0,5

+0,12
5

+0,062
5

+0,0312
5

Otrzymana wartość dziesiętna liczby stałoprzecinkowej :  

-103,28125                                

-103,28125 JEST RÓŻNE OD 

103,279       

background image

 

 

Liczby zmiennoprzecinkowe

Za pomocą liczb stałoprzecinkowych można reprezentować 

liczby z precyzją 

–M

, Gdzie M – liczba bitów części 

ułamkowej liczby.

Precyzja liczby stałoprzecinkowej jest równocześnie 

wartością bezwzględną maksymalnego błędu 
bezwzględnego jaki można popełnić reprezentując 
liczby dziesiętne. Wartość maksymalnego błędu 
względnego rośnie w miarę zmniejszania się wartości 
dziesiętnej reprezentowanej liczby.

Przykład:

Przy zamianie liczby 

-103,279

 na liczbę 

stałoprzecinkową o 8 bitach części ułamkowej 
popełniono błąd względny o wartości 

-0,0000218 %

. Natomiast chcąc zaprezentować liczbę: 

0,00000000000000000000000000091095

 za pomocą 

liczby stałoprzecinkowej o tym samym formacie 
popełnionoby błąd względny o wartości 

-100 %

 !

Zakres wartości liczb stałoprzecinkowych jest bardzo 

ograniczony. Zachodzi zatem potrzeba wprowadzenia 
bardziej doskonałej reprezentacji liczb. Taką 
reprezentacją jest zapis zmiennoprzecinkowy.

background image

 

 

Zapis zmiennoprzecinkowy

Liczba zapisana w systemie zmiennoprzecinkowym 
składa się z dwóch części: liczby stałoprzecinkowej 

m

której wartość bezwzględna jest mniejsza od wartości 
podstawy systemu pozycyjnego 

p

 oraz z podstawy 

podniesionej do pewnej potęgi zwanej wykładnikiem 
lub cechą 

e

. Wartość liczby jest równa iloczynowi 

części stałoprzecinkowej i wykładniczej.

w = m 

x

 p 

e

,  m - 

mantysa

, p - 

podstawa systemu (np. 

10)

, e - 

wykładnik potęgowy (exponenta)

Przykłady zapisu zmiennoprzecinkowego:

158900000 = 0,1589 x 10 

9

0,000034 = 0,34 x 10 

-4

background image

 

 

Zamiana zapisu stałoprzecinkowego 

na zmiennoprzecinkowy

1) Liczba stałoprzecinkowa ma moduł większy lub 
równy 1 oraz posiada

 n

 cyfr części całkowitej. Wtedy 

przecinek w zapisie zmiennoprzecinkowym należy 
przesunąć o 

n

 pozycji w lewo. Wykładnik potęgowy jest 

równy 

n

196,44 = 0,19644 x 10

3

, n = 3

2) Liczba stałoprzecinkowa ma moduł  mniejszy od 
jedności. Jeżeli 

n

 oznacza liczbę zer po przecinku do 

pierwszej cyfry znaczącej, wówczas należy przesunąć 
przecinek o 

n

 pozycji w prawo. Wykładnik potęgowy 

jest równy 

-n

:

0,0000302 = 0,302 x 10

-4

, n = 4

background image

 

 

Reprezentacje liczb 

stałoprzecinkowych na 

procesorze ADSP-21065L

Liczby stałoprzecinkowe ze znakiem są 
reprezentowane na procesorze ADSP-21065L w kodzie 
uzupełnień do dwóch.

31

30

29

1

0

-

2

31

2

3

0

2

2

9

. . .

2

1

2

0

.

Liczba naturalna ze 
znakiem

Zna
k

Punkt 

binarn

y

31

30

29

1

0

-
2

0

.

2

-

1

2

-

2

. . .

2

-

30

2

-

31

Liczba ułamkowa ze 
znakiem

Zna
k

Punkt 

binarny

background image

 

 

Reprezentacje liczb 

stałoprzecinkowych na procesorze 

ADSP-21065L

Liczby stałoprzecinkowe bez znaku są 

reprezentowane na procesorze ADSP-21065L w 

naturalnym kodzie binarnym.

31

30

29

1

0

2

3

1

2

3

0

2

2

9

. . .

2

1

2

0

.

Liczba naturalna bez 
znaku

Punkt 

binarny

31

30

29

1

0

.2

-

1

2

-

2

2

-

3

. . .

2

-

31

2

-

32

Liczba ułamkowa bez znaku

Punkt 

binarny

background image

 

 

Reprezentacje liczb 

zmiennoprzecinkowych na procesorze 

ADSP-21065L

Liczby zmiennoprzecinkowe są reprezentowane na 
procesorze ADSP-21065L w formacie znak-moduł.

background image

 

 

Reprezentacje liczb 

zmiennoprzecinkowych na procesorze 

ADSP-21065L

Liczby zmiennoprzecinkowe są reprezentowane na 
procesorze ADSP-21065L w formacie znak-moduł.

background image

 

 

Wartości liczb zmiennoprzecinkowych 

pojedynczej precyzji

1) + 

,

f

22

f

= 0,

e=255,

s=0,

2) - 

,

f

22

f

= 0,

e=255,

s=1,

3) NaN (Not a Number),  f

22

f

 0,

e=255,

s={0,1},

4) (-1)

S

(1.f

22-0 

)2 

e-127

,

f

22

f

- dowolne,

 e 

  254,

s={0,1},

5) Zero,

 f

22

f

= 0,

e=0,

s ={0,1},

Uwagi:

Za pomocą wartości NaN są reprezentowane: flagi 
sterujące przepływem danych, nie zainicjalizowane 
wartości zmiennych, wyniki niedozwolonych operacji (np. 
0 * 

),

Zero może mieć wartość ujemną –2 

-127 

lub dodatnią 2 

-127

wartość zero równa dokładnie 0 nie istnieje na procesorze 
ADSP-21065L,

„Normalne” liczby zmiennoprzecinkowe zawierają się w 
zakresie

-(2 - 2 

-23

)2 

127

(2 - 2 

-23

)2 

127

 

(w przybliżeniu [ 

-3,4 

.

 10 

38

3,4 

.

 10 

38

] )

background image

 

 

Tryby zaokrąglania liczb

W procesorze ADSP-21065L zaimplementowano dwa 

tryby zaokrąglania liczb:

1) Zaokrąglanie w kierunku zera (ang. Toward-Zero). 

Jeżeli procesor nie może przedstawić wyniku operacji 
w docelowym formacie, wówczas zaokrągla liczbę do 
liczby najbliższej zeru.
Przykładowo, jeżeli mamy format liczb 1.3 tzn. jedna 
cyfra całkowita oraz trzy ułamkowe, to procesor 
zaokrągli liczbę 

1.3456

 do wartości 

1.345

, a liczbę 

– 

1,6671

 do wartości 

–1,667

.

2) Zaokrąglanie w kierunku najbliższego (ang. Toward-

Nearest). Jeżeli procesor nie może przedstawić 
wyniku operacji w docelowym formacie, wówczas 
zaokrągla liczbę do liczby najbliższej.
Przykładowo, jeżeli mamy format liczb 1.3 tzn. jedna 
cyfra całkowita oraz trzy ułamkowe, to procesor 
zaokrągli liczbę 

1.3456

 do wartości 

1.346

, a liczbę 

– 

1,6671

 do wartości 

–1,667

.

background image

 

 

Niedokładności numeryczne

1. Dodawanie liczb różnej skali

1.00E0 + 3.00E-3 + 3.00E-3 + 4.00E-3

 = ?

1.00E0 + 3.00E-3 = 1.00E0 + 0.003E0 = 1.003E0 po 

zaokrągleniu 

1.00E0

1.00E0 + 3.00E-3 = 1.00E0 + 0.003E0 = 1.003E0 po 

zaokrągleniu 

1.00E0

1.00E0 + 4.00E-3 = 1.00E0 + 0.004E0 = 1.004E0 po 

zaokrągleniu 

1.00E0

3.00E-3 + 3.00E-3 = 

6.00E-3

6.00E-3 + 4.00E-3 = 10.00E-3 po 

normalizacji 

1.00E-2

1.00E0 + 1.00E-2 = 1.00E0 + 0.01E0 

1.01E0

Wniosek: kolejność obliczeń może wpływać na 

dokładność wyniku

background image

 

 

Niedokładności numeryczne

2. Kolejność obliczeń

Mnożenie i dzielenie powoduje mniejsze niedokładności 

niż dodawanie i odejmowanie, dlatego w pierwszej 
kolejności powinno wykonywać się dzielenie i 
mnożenie, a w dalszej dodawanie i odejmowanie

3. Fałszywa precyzja

1.02E0 - 1.01E0 = 

0.01E0 

Dokładność względna otrzymanego wyniku może być 

mniejsza niż wynika to z liczby cyfr znaczących (bitów)

4. Porównywanie liczb

Porównywanie liczb odbywa się zawsze z założoną precyzją 

np. równą EPS=10E-4, dlatego niekiedy może się 
okazać, że liczby, które z matematycznego punktu 
widzenia są różne, zostaną uznane przez procesor 
sygnałowy jako identyczne.

background image

 

 

Operacje zmiennoprzecinkowe 

dotyczące formatu liczb na ADSP 

21065L 

Fn=RND Fx

Operacja zaokrągla zmiennoprzecinkowy operand w rejestrze Fx 
do zakresu 32 bitów.

Fn = SCALB Fx BY Ry

Skaluje wykładnik operandu w rejestrze Fx poprzez dodanie do 
niego stałoprzecinkowej liczby w kodzie uzupełnień do dwóch z 
rejestru Ry.

Rn = MANT Fx

Operacja zwraca mantysę (część ułamkową z jawnym bitem 
ukrytym z pominięciem bitu znaku zmiennoprzecinkowego 
operandu w Fx. Mantysa jest zapisywana w formacie 1.31 w 
stałoprzecinkowym polu w rejestrze Rn

Rn = LOGB Fx

Przekształca wykładnik zmiennoprzecinkowego operandu w Fx 
w stałoprzecinkową liczbę bez znaku w kodzie uzupełnień do 
dwóch. 

background image

 

 

Konwersja typów liczb 

Rn = FIX Fx

Rn = TRUNC Fx

Operacja przekształca zmiennoprzecinkowy operand z rejestru Fx 
na 32-bitową liczbę całkowitą w kodzie uzupełnień do dwóch. 

Rn = FIX Fx BY Ry

Rn = TRUNC Fx BY Ry

W powyższych operacjach przed konwersją do wykładnika potęgi 
operandu w rejestrze Fx jest dodawany całkowity stałoprzecinkowy 
czynnik skalujący w kodzie uzupełnień do dwóch zapisany w Ry. 
Wynik operacji jest zapisywany w stałoprzecinkowym polu rejestru 
Rn w formacie 32.0

Fn = FLOAT Rx

Operacja przekształca stałoprzecinkowy operand z rejestru Rx na 
liczbę zmiennoprzecinkową. 

background image

 

 

Konwersja typów liczb 

W powyższej operacji przed konwersją do wykładnika potęgi 
operandu w rejestrze Rx jest dodawany całkowity 
stałoprzecinkowy czynnik skalujący w kodzie uzupełnień do 
dwóch zapisany w Ry.

Fn = FLOAT Rx BY Ry

Kopiowanie znaku liczby

Fn = Fx COPYSIGN Fy

Operacja kopiuje znak zmiennoprzecinkowego operandu z Fy do 
operandu Fx nie zmieniając jego mantysy i wykładnika. Rezultat 
jest zapisywany do rejestru Fn. 

background image

 

 

operacje dotyczące 

stałoprzecinkowego formatu liczb

Rn = EXP Rx (EX)

Rozkaz oblicza exponentę (wykładnik) stałoprzecinkowego 
operandu zawartego w rejestrze Rx.

Rn = LEFTZ Rx

Rozkaz oblicza liczbę wiodących zer stałoprzecinkowego 
argumentu zawartego w rejestrze Rx. 

Rn = LEFTO Rx

Rozkaz oblicza liczbę wiodących jedynek stałoprzecinkowego 
argumentu zawartego w rejestrze Rx. Wynik jest umieszczany w 
polu bit6 w rejestrze Rn (bity od 8 do 13). 

background image

 

 

Konwersja formatów danych

Rn = FPACK Fx

Rozkaz konwertuje wartość w rejestrze Fx z 32-bitowego formatu  
zmiennoprzecinkowe-go IEEE 754 do formatu zmiennoprzecinkowego o 
precyzji 16-bitowej. Wynik jest umieszczany na szesnastu młodszych bitach 
rejestru Rn. Format krótki posiada 11-bitową mantysę, 4-bitową eksponentę 
oraz bit znaku. Gdy konwertowana wartość powoduje niedomiar, eksponenta 
jest ustawiana na zero (0), a mantysa (zawierająca ukryty bit) jest 
przesuwana w prawo o odpowiednią liczbę pozycji. Spakowana liczba 16-
bitowa jest w tym przypadku zdenormalizowana. Bit znaku nie zmienia się.

Warunek

Opis

exp > 135

Wartość maksymalna

120 < exp ≤ 

135

Eksponenta docelowa składa się z najstarszego bitu 

eksponenty źródłowej połączonego z trzema 

najmłodszymi bitami eksponenty źródłowej. Spakowana 

mantysa jest zaokrąglana do 11 bitów mantysy 

źródłowej.

109 < exp ≤ 

120

Eksponenta docelowa jest równa zero. Mantysa (wraz z 

ukrytym bitem) jest przesuwana w prawo o odpowiednią 

liczbę pozycji i zaokrąglana do 11-bitów

exp ≤ 109 

Format spakowany zawiera same zera.

Exp – spolaryzowana eksponenta argumentu źródłowego.

background image

 

 

Konwersja formatów danych

Fn = FUNPACK Rx

Rozkaz konwertuje wartość w rejestrze Rn z 16-bitowego spakowanego 
formatu  zmiennoprzecinkowego do formatu 32-bitowego IEEE 754. Wynik 
jest zapisywany do rejestru Fn.

Warunek

Opis

0 < exp ≤ 15

Rozpakowana eksponenta składa się z trzech 

najmłodszych bitów eksponenty źródłowej rozszerzonej o 

jej najstarszy bit. Rozpakowana mantysa jest mantysą 

źródłową uzupełnioną zerami z prawej strony.

exp = 0

Wartość rozpakowanej eksponenty wynosi (120-N), gdzie 

N jest liczbą wiodących zer w źródłowej mantysie. 
Rozpakowana mantysa jest przesuniętą w lewo 

(unormowaną) mantysą źródłową, uzupełnioną 

odpowiednią liczbą zer z prawej strony. Ukryty bit jest 

usuwany.

Exp – spolaryzowana eksponenta argumentu 
źródłowego.

Bit znaku pozostaje niezmieniony we wszystkich 
przypadkach.

background image

 

 

Literatura

1. Analog Devices, ADSP-21065L SHARC

®

 DSP. User’s 

Manual, USA, 2003. str. 54 - 58 

Dokumentację można pobrać ze strony 

http://

www.analog.com

2. Jacek Augustyn, „Asemblery μC51, ADSP-21065L 

SHARC”, Wydawnictwa Naukowo-Dydaktyczne PWSZ 
w Tarnowie, Wyd. IGSMiE PAN, Kraków 2006, str. 13 
- 36


Document Outline