Kodowanie liczb rzeczywistych
Transkrypt
Kodowanie liczb rzeczywistych
Zapis sta opozycyjny W obliczeniach zachodzi czasami potrzeba pos enia si liczbami posiadaj cymi cz amkow . W ród takich liczb wyró niamy takie, które posiadaj sko czon ilo miejsc po przecinku lub rozwiniecie okresowe (liczby wymierne) oraz takie, które posiadaj rozwini cia niesko czone nieokresowe (liczby niewymierne). W przypadku takich liczb komputer musi ywa przybli , a ich dok adno zale y od ilo ci miejsc po przecinku. Zapisuj c liczb rzeczywist , piszemy np. tak: 190,625. Kilka cyfr tworzy normaln cz ca kowit liczby, dalej wyst puje przecinek ( w programowaniu – kropka ), za po nim kolejne cyfry, które tworz cz u amkow . W kodzie binarnym liczb t zapisujemy jako 10001110,101. Inny przyk ad pokazuje liczb 16 bitow : 11111111,11111111 255 255 256 255 1 256 1 128 1 64 1 32 1 256 1 16 1 4 1 2 255,99609375 Gdyby zapisywa liczby w taki sam sposób, by oby mo liwe bezpo rednie przechowywanie ich w pami ci komputera. Pewna ilo bitów by aby uznawana za cyfry dwójkowe przed przecinkiem, a pozosta e bity za cyfry po przecinku. Taki kod – z umieszczonym na sta e przecinkiem – to kod sta oprzecinkowy albo sta opozycyjny. Kod ten ma jednak wiele wad: – ma y zakres liczb mo liwych do zakodowania – ma a dok adno – trudny do oszacowania b d oblicze . (precyzja) cz ci u amkowej Z tych powodów zapis sta opozycyjny nie jest u ywany dla liczb rzeczywistych. Zapis zmiennopozycyjny W wielu dziedzinach liczby zapisuje si w notacji naukowej L m 10 c , gdzie m 1;10 za c jest liczba ca kowit . Na przyk ad: – 1245,236 = 1,245236·103; – 0,00236 = 2,36·10-3. W takim zapisie mamy dwie liczby: m – liczba znormalizowana i c, która mówi o ile miejsc nale y przesun przecinek. Sposób ten jest cz sto u ywany do zapisu liczb bardzo du ych lub bardzo ma ych. Np. zamiast 690 000 000 000 mo na napisa krócej 6,9·1011 lub zamiast 0,000 000 000 000 034 piszemy 3,4·10-11 . Z powodu zmiany po enia przecinka, kod ten nazywamy kodem zmiennoprzecinkowym lub zmiennopozycyjnym i oznaczamy FP2. Metoda ta znalaz a równie zastosowanie w informatyce i jest u ywana do zapisu liczb rzeczywistych w wersji binarnej. Wzór b dzie podobny do poprzedniego: L 1 z m 2c . Parametr m (mantysa) i c (cecha) maj takie samo znaczenie jak wcze niej, za z oznacza bit znaku (0 czyli „+” lub 1 czyli „ - ” ). Kodowanie w FP2 Do liczby zapisanej w kodzie FP2 zawsze trzeba poda , ile bitów zaj tych jest przez mantys , a ile przez cech . Oto budowa przyk adowego 16-bitowego kodu FP2: znak bit wag a Cecha mantysa 15 14 13 12 11 10 9 z -16 8 2-1 2-2 2-3 2-4 2-5 2-6 2-7 2-8 2-9 2-10 Jako przyk ad zapisz 4 2 liczb 1 8 7 6 5 4 3 2 1 0 1984,0415 w kodzie FP2 o budowie przedstawionej w powy szej tabelce. W tym celu wykonujemy nast puj ce kroki: – Ustalamy znak. Liczba jest dodatnia, wi c z= 0; – Gdyby by a ujemna, warto ci bitu by oby 1, dalej rozpatrywaliby my ju liczb przeciwn – czyli pozbawion tego minusa (dodatni ). – Zapisujemy t liczb w normalnym systemie binarnym. Jako docelow liczb bitów mantysy przyjmujemy 11 – o jeden wi cej, ni mo e przechowa . 1984 : 2 0 0,0415 · 2 0 992 : 2 0 0,083 · 2 0 496 : 2 0 0,166 · 2 0 248 : 2 0 0,332 · 2 0 124 : 2 0 0,664 · 2 1 62 : 2 0 0,328 · 2 0 31 : 2 1 0,656 · 2 1 15 : 2 1 0,312 · 2 0 7 : 2 1 0,624 · 2 1 3 : 2 1 0,248 · 2 0 1 : 2 1 0,496 · 2 1 0 Przy zamianie cz ci u amkowej ostatni bit zosta zaokr glony do 1. Po obliczeniach nasza liczba ma posta : 1984,0415 11111000000,00001010101. – Dokonujemy normalizacji – czyli przesuwamy przecinek tak, aby przed przecinkiem znajdowa a si tylko jedna niezerowa cyfra. Otrzymujemy: 1,111100000000001010101 – Jedyn mo liw niezerow cyfr w systemie dwójkowym jest 1. Skoro przed przecinkiem zawsze stoi pojedyncza jedynka, mo emy zapami ta , e ona tam jest i oszcz dzi jednego bitu nie zapisuj c jej. – Ostatecznie mantys utworz kolejne cyfry spisane od przecinka dot d, dok d zmieszcz si w przyj tej d ugo ci mantysy (u nas 10 bitów). Gdyby my mi li mniej cyfr, ni jest potrzebne, mantys uzupe nia si zerami z prawej strony. Czyli mantysa ma warto – Teraz mo na zaj m = 1111000000 si my si cech . Poniewa przecinek przesun li my o 10 miejsc w lewo, wi c jako cech c trzeba b dzie zapisa liczb 10 w kodzie U2, który w naszym przyk adzie Trzeba odró ni ujemn warto b dzie sk ada si z pi ciu bitów. cechy od ujemnej warto ci mantysy. Tutaj obydwie te liczby s dodatnie, ale równie dobrze mog yby by ujemne. Ujemna mantysa oznacza, e kodowana liczba jest ujemna. Ujemna cecha oznacza, e podczas normalizowania przesuwamy przecinek w prawo. W naszym wypadku cecha wygl da tak: (10)10= (01010)U2. Cecha znak Mantysa bit 15 14 13 12 11 10 9 8 waga z -16 8 4 2 1 2-1 2-2 2-3 2-4 2-5 2-6 2-7 2-8 2-9 2-10 liczba 0 0 1 0 1 0 1 1 7 1 6 1 5 0 4 0 3 0 2 0 1 0 0 0 – Jak wida , mantys zapisuje si w postaci liczby naturalnej i osobnego bitu znaku, a cech za pomoc kodu uzupe nie U2. Co wi cej, na schemacie budowy kodu FP2 wida , e znak mantysy jest od samej mantysy oddzielony cech . Mamy ju wszystkie cz ci liczby. Zapisujemy j w tabelce: Nasza liczba ma posta : 1984,0415 = (0 01010 1111000000)FP2 Dekodowanie Jako przyk ad rozkodujemy otrzyman liczb . Pami taj c, o znaczeniu ka dej grupy bitów, rozpatrujemy poszczególne elementy: – z = 0, a wi c mamy: (-1)0; – m = 1111000000, czyli mamy: 2-1 + 2-2 + 2-3 + 2-4; – c = (01010)U2 = 10, a wi c mamy 210; Zgodnie ze wzorem L 1 z m 2 c , otrzymujemy L=(-1)0·(20+2-1+2-2+2-3+2-4)·210. Pogrubiony sk adnik 20 odpowiada jedynce przed przecinkiem, któr zapami tali my i nie zapisali my w zakodowanej liczbie, oszcz dzaj c jeden bit. Po wymno eniu zawarto ci nawiasu przez 210 i pomini ciu liczby (-1)0=1 otrzymujemy: L = 210 + 29 + 28 + 27 + 26 = 1024 + 512 + 256 + 128 + 64 = 1984. Otrzymany wynik nie jest identyczny jest z liczb 1984,0415, która mieli my na pocz tku. d w obliczeniach powsta podczas zaokr glenia przy zamianie cz ci u amkowej na kod binarny. Precyzja liczby zale y te od ilo ci znaków przeznaczonych na mantys , a zakres liczby od ilo ci znaków przeznaczonych na cech . Dlatego, aby kodowanie by o bardziej precyzyjne do zapisu liczb zmiennopozycyjnych u ywane s kody 32, 64, nawet 80-bitowe. Liczby 32-bitowe oferuj zakres od 1,5·10-25 do 3,4·1038 po stronie dodatniej i podobny zakres po stronie ujemnej. W j zykach C++ i Java liczby o tym zakresie maj nazw float, w Delphi – single, za w starszych wersjach Pascala – real . Liczby te s okre lane jako liczby o pojedynczej precyzji. Liczby 64-bitowe, zarówno po stronie ujemnej, jak i dodatniej posiadaj zakres od 5,0·10 -324 do 1,7·10308. S nazywane s jako liczby o podwójnej precyzji i w wi kszo ci j zyków (C++, Java , Delphi) okre lane nazwa double. Liczby 80-bitowe nazywane s long double (C++) lub exetendend (Delphi). Maj one zakres warto ci dodatnich i ujemnych od 3,4·10-4932 do 1,1·104932 . Standard kodu FP2 przewiduje dodatkowo warto ci specjalne: – Maksymalna warto cechy przy zerowej warto ci mantysy daje w zale no ci od bitu znaku mantysy warto zwan –INF lub +INF (oznaczaj odpowiednio - i + ). – Maksymalna warto cechy przy jakiejkolwiek niezerowej warto ci mantysy to tzw. NaN ( Not a Number), czyli warto , która nie jest poprawn liczb .