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 .