Na tle poprawy egzaminu DSP, kurs ETEK00043W
WTO/ŚRO
K
2
2016-02-01 09:20
1
1 / 3
KU LEPSZEJ INTERPRETACJI KONWERSJI;
Rozpatrzmy pytanie, o konwersję na HEX U2, liczby – 4,486881 na 8-miu bitach i3q5, będącej
wynikiem mnożenia dwóch liczb WA*WB, analogicznie kodowanych [WA= −2,751 i WB= 1.631].
Nawiązują do stylu pytań w egzaminie kodowanie ma być wykonane najpierw dla obu liczb na 8-miu
bitach krótkiego rejestru, a potem wynik miał być podany w formie, w jakiej wystąpi w 16-bitowym
akumulatorze procesora po operacji mnożenia. (trochę wymyślony ten procesor, ale za to
odpowiedzi mają szansę mieścić się w małej tabelce .)
Tymczasem spróbujmy „rozebrać” problem;
1. Zacznijmy od liczby WA= −2,751. Tutaj rzeczywiście jest drobny „kłopot”, bo wartość trafia
między punkty bitów na osi liczb, czyli trzeba wybrać któryś zaokrąglając lub obcinając
wartość.
2. U2, i3q5 pozwala kodować liczby z zakresu <−4, +3,96875>. Czy może być zatem podejrzenie
o „przekroczeniu zakresu” ?. Przecież ta wartość jest z pobliża -3, zatem z wnętrza
reprezentowanego przedziału wartości liczb. (patrz ilustracja w p.4b.)
3. A teraz bliżej do kodowania. −2,751 * 2^5 = −88,032 i używając np. kalkulatora konwersja
na HEX po obcięciu części ułamkowej => 0xA8, czyli 1010 1000b. I tutaj warto skomentować
pytania „ciąć czy zaokrąglać”? Jeśli patrzeć na temat z punktu widzenia wartości to
zaokrąglanie do kolejnej wartości -89 nie ma tutaj uzasadnienia. Ale temat jest szerszy. Nie
można wskazać, co jest ogólnie bardziej prawidłowe, obcinanie czy zaokrąglanie. Ważna jest
świadomość tego wyboru i wynikających z tego konieczności testowania skutków wyboru.
4. I parę słów bliższego objaśnienia by nie zarzucono skrótów i ogólników
a. LSB dla tego kodowania wynosi 2^-5 = 1/32 = 0,03125
b. Zatem mamy układ „na pionowo ustawionej osi liczbowej”
(bo tak wygodniej przygotować ilustrację )
DEC
BIN
HEX
Uwagi
+3,968..
0111 1111
0x7F
+MAX
…
…
…
…
+0,03125
00 0001
0x01
+1 LSB
0
00 0000
0
−0,03125
11 1111
0x3F
-1 LSB
…
−2,75
1010 1000
0xA8
…
<--------
? −2,751 To wartość pomiędzy, bliżej -2,75
−2,78125
1010 0111
0xA7
…
…
−4
1000 0000
0x80
-MAX
Na tle poprawy egzaminu DSP, kurs ETEK00043W
WTO/ŚRO
K
2
2016-02-01 09:20
2
2 / 3
c. Nasza kodowana wartość trafia między bitami, zatem każda uwaga o „kłopocie z
rozdzielczością” jest zasadna, ale wynik przecież istnieje
d. Nie są zaś umotywowane uwagi o „niemożliwości reprezentacji”, bo przecież w
rzeczywistości problemów technicznych, choćby przetwarzania analogowo
cyfrowego (A/C) do rzadkości należy „trafienie idealnie w bit”. To typowa sytuacja
kwantyzacji, kiedy trzeba podjąć decyzję, któremu bitowi przypisać poziom. Tym
razem nie ma specjalnego kłopotu. Ale gdyby wartość wypadła w środek przedziału
między bitami równoprawne były by odpowiedzi z wartością każdego z sąsiednich
poziomów.
e. I jeszcze ostatnia uwaga odnośnie wątpliwości wyrażanych czasami w rodzaju
„przekroczenie zakresu…” czy „nie mieści się w reprezentacji…” albo „nie da się
przedstawić bez przybliżenia”. Warto starannie przemyśleć problem i brak
uzasadnienia dla tych stwierdzeń
5. W przypadku kodowania samej liczby −4,486881 w U2 na 8-miu bitach i3q5 z uwagami o
przekroczeniu zakresu trzeba się zgodzić - zakres reprezentacji dla i3q5 to przecież (−4; ~4)].
Ale i tym razem można przecież podać zawartość tego za krótkiego rejestru (0111 0001b), z
istotną uwagą o pominięciu najstarszych bitów, które się nie zmieściły się, bo liczba jest poza
zakresem reprezentacji (mówiąc z lekka na wesoło – wylała się poza rejestr (1) (
0111 0001
b)).
Nieprawidłowość widać zresztą natychmiast, bo z najstarszego bitu (tej zielonej części)
wynika jak gdyby była to liczba dodatnia a przecież jest ujemna.
6. No i wreszcie problem „jak ten wynik mnożenia będzie wyglądał w „długim” akumulatorze”?.
a. Oczywiście tutaj nie ma już problemu z „przekroczeniem zakresu”, bo skąd?
b. Akumulator ma więcej bitów, więc również powinien zmniejszyć się (a może nawet
zniknąć) problem małej rozdzielczości. (To jest zresztą jednym z podstawowych
argumentów za wykorzystaniem tak wydłużonych akumulatorów w DSP)
c. Liczba jest wynikiem mnożenia przez siebie liczby q5 * q5, zatem wynik będzie q10
(niedowiarkom proponuję przypomnienie sobie sposobu wyznaczania położenia
przecinka przy mnożeniu „pisemnym” dziesiętnych liczb ułamkowych)
d. Zatem −4,486881 * 2^10 = −4594,45661…(problem rozdzielczości nie znika, jesteśmy
prawie w połowie między bitami!) nie trafiamy idealnie w bit, co daje w efekcie dwie
prawie równoważne odpowiedzi 0xEE0E (dla −4594) i 0xEE0D (dla −4595), czyli
odpowiednio 1110 1110 0000 1110B i 1110 1110 0000 1101B. Trzeba zaznaczyć, że
taka postać wyniku będzie dla wyłączonego mechanizmu korekcyjnego przesunięcia
(FRCT=0).
Na tle poprawy egzaminu DSP, kurs ETEK00043W
WTO/ŚRO
K
2
2016-02-01 09:20
3
3 / 3
e. Pozostaje jeszcze pytanie gdzie w tym wyniku jest efekt kodowania na 8-bitach (z
punktu 5)? Zaznaczyłem go żółtym tłem odpowiednio
1110 1110 0000 1110B i 1110 1110 0000 1101B.
Proszę dostrzec przesunięcie o 5 bitów w lewo od LSB w akumulatorze (mnożyliśmy
prze liczbę kodowaną q5!). Przy okazji widać wyraźnie potrzebę tak dużego
(długiego) akumulatora. Przy wielokrotnym sumowaniu (MAC) te końcówki wartości
zaczynają ważyć w wynikach.
f. I jeszcze ostatnia uwaga. Włączenie bitu FRCT=1 spowoduje korekcyjne przesunięcie
wyniku o jeden bit w lewo całości akumulatora i uzupełnienie zerem na LSB.
Czyli 1101 1100 0001 1100B i 1101 1100 0001 1010B.
Mam nadzieję, że nieco wyjaśniłem te w sumie niezbyt trudne drobiazgi.