Reprezentacja liczb w systemie komputerowym

Download Report

Transcript Reprezentacja liczb w systemie komputerowym

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
R1
R3
R2
K5
R4
R5
R6
K1
R7
K3
K2
K4
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 pn-1 … p2p1p0 , p-1p-2 … p-m
cyfry an-1 … a2a1a0 , a-1a-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ą
Dzielna Dzielnik Reszta z dzielenia
10
:2
0
5
2
:2
:2
1
0
1
:2
1
0
1010=10102
11
3. Zamiana części ułamkowej na
binarną
1
2
3
4
5
6
7
8
9
10
Mnożna Mnożnik
Wynik
Część całkowita
0,225
0,45
0,9
0,8
0,6
0,2
0,4
0,8
0,6
0,2
0,45
0,9
1,8
1,6
1,2
0,4
0,8
1,6
1,2
0,4
0
0
1
1
1
0
0
1
1
0
*2
*2
*2
*2
*2
*2
*2
*2
*2
*2
12
4. Połączenie liczb
• Uzyskane liczby binarne scalamy w jedną.
Część całkowita
Część ułamkowa
10
0,225
1010
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.
12.
13.
14.
15.
16.
17.
18.
19.
20.
15,344
53,953
16,771
31,886
42,657
45,558
41,853
54,425
24,219
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:
an-1…a1a0,a-1…a-m=an-1*pn-1+a1*p1+a0*p0,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
Zamiana liczb binarnych na
dziesiętne
Przykład
Obliczyć wartość liczby dwójkowej 11101,011B
11101,0112 = 1 * 2-3 + 1 * 2-2 + 0 * 2-1 + 1 * 20 + 0 * 21 + 1 * 22 +
1 * 23 + 1 * 24
11101,0112 = 1 * 1/8 + 1 * 1/4 + 0 * 1/2 + 1 * 1 + 0 * 2 + 1 * 4 +
1 * 8 + 1 * 16
11101,0112 = 1/8 + 1/4 + 1 + 4 + 8 + 16
11101,0112 = 29 3/8
Przykład
Zamienić ułamek 12.7 na postać binarną 8-bitową, gdzie
przecinek jest po czterech bitach !!!!!!!
Etap 1
Część całkowita 12D to w postaci dwójkowej 1100B.
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.7D = 1100,1011B
Reprezentacja
stałoprzecinkowa
• Wady reprezentacji stałoprzecinkowej (Fixed Point
Notation):
B  0.000075244
A  47567.31
•
10-cyfrowy format:
A  47567.31000
XXXXX.XXXXX
B  0.00007 5244 
obcięte
 00000.00007
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:
B  0.000075244
B  0.75244 104
B  7.5244 105
i tak dalej ...
A  47567.31
A B   47567.31 0.75244  0.0001
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 * 1012.
Masa elektronu wynosi me =
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 * be,
m - mantysa, b - podstawa systemu, e - wykładnik potęgowy.
1111
1001
Liczymy cechę! 1111
e = 1(-23)+1*22+1*21+1*20 =
-8 +4 +2 +1
= -1
1111
1001
Liczymy mantysę! 1001 – dzielimy na dwie części 10,01
traktujemy jak liczbę stałoprzecinkową z przedziału 1,2
10,01
m = 1(-21)+0*20+0*2-1+1*2-2 =
-2 +0 +0 +1/4
= -2+1/4 = -1 ¾ = -1,75
1111
1001
cecha
e = -1
LFP = m*2e
LFP = -1,75 * 2-1
= -1,75 * ½
= -1,75 * 0,5
= - 0,875
mantysa
m = -1,75
Zadanie - ćwiczenie
Oblicz wartość liczby
1. 00010101B
2. 01010110B
3. 00011100B
4. 10110101B
e = 0*(-23) + 0*22 + 0*21 + 1*20 = 0 + 0 +0+ 1 = 1
M 01,00 m = 0*(-21) + 1*20 + 0*2-1 +0*2-2 = 0+1+0+0=1
LFP = 1*21=2
Zadanie do samodzielnej analizy
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:
56D = 111000B = 0111000U2 - 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,000U2 =20000U2
011100,000U2 =20001U2 - przesuwamy cyfry mantysy w prawo,
zwiększamy wykładnik
01110,000U2 =20010U2
0111,000U2 =20011U2
011,100U2 =20100U2
01,110U2 =20101U2
0,111U2 =20110U2 - kończymy, mantysa jest
znormalizowana
Otrzymujemy więc:
e = 0110 = 6D
m = 0,111 = 7/8, sprawdzamy: 7/8 x 26 = 448/8 = 56
Dla liczby 9D
9D = 1001B = 01001U2
01001,000U2 =20000U2
0100,100U2 =20001U2
010,010U2 =20010U2
01,001U2 =20011U2 - ostatnia jedynka zaraz zniknie!!!
0,100U2 =20100U2 - koniec
Otrzymaliśmy wynik:
e = 0100 = 4D
m = 0,100 = 1/2, sprawdzamy: 1/2 * 24 = 16/2 = 8
9D =? 01000100ZP
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
Reprezentacja
zmiennoprzecinkowa
• Zmiennoprzecinkowa (Floating Point Notation) reprezentacja
liczby dziesiętnej:
L  L  M W   L  M   p dLW 
• 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,
•
Normalizacja liczby
zmiennoprzecinkowej
Liczba zmiennoprzecinkowa
jest znormalizowana, jeśli mantysa spełnia
warunek:
pd  L  M   1
• 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.
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. ZU 2 L  1.011.11
 
