Procesory sygnałowe
Wykład 2
Liczby stało- i zmienno-
przecinkowe
Dr inż. Robert
Wielgat
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
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.
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
„-”
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
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
„-”
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
)
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
N
< L <
2
N
– 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
N
.
2
N
L’ = L + a
N
.
2
N
=
-103,279 +128 = 24,721
3) Zamieniamy część całkowitą i część ułamkową liczby L’
na postać binarną
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
7
.
2
7
= -128
1
0
0
dopisanie
zer
24,72
1
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
Liczby zmiennoprzecinkowe
Za pomocą liczb stałoprzecinkowych można reprezentować
liczby z precyzją
2
–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.
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
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
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
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
Reprezentacje liczb
zmiennoprzecinkowych na procesorze
ADSP-21065L
Liczby zmiennoprzecinkowe są reprezentowane na
procesorze ADSP-21065L w formacie znak-moduł.
Reprezentacje liczb
zmiennoprzecinkowych na procesorze
ADSP-21065L
Liczby zmiennoprzecinkowe są reprezentowane na
procesorze ADSP-21065L w formacie znak-moduł.
Wartości liczb zmiennoprzecinkowych
pojedynczej precyzji
1) +
,
f
22
f
0
= 0,
e=255,
s=0,
2) -
,
f
22
f
0
= 0,
e=255,
s=1,
3) NaN (Not a Number), f
22
f
0
0,
e=255,
s={0,1},
4) (-1)
S
(1.f
22-0
)2
e-127
,
f
22
f
0
- dowolne,
1
e
254,
s={0,1},
5) Zero,
f
22
f
0
= 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
] )
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
.
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
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.
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.
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ą.
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.
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).
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.
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.
Literatura
1. Analog Devices, ADSP-21065L SHARC
®
DSP. User’s
Manual, USA, 2003. str. 54 - 58
Dokumentację można pobrać ze strony
2. Jacek Augustyn, „Asemblery μC51, ADSP-21065L
SHARC”, Wydawnictwa Naukowo-Dydaktyczne PWSZ
w Tarnowie, Wyd. IGSMiE PAN, Kraków 2006, str. 13
- 36