wykład z 11.I

Transkrypt

wykład z 11.I
Liczby zmiennopozycyjne. Kody Hamminga.
1
1.1
Liczby zmiennopozycyjne
Wprowadzenie
Najprostszym sposobem reprezentowania liczb rzeczywistych byªaby reprezentacja staªopozycyjna: zakªadamy, »e mamy n bitów na cz¦±¢ caªkowit¡ oraz m na cz¦±¢ uªamkow¡. Wad¡
takiego rozwi¡zania jest stosunkowo niewielki przedziaª, z którego liczby mo»emy reprezentowa¢:
cz¦sto podczas oblicze« u»ywamy zarówno warto±ci bardzo du»ych jaki i bardzo maªych. Dlatego
w komputerach przechowuje si¦ liczby rzeczywiste w postaci zmiennoprzecinkowej (ang. oating
point): ±m · be . Pami¦tamy osobno znak, mantys¦ m oraz wykªadnik e. Podstawa b jest
ustalona (zazwyczaj 2) i nie jest jawnie przechowywana.
W konkretnej reprezentacji na mantys¦ i wykªadnik przeznaczone s¡ odpowiednie, ustalone
liczby bitów. Zatem potramy reprezentowa¢ sko«czon¡ liczb¦ warto±ci. Im dªu»sza mantysa,
z tym wi¦ksz¡ dokªadno±ci¡ mo»emy reprezentowa¢ liczby. Z kolei im dªu»szy wykªadnik, tym
wi¦kszy przedziaª z jakiego liczby potramy reprezentowa¢.
Ka»d¡ liczb¦ mo»na zapisa¢ w postaci zmiennopozycyjnej na wiele sposobów. W konkretnych
reprezentacjach ustala si¦ posta¢ jednoznaczn¡, tzw. znormalizowan¡. Zazwyczaj przyjmuje
si¦, »e przecinek w mantysie ustawiony jest bezpo±rednio przed pierwsz¡ cyfr¡ znacz¡c¡ lub za
ni¡. W przypadku podstawy reprezentacji b = 2 pierwsza cyfra znacz¡ca 1 nie jest zazwyczaj
jawnie pami¦tana. Mówimy wtedy o ukrytej 1. Zauwa»my, »e przy takim zaªo»eniu nie mo»na
reprezentowa¢ liczby 0. Dlatego 0 jak i kilka innych warto±ci traktowanych jest wyj¡tkowo i
przypisywane s¡ im specjalne ci¡gi bitów.
1.2
Prosta modelowa reprezentacja
Rozwa»my prost¡ modelow¡ reprezentacj¦, w której liczby pami¦tane s¡ jako ci¡gi pi¦ciobitowe
zeemm, gdzie z oznacza bit znaku (0 - plus, 1 minus), ee to dwubitowy wykªadnik pami¦tany
z przesuni¦ciem o 2 (tzn. liczba x jest pami¦tana jako naturalny kod binarny liczby x + 2; reprezentacja z przesuni¦ciem jest standardem dla wykªadników), a mm to dwa bity znormalizowanej
mantysy. Zakªadamy, »e pierwsza jedynka w mantysie jest przed przecinkiem i jest ukryta, zatem
np. bity 01 reprezentuj¡ mantys¦ 1.01.
Rysunek 1: Liczby reprezentowalne w naszym modelu
1
Reprezentowalne warto±ci przedstawione s¡ na rysunku 1. Najmniejsza reprezentowalna warto±¢ dodatnia to 14 wstawiamy najmniejsz¡ mo»liw¡ mantys¦: 1.00 oraz najmniejszy wykªadnik: −2. Odpowiedni ci¡g bitów to 00000. Podobnie, najwi¦ksz¡ warto±ci¡ jest 3 12 : 011111.
Zauwa»my, »e pomi¦dzy reprezentowalnymi liczbami pojawiaj¡ si¦ ró»ne odst¦py im wi¦ksze
1
(gdy wykªadnik jest równy
warto±ci, tym wi¦ksze odst¦py. I tak najmniejszy odst¦p wynosi 16
1
1
-2 i zmieniamy mantys¦ o 4 , a najwi¦kszy 2 , gdy wykªadnik jest równy 2. Za to mniej wi¦cej
staªa jest wzgl¦dna odlegªo±¢: stosunek warto±ci liczby do warto±ci jej s¡siada. Zatem mo»emy
powiedzie¢, »e w naszej reprezentacji mamy mniej wi¦cej staªy wzgl¦dny bª¡d przybli»enia.
Jeszcze jedn¡ charakterystyczn¡ cech¡ reprezentacji zmiennopozycyjnej (znormalizowanej)
jest stosunkowo du»y odst¦p pomi¦dzy zerem a pierwsz¡ reprezentowaln¡ warto±ci¡. Przedziaª
pomi¦dzy zerem a pierwsz¡ warto±ci¡ reprezentowaln¡ nazywany jest niedomiarem (odpowiednio dodatnim lub ujemnym). Mówimy tak»e o nadmiarze (równie» dodatnim lub ujemnym) jest to przedziaª powy»ej (poni»ej) najwi¦kszej (najmniejszej) reprezentowalnej warto±ci.
O arytmetyce zmiennopozycyjnej b¦dziemy mówi¢ nieco dalej, teraz spróbujmy wykona¢ w
naszej reprezentacji proste dziaªanie a + b dla a = 0.7 i b = 1.8. Przeksztaª¢my nasze uªamki
na system binarny: a = 0.10110... ≈ 1.01 · 2−1 , b = 1.11001100... ≈ 1.11 · 20 . Poniewa» mo»emy
pami¦ta¢ tylko dwa bity mantysy, to ju» na pocz¡tku tracimy precyzj¦. Wyrównujemy wykªadniki
zwi¦kaszaj¡c pierwszy do 0: a = 0.10 · 20 . Ponownie tracimy precyzj¦ (w rzeczywisto±ci mo»e
by¢ ciut lepiej, bo obliczenia po±rednie wykonywane s¡ zazwyczaj na rozszerzonej reprezentacji
zawieraj¡cej dodatkowe bity). Dodajemy mantysy: a + b = 10.01 · 20 . Normalizujemy wynik
otrzymuj¡c a + b = 1.00 · 21 , czyli 2 . . .. Zauwa», »e dokªadny wynik dodawanie to 2.5 i jest on
dokªadnie reprezentowalny w naszym modelu.
Podobne bª¦dy napotykamy w prawdziwych implementacjach arytmetyki zmiennoprzecinkowej. Oto prosty przykªad ilustruj¡cy bª¡d wynikaj¡cy z braku dokªadnej reprezentacji dla
pewnych liczb. Uruchom nast¦puj¡ce programy w j¦zyku C:
int main{}
{
float suma=0;
long i;
for (i=0; i<100000; ++i)
suma=suma+0.6;
}
printf{"%f", suma);
int main{}
{
float suma=0;
long i;
for (i=0; i<100000; ++i)
suma=suma+0.5;
}
printf{"%f", suma);
W pierwszym przypadku wynik odbiega od oczekiwanego, w drugim jest poprawny. Wynika
2
to z faktu, »e 0.6, w przeciwie«stwie do 0.5 nie ma dokªadnej reprezentacji w systemie dwójkowym
(z ograniczon¡ liczb¡ bitów po przecinku).
1.3
Standard IEEE 754
Norma IEEE 754 jest powszechnie obowi¡zuj¡cym standardem w jakim przechowywane s¡ we
wspóªczesnych komputerach liczby zmiennopozycyjne. Oprócz formatu danych okre±la on te»
pewne zasady wykonywania oblicze« arytmetycznych, dzi¦ki czemu mo»na zaªo»y¢, »e ten sam
program, napisany np. w j¦zyku C, uruchomiony na ró»nych maszynach da te same rezultaty.
Mamy dwa formaty: 32-bitowy pojedynczej precyzji (float w C) i 64-bitowy (podwójnej
precyzji) (double w C). Dodatkowo deniowane s¡ formaty pomocnicze: rozszerzony pojedynczej
precyzji i rozszerzony podwójnej precyzji. Sªu»¡ one do wykonywania oblicze« po±rednich.
Format pojedynczej precyzji Mantysa: 23 bity (znormalizowana, ukryta 1 przed przecinkiem), wykªadnik: 8 bitów (przesuni¦cie 127), zakres liczb dodatnich: 10−38 , 10+38 , liczba reprezentowalnych warto±ci: 1, 98 · 231 .
Format podwó jnej precyzji Mantysa: 52 bity (znormalizowana, ukryta 1 przed przecinkiem), wykªadnik: 11 bitów (przesuni¦cie 1023), zakres liczb dodatnich: 10−308 , 10+308 , liczba
reprezentowalnych warto±ci: 1, 99 · 263 .
Niektóre sekwencje bitów s¡ interpretowane w specjalny sposób. S¡ to sekwencje z wykªadnikiem skªadaj¡cym si¦ z samych zer lub samych jedynek:
• same 0 w wykªadniku, same zera w mantysie: reprezentuj¡ 0 (dodatnie lub ujemne...)
• same 0 w wykªadniku, niezerowa mantysa: liczb zdenormalizowana (bit na lewo od przecinka jest zerem, wykªadnik wynosi -126 lub -1022); pomysª na redukcj¦ odst¦pu pomi¦dzy
zerem a najmniejsz¡ dodatni¡ (ujemn¡) liczb¡ reprezentowaln¡.
• same 1 w wykªadniku, same 0 w mantysie: plus lub minus niesko«czono±¢
• same 1 w wykªadnkiu, niezerowa mantysa:
2
NaN
(not a number) sytuacja wyj¡tkowa
Arytmetyka zmiennoprzecinkowa
Ze wzgl¦du na zupeªnie inn¡ reprezentacj¦ za operacje arytemtyczne na liczbach zmiennopozycyjnych odpowiedzialne s¡ zupeªnie inne obwody procesora ni» za operacje caªkowitoliczbowe.
2.1
Dodawanie i odejmnowanie
1. Wyrównywanie wykªadników
2. Dodawanie lub odejmnowanie mantys
3. Normalizowanie wyniku.
4. Zaokr¡glanie wyniku.
2.2
Mno»enie i dzielenie
1. Dodawanie lub odejmowanie wykªadników
2. Mno»enie lub dzielenie mantys, ustawianie znaku
3
3. Normalizowanie wyniku
4. Zaokr¡glanie
Schemat ukªadu realizuj¡cego dodawanie przedstawiony jest na rysunku 2. Ukªad steruj¡cy
(control ) generuje sygnaªy steruj¡ce caªym procesem na podstawie ró»nicy wykªadników, a nast¦pnie wyniku dodawania mantys.
Rysunek 2: Schemat ukªadu dodaj¡cego liczby zmiennoprzecinkowe
3
Kody Hamminga
Rozwa»my kody dwóch znaków (tej samej dªugo±ci). Mówimy, »e odlegªo±¢ Hamminga pomi¦dzy nimi wynosi d, je±li ró»ni¡ si¦ na dokªadnie d bitach. Rozwa»my teraz dowolny kod znakowy
4
(kodem znakowym b¦dziemy nazywali formalnie funkcj¦, która znakom z pewnego ustalonego
zbioru przyporz¡dkowuje ci¡gi bitów (zazwyczaj) ustalonej dªugo±ci). Mówimy, »e ma on odlegªo±¢ Hamminga równ¡ d, je±li d jest minimaln¡ odlegªo±ci¡ Hamminga pomi¦dzy reprezentacjami
znaków w tym kodzie. Np. kod ASCII ma odlegªo±¢ Hamminga równ¡ 1 zmiana pojedynczego
bitu w jednym znaku kodu daje nam inny, poprawny znak.
3.1
Bity parzysto±ci
Do ka»dego zakodowanego znaku dodajemy bit, tak aby sumaryczna liczba jedynek byªa parzysta. Zauwa», »e np. kod ASCII poszerzony o bit parzysto±ci ma odlegªo±¢ Hamminga równ¡ 2 zmiana pojedynczego bitu prowadzi do uzyskania niepoprawnego ci¡gu bitów. W efekcie potramy wykrywa¢ pojedyncze przekªamania bitów. Nie potramy ich jednak poprawia¢ nasz kod
jest kodem detekcyjnym.
3.2
Kod detekcyjno-korekcyjny (kod Hamminga)
Chcemy zaprojektowa¢ kod, który potra nie tylko wykrywa¢ pojedyncze przekªamania, ale
tak»e automatycznie je poprawia¢. Wymaga¢ on b¦dzie znacznej nadmiarowo±ci: zaªó»my, »e
oryginalny kod jest 7-bitowy. Pojedyncze przekªamania bitu mog¡ prowadzi¢ do 7 ró»nych sªów.
Ka»de z nich musi by¢ jednoznacznie zwi¡zne z ci¡giem oryginalnym. Tak naprawd¦, potrzebujemy zatem 8 ró»nych ci¡gów bitów dla jednego znaku wyj±ciowego alfabetu.
Rozwa»my na pocz¡tek prosty przykªad. Niech poprawnymi ci¡gami znaków w naszym kodzie
korekcyjnym b¦d¡: {00000, 01011, 10110, 11101}. Odlegªo±¢ Hamminga dla tego kodu wynosi 3.
Zauwa»my, »e wystarczy to do korygowania pojedynczych bª¦dów (oraz wykrywania podwójnych). Zaªó»my, »e odczytali±my sªowo 10000. Nie jest to poprwne sªowo naszego kodu, musi
zatem zawiera¢ co najmniej jeden bª¡d. Jakie s¡ jego odlegªo±ci od sªów poprawnych? 1, 4, 2, 3.
Je±li zatem nast¡piªo pojedyncze przekªamanie, to wysªanym ci¡giem musiaª by¢ 00000.
Zaªó»my ogólnie, »e kod wyj±ciowy jest m-bitowy. Je±li dodamy r bitów nadmiarowych, to
musi zachodzi¢ nast¦puj¡ca relacja: 2m (m + r + 1) ≤ 2m+r , a wi¦c m + r + 1 ≤ 2r . Dlaczego:
mamy 2m sªów (znaków) oryginalnych; pozycji na których mo»e doj±¢ do przekªamania bitu jest
m + r (do przekªamania mo»e doj±¢ tak»e na bitach dodatkowych!), st¡d kod korekcyjny musi
mie¢ 2m (m + r + 1) sªów, a mo»e ich mie¢ maksymalnie 2m+r .
Np. je±li m jest równe 4, to r musi by¢ równe co najmniej 3. Jak zbudowa¢ kod korekcyjny?
Oto prosty algorytm:
1. Okre±lamy liczb¦ bitów nadmiarowych r, numerujemy n bitów (n = m + r) od prawej do
lewej zaczynaj¡c od 1.
2. Bity, których numery s¡ pot¦gami dwójki to bity nadmiarowe, które b¦d¡ bitami parzysto±ci
dla pewnych innych bitów. Pozostaªe to bity danych.
3. Bit b jest sprawdzany przez bity bi1 , bi2 , . . . , bik , dla których bi1 + bi2 + . . . , bik = b i ij s¡
pot¦gami dwójki.
Skonstuujemy kod dla 8-bitowego kodu ASCII. Z podanego wzoru wynika, »e r musi
by¢ równe co najmniej 4. Zatem pojedynczy znak b¦dzie opisywany przez 12-bitów, z czego bity
8
4 2 1.
1,2,4,8 b¦d¡ bitami nadmiarowymi:
Bit 1 b¦dzie bitem parzysto±ci dla bitów: 1,3,5,7,9,11; bit 2 dla bitów 2,3,6,7,10,11, bit 4 dla 4,5,6,7,12, bit 8 dla 8,9,10,11,12 (przypominamy: bit 6 jest kontrolowany przez bity 2, 4,
bit 11 przez bity 1, 2, 8, bit 10 przez bity 2, 8).
Przykªad.
5
Zakodujmy liter¦ K (ASCII: 01001011): 010011010110. Wprowad¹my bit na bicie b9 : 010111010110.
Bª¦dy parzysto±ci wykrywaj¡ bity b1 i b8 . Kontroluj¡ one wspólnie pozycje 9 i 11, na której±
z nich musi by¢ zatem bª¡d. Jest to pozycja 9, bo przy 11 bª¡d wskazywaªby tak»e bit b2 .
Najpro±ciej jest zsumowa¢ indeksy bª¦dnych bitów parzysto±ci: 1 + 8 = 9.
6