Stało- i zmiennopozycyjna
reprezentacja liczb
binarnych
Zapis stałoprzecinkowy
Aby umożliwić również zapis liczb ułamkowych,
musimy rozszerzyć wagi pozycji w stronę
ujemnych potęg podstawy. Część ułamkową
oddzielimy od części całkowitej zapisu za
pomocą znaku przecinka.
waga p
n-1
… p
2
p
1
p
0
, p
-1
p
-2
… p
-m
cyfry a
n-1
… a
2
a
1
a
0
, a
-1
a
-2
… a
-m
Wbrew pozorom obliczenie wartości tak
zapisanej liczby wcale nie jest trudniejsze.
Zasada nie zmienia się i musimy sumować
kolejne iloczyny wartości cyfr przez wartości
wag pozycji. Obliczenia rozpoczynamy od
pierwszej pozycji po prawej stronie.
a
n-1
...a
2
a
1
a
0
, a
-1
a
-2
...a
-m
= a
-m
p
-m
+ ... + a
-2
p
-
2
+ a
-1
p
-1
+ a
0
p
0
+ a
1
p
1
+ a
2
p
2
+ ... + a
n-1
p
n-
1
W przypadku liczb binarnych p=2.
Przykład
Obliczyć wartość liczby dwójkowej 11101,011
B
11101,011
B
= 1 * 2
-3
+ 1 * 2
-2
+ 0 * 2
-1
+ 1 * 2
0
+ 0 *
2
1
+ 1 * 2
2
+ 1 * 2
3
+ 1 * 2
4
11101,011
B
= 1 * 1/8 + 1 * 1/4 + 0 * 1/2 + 1 * 1 + 0 *
2 + 1 * 4 + 1 * 8 + 1 * 16
11101,011
B
= 1/8 + 1/4 + 1 + 4 + 8 + 16
11101,011
B
= 29 3/8
Zamiana ułamka dziesiętnego na wartość binarną
Metoda zamiany jest dwuetapowa.
Najpierw zamieniana jest część całkowita ułamka.
Wtedy stosuje się cykliczne dzielenie przez 2 i
sprawdzanie reszty z dzielenia.
Następnie zamienia się część ułamkową. Zamiana
polega na cyklicznym mnożeniu ułamka razy 2 i
sprawdzaniu, czy wynik nie jest większy lub równy 1.
Jeżeli jest >= 1 to wyznaczony bit części ułamkowej
jest także równy jeden. Do dalszych obliczeń bierze
się część ułamkową wyniku.
Czasem zamiana części ułamkowej na postać binarną
prowadzi do osiągnięcia nieskończenie długiej
kombinacji zer i jedynek. Dlatego zawsze należy
przyjąć dodatkowy warunek - ile bitów jest
przeznaczone na zapis części ułamkowej. Obliczenia
wykonuje się wtedy dotąd, aż osiągnie się potrzebną
liczbę bitów
Przykład
Zamienić ułamek 12.7 na postać binarną 8-bitową,
gdzie przecinek jest po czterech bitach (4b,4b).
Etap 1
Część całkowita 12
D
to w postaci dwójkowej 1100
B
.
Etap 2
Obliczanie części ułamkowej wygląda następująco:
0.7 * 2 = 1.4 -> 1
0.4 * 2 = 0.8 -> 0
0.8 * 2 = 1.6 -> 1
0.6 * 2 = 1.2 -> 1
0.2 * 2 = ….. – tutaj przerywamy obliczenia
i stąd 12.7
D
= 1100,1011
B
Zapis zmiennopozycyjny
Z zapisem zmiennoprzecinkowym można
spotkać się w przypadkach, gdzie przy jego
pomocy przedstawia się albo bardzo duże
wartości, albo bardzo małe. Zapis ten nazywa
się często notacją naukową, np.:
Gwiazda Proxima Centauri znajduje się w
odległości 9460800000000 [km], czyli
9,4608 * 10
12
.
Masa elektronu wynosi m
e
=
0,00000000000000000000000000091095
[g], czyli 9,1095 x 10
-28
[g]
Liczba zapisana w systemie
zmiennoprzecinkowym składa się z dwóch
części: liczby stałoprzecinkowej, której
wartość bezwzględna jest mniejsza od
wartości podstawy systemu pozycyjnego oraz
z podstawy podniesionej do pewnej potęgi
zwanej wykładnikiem lub cechą. Wartość
liczby jest równa iloczynowi części
stałoprzecinkowej i wykładniczej:
w = m * p
e
,
m - mantysa, p - podstawa systemu, e -
wykładnik potęgowy.
Obliczanie wartości dwójkowej liczby
zmiennoprzecinkowej
Przyjmijmy następujące ustalenia. Dwójkowa liczba
zmiennoprzecinkowa zbudowana jest z dwóch
części: z mantysy m i wykładnika potęgowego e
(zwanego również cechą). Ponieważ podstawa
systemu liczenia jest znana i wynosi 2, więc nie
ma potrzeby umieszczać jej w zapisie liczby.
Mantysa m jest liczbą stałoprzecinkową na moduł
mniejszą od 1. Wykładnik e jest liczbą całkowitą.
Obie części mogą być zapisane np. w kodzie U2
lub kodzie ZM.
wykładnik
e
mantysa
m
n-bitów
m-bitów
liczba
zmiennoprzecinkowa
Wartość liczby liczymy wg wzoru:
w = m * 2
e
Obliczenia
Niech wykładnik zbudowany będzie z n bitów.
Ponieważ jest to liczba całkowita, więc jej wartość
obliczamy w poznany wcześniej sposób:
n-2
e = a
n-1
a
n-2
a
n-3
...a
2
a
1
a
0
= a
n-1
(-2
n-1
) +
a
i
2
i
i=0
czyli zgodny z zapisem dla liczb w kodzie U2
Mantysa ma być ułamkiem mniejszym na moduł od 1.
Jeśli jest zbudowana z m bitów, to waga najstarszego
bitu wynosi w kodzie U2 -2
0
, czyli -1. Następna pozycja
ma wagę 2
-1
, czyli 1/2, itd. Rozpiszmy to następująco:
m = a
n-1
, a
n-2
a
n-3
...a
2
c
1
a
0
= a
n-1
(-2
0
) + a
n-2
2
-1
+ a
n-3
2
-2
+
... + a
2
2
-n+3
+ a
1
2
-n+2
+ a
0
2
-n+1
Dla przykładowej, 4-bitowej mantysy wzór ten przyjmie
następującą postać:
m = a
3
, a
2
a
1
a
0
= a
3
(-2
0
) + a
2
2
-1
+ a
1
2
-2
+ a
0
2
-3
m = a
3
, a
2
a
1
a
0
= a
3
* -1 + a
2
* 1/2 + a
1
* 1/4 + a
0
*
1/8
m = a
3
, a
2
a
1
a
0
= - a
3
+ a
2
/ 2 + a
1
/ 4 + a
0
/ 8
Przykład – liczba 8-bitowa, po 4 bity na mantysę i
wykładnik
00110111
ZP
= ...?
D
Najpierw wydobywamy z liczby wykładnik e i mantysę m:
0011 0111
e m
Teraz obliczamy kolejno wartość wykładnika i mantysy:
e = 0011
U2
= 0 * (-8) + 0 * 4 + 1 * 2 + 1 * 1
e = 0011
U2
= 2 + 1
e = 0011
U2
= 3
D
m = 0,111
U2
= - 0 + 1/2 + 1/4 + 1/8
m = 0,111
U2
= 1/2 + 1/4 + 1/8
m = 0,111
U2
= 4/8 + 2/8 + 1/8
m = 0,111
U2
= 7/8
Mając e i m, podstawiamy do wzoru i otrzymujemy
00110111
ZP
= 7
D
Obliczanie reprezentacji zmiennoprzecinkowej
Mamy określony format zapisu liczby
zmiennoprzecinkowej w systemie dwójkowym.
Wiemy, że wykładnik ma zawierać n - bitów w
kodzie U2, a cecha m bitów w zapisie
stałoprzecinkowym U2.
Przykład prostego systemu zmiennoprzecinkowego, w
którym wykładnik i cecha mają po 4 bity długości.
Przykładową liczbą niech będzie wartość 56:
56
D
= 111000
B
= 0111000
U2
- dodajemy zero, aby
zaznaczyć, iż jest to liczba dodatnia.
Zapiszemy wzór obliczeniowy, a następnie będziemy
przesuwać w prawo cyfry mantysy dodając
jednocześnie 1 do wykładnika, aż znacząca jedynka
znajdzie się na pozycji o wadze 1/2.
0111000,000
U2
=2
0000U2
011100,000
U2
=2
0001U2
- przesuwamy cyfry mantysy
w prawo, zwiększamy wykładnik
01110,000
U2
=2
0010U2
0111,000
U2
=2
0011U2
011,100
U2
=2
0100U2
01,110
U2
=2
0101U2
0,111
U2
=2
0110U2
- kończymy, mantysa jest
znormalizowana
Otrzymujemy więc:
e = 0110 = 6
D
m = 0,111 = 7/8, sprawdzamy: 7/8 x 2
6
= 448/8 =
56
Dla liczby 9
D
9
D
= 1001
B
= 01001
U2
01001,000
U2
=2
0000U2
0100,100
U2
=2
0001U2
010,010
U2
=2
0010U2
01,001
U2
=2
0011U2
- ostatnia jedynka zaraz zniknie!!!
0,100
U2
=2
0100U2
- koniec
Otrzymaliśmy wynik:
e = 0100 = 4
D
m = 0,100 = 1/2, sprawdzamy: 1/2 * 2
4
= 16/2 = 8
9
D
=? 01000100
ZP