Stało- i zmiennopozycyjna
reprezentacja liczb
binarnych
₥@ʁ€₭ ‽ud3£k0
Urządzenia Techniki Komputerowej
Reprezentacja liczb w
systemie komputerowym
• Reprezentacja liczb w systemie
komputerowym polega na zamianie
zbioru liczb rzeczywistych na
odpowiadające im liczby binarne.
– Chcąc zapisać liczby w systemie
komputerowym musimy dokonać
pewnego uproszczenia.
Reprezentacja liczb w
systemie komputerowym
• Ile jest liczb rzeczywistych?
• Ile liczb zmieści się w pamięci
komputera?
Odwzorowanie liczb w
systemie komputerowym
• Chcąc zapisać liczby w systemie komputerowym
musimy dokonać pewnego uproszczenia.
Liczby
rzeczywiste
Liczby w komputerze
R
1
R
2
R
3
R
4
R
6
R
7
R
5
K
1
K
2
K
3
K
4
K
5
Reprezentacja liczb
całkowitych
• w komputerze liczby przechowywane są w
pamięci lub w rejestrach procesora o
ustalonej liczbie pól, np. 8 lub 16
• Problemy
– Problem przepełnienia - gdy liczba jest zbyt
duża, by móc ją zapisać przy pomocy np. 8
bitów
– Problem niedopełnienia - gdy liczba jest za
mała, by ją zapisać przy pomocy np. 8 bitów
– Jak zapisywać liczby ujemne?
– Pewne liczby musimy pominąć – które i według
jakiego algorytmu?
Reprezentacje liczb z
częścią ułamkową
• Zapis stałoprzecinkowy
• Zapis zmiennoprzecinkowy
Binarna liczna stałoprzecinkowa
• Binarną liczbę stałoprzecinkową można
potraktować jako złożenie dwóch części — liczby
całkowitej oraz ułamkowej rozdzielonych
przecinkiem:
Część całkowita Część ułamkowa
10110011, 0101
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
Zamiana liczby rzeczywistej
dziesiętnej na binarną
• Zamianę liczby dziesiętnej na postać binarną
przeprowadza się w dwóch etapach:
1.
zamiana liczby całkowitej na postać binarną za
pomocą cyklicznego dzielenia przez 2;
2.
zamiana części ułamkowej na postać binarną za
pomocą cyklicznego mnożenia przez 2. Jeżeli wynik
jest > 1, to wyznaczony bit części ułamkowej jest
także równy 1. Do dalszych obliczeń wykorzystujemy
część ułamkową wyniku.
– Proces należy kontynuować aż do otrzymania 0.
– Z wyników iloczynów pobieramy wartości całkowite —
ułamek liczby binarnej. Otrzymane liczby łączymy,
przedzielając część całkowitą i ułamkową przecinkiem.
– Jeżeli mnożenie przez 2 prowadzi do osiągnięcia
nieskończenie długiej kombinacji zer i jedynek, należy
przyjąć przybliżoną dokładność, np. do 10 miejsc po
przecinku.
Zamiana liczby dziesiętnej
na binarną
• Przykład
• Zamieniamy liczbę 10,225 na liczbę
binarną.
1.Podział liczby na cześć całkowitą i
ułamkową
Część całkowita Część ułamkowa
10, 225
2. Zamiana części całkowitej
na binarną
Dzieln
a
Dzielni
k
Reszta z
dzielenia
10
:2
0
5
:2
1
2
:2
0
1
:2
1
0
10
10
=1010
2
11
3. Zamiana części ułamkowej
na binarną
Mnożn
a
Mnożni
k
Wyni
k
Część całkowita
1 0,225
*2
0,45
0
2 0,45
*2
0,9
0
3 0,9
*2
1,8
1
4 0,8
*2
1,6
1
5 0,6
*2
1,2
1
6 0,2
*2
0,4
0
7 0,4
*2
0,8
0
8 0,8
*2
1,6
1
9 0,6
*2
1,2
1
1
0
0,2
*2
0,4
0
12
4. Połączenie liczb
• Uzyskane liczby binarne scalamy w jedną.
Część całkowita
10
1010
Część ułamkowa
0,225
0,0011100110
10,225
1010, 0011100110
Ćwiczenie
zamiana na postać binarną
1. 25,34
2. 56,95
3. 18,77
4. 21,88
5. 32,65
6. 55,55
7. 11,85
8. 34,42
9. 44,21
10.49,39
11.
15,344
12.
53,953
13.
16,771
14.
31,886
15.
42,657
16.
45,558
17.
41,853
18.
54,425
19.
24,219
20.
39,393
Zamiana liczb binarnych na
dziesiętne
• Chcąc zamienić liczbę binarną
stałoprzecinkową na postać dziesiętną należy
skorzystać z poniższego wzoru:
a
n-1
…a
1
a
0
,a
-1
…a
-m
=a
n-1
*p
n-1
+a
1
*p
1
+a
0
*p
0
,a
-1
*p
-1+…+
a
-
m
*p
-m
• Wartości wag części ułamkowych przyjmują
postać ułamków w których dokładność jest
określona przez wagę najmłodszej cyfry
URZĄDZENIA TECHNIKI KOMPUTEROWEJ
Przykład
Obliczyć wartość liczby dwójkowej 11101,011
B
11101,011
2
= 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
2
= 1 * 1/8 + 1 * 1/4 + 0 * 1/2 + 1 * 1 + 0 *
2 + 1 * 4 + 1 * 8 + 1 * 16
11101,011
2
= 1/8 + 1/4 + 1 + 4 + 8 + 16
11101,011
2
= 29 3/8
Zamiana liczb binarnych na
dziesiętne
Przykład
Zamienić ułamek 12.7 na postać binarną 8-bitową,
gdzie przecinek jest
po czterech bitach !!!!!!!
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
• Wady reprezentacji stałoprzecinkowej (
Fixed
Point Notation
):
• 10-cyfrowy format: XXXXX.XXXXX
Reprezentacja
stałoprzecinkowa
47567.31
A
0.000075244
B
{
obcięte
0.000075244
00000.00007
B
47567.31000
A
W przypadku liczb stałoprzecinkowych wystąpi duży błąd przy
bardzo małych wartościach oraz bardzo dużych wartościach (w
odniesieniu do powyższego formatu).
Liczby rzeczywiste
• Charakterystyka:
Liczby rzeczywiste mają cześć całkowitą i ułamkową
Nie można już przyjąć, że przecinek leży po prawej stronie (bo
wtedy byśmy mieli tylko liczby całkowite) ani, że leży po lewej
stronie (bo wtedy byśmy mieli tylko liczby ułamkowe)
Niezbyt „ekonomiczne” byłoby używanie kodowania w
systemie stałoprzecinkowym (np. przecinek rozdziela dwa
bajty)
• Co chcemy tak naprawdę uzyskać?
• System kodowania dla którego błąd względny będzie tego samego
rzędu dla wszystkich wartości biorących udział w obliczeniach.
Skalowanie liczby
• Dostosowywanie skali liczby ułamkowej:
0.000075244
B
4
0.75244 10
B
5
7.5244 10
B
i tak
dalej ...
47567.31
A
47567.31 0.75244 0.0001
A B
Możliwość wykonania działania z
zastosowaniem wszystkich cyfr znaczących.
Wynik jednak musi być dodatkowo pomnożony
przez wykładniczy współczynnik korygujący.
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]
1.4.2. Liczby zmiennoprzecinkowe (zmiennopozycyjne)
W porównaniu z liczbami stałoprzecinkowymi liczby
zmiennoprzecinkowe (ang. floating-point numbers — FP)
umożliwiają obsługę większego zakresu liczb (bardzo małych lub
bardzo dużych), jednak kosztem wolniejszego przetwarzania i
mniejszej dokładności.
Termin „zmiennoprzecinkowe" oznacza, że nie istnieje stała liczba
cyfr przed przecinkiem i po przecinku.
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 * b
e
,
m - mantysa, b - podstawa systemu, e - wykładnik potęgowy.
1111 1001
e = 1(-2
3
)+1*2
2
+1*2
1
+1*2
0
=
-8 +4 +2 +1 = -1
Liczymy cechę!
1111
1111 1001
Liczymy mantysę!
1001 – dzielimy na dwie części 10,01
traktujemy jak liczbę stałoprzecinkową z przedziału 1,2
m = 1(-2
1
)+0*2
0
+0*2
-1
+1*2
-2
=
-2 +0 +0 +1/4 = -2+1/4 = -1
¾ = -1,75
10,01
1111 1001
m =
-1,75
e = -1
cecha mantysa
L
FP
= m*2
e
L
FP
= -1,75 * 2
-1
= -1,75 * ½
= -1,75 * 0,5
= - 0,875
Zadanie - ćwiczenie
Oblicz wartość liczby
1. 00010101
B
2. 01010110
B
3. 00011100
B
4. 10110101
B
e = 0*(-2
3
) + 0*2
2
+ 0*2
1
+ 1*2
0
= 0 + 0 +0+ 1 = 1
M 01,00 m = 0*(-2
1
) + 1*2
0
+ 0*2
-1
+0*2
-2
= 0+1+0+0=1
L
FP
= 1*2
1
=2
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.
Zadanie do samodzielnej analizy
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
System
zmiennoprzecinkowy
• Metoda:
• Kodowanie w systemie zmiennoprzecinkowym zwanym też
• cecha-mantysa
umożliwia zapis liczb rzeczywistych z ustalonym błędem
względnym
system oparty na podziale liczby na cześć ułamkową zwaną
mantysą oraz na wykładnik potęgi podstawy systemu zwany
cechą
opracowany na podstawie zapisu liczby w systemie
pozycyjnym wagowym
• Zmiennoprzecinkowa (
Floating Point Notation
) reprezentacja
liczby dziesiętnej:
• M – mantysa, liczba ułamkowa ze znakiem, przedstawiona w jednym
z trzech kodów ZM, ZU1, ZU2,
• W – wykładnik lub cecha, liczba całkowita ze znakiem przedstawiona
również w jednym z trzech kodów (nie koniecznie tym samym co M),
• p – wspólna podstawa kodów zastosowanych do zapisu słów M i W,
• d – liczba naturalna (zwykle równa 1).
Reprezentacja
zmiennoprzecinkowa
dL W
L L M W
L M
p
o
• Liczba zmiennoprzecinkowa jest znormalizowana, jeśli
mantysa
spełnia warunek:
• Podczas czynności normalizacji następuje odpowiednie
przesunięcie pozycji kropki dziesiętnej („przecinka”), co
uzasadnia nazwanie tej notacji zmiennoprzecinkową.
• W przypadku liczb dwójkowych odbywa się to poprzez
przesunięcie cyfr znaczących w prawo lub w lewo, w zależności
od tego czy przecinek należy przesunąć w kierunku liczb małych,
czy też dużych.
Normalizacja liczby
zmiennoprzecinkowej
1
d
p
L M
Liczby zmiennoprzecinkowe
w praktyce
•
Metodyka dostosowywania liczby zmiennoprzecinkowej:
•
Przykład: Przyjęto jednobajtowe słowo dwójkowe M i W w kodzie
ZU2. Zadanie: Przedstawienie liczby dziesiętnej L = -4.25 w
dwójkowym zapisie zmiennoprzecinkowym, znormalizowanym.
1.
Przekształcenie liczby L na liczbę dwójkową w kodzie ZU2:
2.
Normalizacja poprzez przesunięcie przecinka dziesiętnego
(warunek – poprzedni slajd):
3.
Stosując 8-bitowy kod ZU2 dla słów mantysy i wykładnika
otrzymujemy dwójkowy zapis zmiennoprzecinkowy:
4.
Sprawdzenie:
2
1.011.11
ZU L
3
1.01111 2
L L
1.01111000.0000011
M
W
M W
o
1 4 2 43 1 4 2 43
1
5
3
3
2
2
2
0.53125 2
4.25
L W
L M
p
W
ir
tu
a
ln
e
k
ro
p
k
i
Standard IEEE 754
Pojedyncza precyzja:
mantysa 23 bity, wykładnik 8 bitów (nadmiar 127), znak 1
bit
Mantysa jest znormalizowana do zmniejszonej podstawy
wykładnika (kodowanie w formacie U1)
S E E E E E E E E MMMMMMMMMMMMMMMMMMMMMMM
Wykładnik
Mantysa
Z
n
a
k
Wartość: 1/4 1/16 1/64 itd.
1/2
23
1/2 1/8 1/32 itd..
0
22
23
31
bit
bajt 1
bajt 2
bajt 3
bajt 4
Standard IEEE 754
•
Procedura zapisu:
1) Określamy znak: Bit31= 1 jeżeli
liczba
ujemna, 0 jeżeli dodatnia
2) Szukamy największej liczby postaci 2
w
mniejszej niż
liczba
3) Zapisujemy wykładnik = w + nadmiar
4) Dzielimy
liczbę
przez 2
w
(wynik będzie miał postać 1.xxxx)
5) Odejmujemy 1 i szukamy mantysy
6) Zaznaczamy bit jako 1 jeżeli po odjęciu 1/(2
(23-bit)
) (dla
pojedynczej precyzji) mamy wartość nieujemną. Jeżeli
otrzymamy wartość ujemną, zaznaczamy bit jako 0 i ignorujemy
tę operację. Procedurę powtarzamy aż w wyniku odejmowania
otrzymamy 0 lub dojdziemy do bitu nr 0.
Jedynka
wiodąca
Konwerter z liczby dziesiętnej na dwójkową w standardzie
IEEE 754
Standard IEEE 754
•
Przykład: (
zapisujemy liczbę 14.5
)
(nadmiar
127)
1) Liczba jest dodatnia Bit31 = 0
2) Największa liczba 2
w
mniejsza niż 14.5 to 2
3
= 8 w = 3
3) Zapisujemy wykładnik = 127 + w = 130 10000010
4) 14.5/2
3
= 1.8125
5) odejmujemy 1 i otrzymujemy 0.8125
•
0.8125-1/2=0.3125
bit22 = 1
•
0.3125-1/4=0.0625
bit21 = 1
•
0.0625-1/8= -0.0625
bit20 = 0
ignorujemy operację
•
0.0625-1/16= 0.0
bit19 = 1
•
Pozostałe bity mantysy = 0
010000010110100000000000000
00000
znak
wykładni
k
mantysa
Standard IEEE 754
•Pojedyncza precyzja
: mantysa 23 bity, wykładnik 8
bitów, znak 1 bit, nadmiar 2
8
/2 - 1 = 127
•Podwójna precyzja
: mantysa 52 bity, wykładnik 11
bitów, znak 1 bit, nadmiar 2
11
/2 - 1 = 1023
•Rozszerzona podwójna precyzja
: mantysa 64 bity,
wykładnik 15 bitów (nadmiar 2
64
/2 - 1 = 16383), znak 1 bit
Standard IEEE 754
• Precyzja jest określana przez liczbę miejsc po przecinku, czyli
jest określana przez mantysę.
• Najmniejsza wartość możliwa do zapisania w mantysie
• Pojedyncza precyzja:
• Mantysa ma 23 bity 1/2
23
≈ 1.2* 10
-7
7 cyfr po przecinku
• Podwójna precyzja
• Mantysa ma 52 bity 1/2
52
≈ 2.2* 10
-16
15-16 cyfr po
przecinku
• Rozszerzona podwójna precyzja
• Mantysa ma 64 bity 1/2
64
≈ 5.4* 10
-20
19 cyfr po przecinku
Znaki i teksty
Teksty składają się ze znaków
Podstawą zapisu jest jeden bajt
1 bajt przyjmuje 256 różnych wartości
Ważną cechą kodowania jest jednoznaczność:
przyjęcie pewnego sposobu kodowania powinno być powszechne:
ASCII: 0 – 127 standardowe, 128 – 256 zależne od kraju
Znaki specjalne
0-31
Spacja
32
Cyfry
48 – 57
Wielkie litery
65 – 90
Małe litery
97 - 122
Pozostałe kody:
Kropka, przecinek,
itd…
33-47, 58-64, 91-
96, 123-127
Np.
Litera W: 01010111
kod binarny 87
Kod
znaku
Znak
ASCII (American Standard Code for
Information Interchange)
W
87
Kody UNICODE
• 256 znaków alfanumerycznych jakie można
zakodować za pomocą rozszerzonego kodu ASCII nie
dawało możliwości zakodowania znaków
diakrytycznych wielu języków np. polskiego.
• Odpowiedzią jest kod nazwany
UNICODE
o długości
16 bitów dla każdego znaku. Daje to możliwość
zakodowania 2
16
, czyli 65536 znaków.