Przekształcenie liczby L na liczbę dwójkową w kodzie ZU2:
L  L 1.01111  23
2.
Normalizacja poprzez przesunięcie przecinka dziesiętnego (warunek –
poprzedni slajd):
M W  1.01111000.0000011
M
3.
Stosując 8-bitowy kod ZU2 dla słów mantysy i wykładnika otrzymujemy
dwójkowy zapis zmiennoprzecinkowy:
L W 
1
5
3
3
LM  p
4.
W
Sprawdzenie:
  2  2
 2
 0.53125  2  4.25
Wirtualne
kropki
1.
Standard IEEE 754
Pojedyncza precyzja:
mantysa 23 bity, wykładnik 8 bitów (nadmiar 127), znak 1 bit
bajt 4
bajt 3
bit 31
bajt 2
bajt 1
2322
0
Znak
S E E E E E E E E MMMMMMMMMMMMMMMMMMMMMMM
Wykładnik
Wartość:
Mantysa
1/4 1/16 1/64 itd.
1/2 1/8
1/32 itd..
Mantysa jest znormalizowana do zmniejszonej podstawy
wykładnika (kodowanie w formacie U1)
1/2 23
Standard IEEE 754
•
Procedura zapisu:
1)
2)
3)
4)
5)
6)
Określamy znak: Bit31= 1 jeżeli liczba ujemna, 0 jeżeli dodatnia
Szukamy największej liczby postaci 2w mniejszej niż liczba
Jedynka
Zapisujemy wykładnik = w + nadmiar
wiodąca
Dzielimy liczbę przez 2w (wynik będzie miał postać 1.xxxx)
Odejmujemy 1 i szukamy mantysy
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.
Konwerter z liczby dziesiętnej na dwójkową w standardzie IEEE 754
•
1)
2)
3)
4)
5)
•
•
•
•
•
Standard IEEE 754
Przykład: (zapisujemy liczbę 14.5)
(nadmiar 127)
Liczba jest dodatnia  Bit31 = 0
Największa liczba 2w mniejsza niż 14.5 to 23 = 8  w = 3
Zapisujemy wykładnik = 127 + w = 130  10000010
14.5/23 = 1.8125
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
01000001011010000000000000000000
wykładnik
znak
mantysa
Standard IEEE 754
•Pojedyncza precyzja: mantysa 23 bity, wykładnik 8 bitów,
znak 1 bit, nadmiar 28/2 - 1 = 127
•Podwójna precyzja: mantysa 52 bity, wykładnik 11 bitów, znak
1 bit, nadmiar 211/2 - 1 = 1023
•Rozszerzona podwójna precyzja: mantysa 64 bity, wykładnik
15 bitów (nadmiar 264/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/223 ≈ 1.2* 10-7  7 cyfr po przecinku
• Podwójna precyzja
• Mantysa ma 52 bity 1/252 ≈ 2.2* 10-16  15-16 cyfr po przecinku
• Rozszerzona podwójna precyzja
• Mantysa ma 64 bity 1/264 ≈ 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
Np.
Cyfry
48 – 57
Wielkie litery
65 – 90
Litera W: 01010111
kod binarny 87
Małe litery
97 - 122
Pozostałe kody:
Kropka, przecinek, itd…
33-47, 58-64, 91-96,
123-127
87
Kod znaku
ASCII (American Standard Code for Information
Interchange)
W
Znak
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 216, czyli
65536 znaków.