Liczby w komputerze

Transkrypt

Liczby w komputerze
Podstawy Informatyki
Metalurgia, I rok
Wykład 3
Liczby w komputerze
Jednostki informacji
Bit (ang. bit) (Shannon, 1948) Najmniejsza ilość informacji
potrzebna do określenia, który z dwóch równie
prawdopodobnych stanów przyjął układ.
Jednostka informacji (1b).
Bajt (ang. byte) (Shannon, 1948) Najmniejsza adresowalna
jednostka informacji pamięci komputerowej, składająca się z
bitów.
Zazwyczaj przyjmuje się, że 1B = 8b (oktet), ale nie jest to
reguła!
Najbardziej znaczący bit (bajt) - bit (bajt) o największej wadze
(w zapisie z lewej strony).
Najmniej znaczący bit (bajt) - bit (bajt) o najmniejszej wadze
(w zapisie z prawej strony).
Systemy pozycyjne
W pozycyjnych systemach liczbowych ten sam symbol
(cyfra) ma różną wartość w zależności od pozycji, którą
zajmuje w zapisie danej liczby.
4
x = c 4 c3c 2 c1c0 =
∑c p
i
i
i=0
p — podstawa systemu pozycyjnego.
Do zapisu liczby służą cyfry ci (których jest p) ustawiane na
kolejnych pozycjach.Pozycje numerujemy od 0 zaczynając
od strony prawej zapisu.
Każda pozycja posiada swoją wagę równą pi .
Wartość liczby obliczamy sumując iloczyny cyfr przez wagi
ich pozycji.
Systemy pozycyjne – zapis liczby ułamkowej
.
x = c n −1 ... c 2 c1c0 c −1c − 2 ... c − m =
n −1
i
c
p
∑ i
i=− m
•Część ułamkowa liczby — m pozycji.
•Część całkowita liczby — n pozycji.
•Wartość liczby obliczamy sumując iloczyny cyfr przez
wagi ich pozycji.
System dwójkowy (binarny)
Gottfried Leibnitz, XVIIw.
Cyfry: 0, 1.
Przykład:
110111.1101(2) = 1*25 + 1*24 + 0*23 + 1*22 + 1*21 + 1*20 .
+ 1*2-1 + 1*2-2 + 0*2-3 + 1*2-4
•System ten jest wygodny maszyny.
•Reprezentacja cyfry binarnej zajmuje dokładnie jeden bit.
•n-cyfrowa liczba binarna bez znaku zajmuje n bitów w
pamięci komputera.
Konwersja kodu dziesiętnego na dwójkowy
55.8125
Część ułamkową liczby
Część całkowitą liczby
dzielimy sukcesywnie przez mnożymy sukcesywnie przez 2 i
bierzemy część całkowitą
2 i bierzemy reszty
55
1
27
13
6
3
1
1
1
0
1
1
55(10)=110111(2)
8125
1
1
0
1
625
25
5
0
0.8125(10)=0.1101(2)
55.8125(10)=110111.1101(2)
System szesnastkowy
•Cyfry: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F.
•System łaczy zalety systemu binarnego (dobre wykorzystanie pamięci)
oraz dziesiątkowego (zwięzłość).
•Reprezentacja cyfry szesnastkowej zajmuje 4 bity:
Cyfra
(10)
(2)
Cyfra
(10)
(2)
0
0 0
8
8 1000
1
1 1
9
9 1001
2
2 10
A
10 1010
3
3 11
B
11 1011
4
4 100
C
12 1100
5
5 101
D
13 1101
6
7
6 110
7 111
E
F
14 1110
15 1111
Przykład: 37.D = 3*161 + 7*160 + D*16-1
Reprezentacja liczb całkowitych
Założenie: liczba całkowita ze znakiem jest zapisywana w
słowach n-bitowych. (Dla przykładu weźmy n = 8).
00110111
znak (najbardziej znaczący bit)
moduł liczby (7 bitów).
Liczba nieujemna
jest kodowana jako: znak 0 i kod binarny modułu tej liczby.
np. liczba 55 w przykładzie powyżej.
Liczba ujemna
jest kodowana jako: znak 1 i kod binarny modułu tej liczby.
Liczba -55
10110111
bo 0110111(2) =55(10) =|-55|
+ Sposób wygodny dla człowieka.
– Przy operacjach arytmetycznych trzeba porównać znaki.
– Podwójna reprezentacja liczby 0: 00000000 oraz 10000000
(redundancja).
Zakres liczb: [-2n-1 + 1, 2n-1 - 1] (2n - 1 liczb).
Kod uzupełnień do 1 (U1)
Liczba ujemna x (analogicznie przeciwna) jest kodowana na
jeden z dwóch (równoważnych) sposobów:
negujemy (bitowo) kod binarny modułu x
albo bierzemy kod binarny liczby 2n -1 +x.
Sposób 2: liczba -55
Sposób 1: liczba -55
1) Kod binarny modułu (=55):
1) Kod binarny liczby
00110111
8 -1 -55 =256 -56 =200:
2
2) Negacja bitowa:
11001000
11001000
– Sposób mało wygodny dla człowieka.
+ Łatwe operacje arytmetyczne.
– Dwie reprezentacje liczby 0: 00000000 oraz 11111111.
Zakres liczb: [-2n-1 + 1, 2n-1 - 1] (2n - 1 liczb).
Zasady dodawania
1 Liczby zapisane w kodzie U1 dodajemy zgodnie z zasadami
dodawania dwójkowego, ale
2 jeżeli wystąpi przeniesienie poza bit znaku, to do wyniku
należy dodać 1.
Z przeniesieniem
11
111
0 1 0 0 1 1 0 1 (77)
+ 1 1 0 1 0 1 0 0 (-43)
1111
1 0 1 1 0 0 1 0 (-77)
+ 1 1 0 1 0 1 0 0 (-43)
00100001
10000110
+00000001
+00000001
0 0 1 0 0 0 1 0 (34)
1 0 0 0 0 1 1 1 (-120)
Kod uzupełnień do 2 (U2)
Liczba ujemna x (analogicznie przeciwna) jest kodowana na
jeden z dwóch (równoważnych) sposobów:
•negujemy (bitowo) kod binarny modułu x i dodajemy 1;
•bierzemy kod binarny liczby 2n +x.
Sposób 1: liczba -55
Sposób 2: liczba -55
1) Kod binarny modułu (=55):
00110111
1) Kod binarny liczby
2) Negacja bitowa:
8 -55 =256 -55 =201:
2
11001000
3) Dodanie 1:
11001001
11001001
– Sposób mało wygodny dla człowieka.
+ Łatwe operacje arytmetyczne.
– Jedna reprezentacja liczby 0: 00000000
Zakres liczb: [-2n-1 , 2n-1 -1] (2n liczb).
Dodawanie w kodzie U2
Dodawanie w kodzie U2 odbywa się zgodnie z zasadami
dodawania dwójkowego
1
11
11
1 0 1 1 0 0 1 1 (-77)
1
0 1 0 0 1 1 0 1 (77)
+ 0 0 1 0 1 0 1 1 (43)
+ 1 1 0 1 0 1 0 1 (-43)
1 1 0 1 1 1 1 0 (-34)
1111
111
0 0 1 0 0 0 1 0 (34)
111
1 0 1 1 0 0 1 1 (-77)
+ 1 1 0 1 0 1 0 1 (-43)
1 0 0 0 1 0 0 0 (-120)
Liczby ułamkowe stałoprzecinkowe
Liczba stałopozycyjna (n +m)-bitowa
00110111
posiada n bitów przeznaczonych na część całkowitą oraz
m bitów przeznaczonych na kodowanie części ułamkowej.
n −1
cn −1...c3c2c1c0 .c−1c−2 ...c−m =
∑c p
i
i =− m
Założenie: liczba bez znaku.
Wartość największa:
2n-1 + 1 – 2-m = 2n – 2-m
Wartość najmniejsza:
0+ 2-m = 2-m
i
Liczby zmiennoprzecinkowe (floating-point
numbers)
Liczba zmiennoprzecinkowa
x =(-1)s · m · pc
s — znak liczby,
m — mantysa,
p — podstawa systemu,
c — cecha.
me = 9.109 x 10-31 kg
G = 6.67 x 10-11 m3kg-1s-2
NA = 6.022 x 1023 mol-1
Normalizacja liczby zmiennoprzecinkowej
Położenie przecinka w liczbie zmiennoprzecinkowej nie jest
ustalone.
273.16 = 2.7316 x 102 = 0.27316 x 103 = 27316 x 10-2
Znormalizowana liczba zmiennoprzecinkowa
to taka liczba, której mantysa spełnia zależność:
1≤ |m|<p
W systemie dziesiętnym:
1≤ |m| ≤ 10
czyli m= 1.000000 ... 9.999999
W systemie dwójkowym znormalizowana liczba
zmiennoprzecinkowa ma zawsze część całkowitą równą ±1.
Zatem, do zakodowania liczby zmiennoprzecinkowej
potrzeba zakodować (przyjmujemy, ze podstawa będzie
równa 2):
•znak,
•mantysę,
•cechę.
Standard IEEE 754
W celu ujednolicenia reprezentacji binarnej oraz operacji
numerycznych na różnych platformach sprzętowych,
wprowadzono standard zapisu zmiennoprzecinkowego
IEEE 754 (William Kahan).
Standard ten definiuje:
•formaty reprezentacji liczb zmiennoprzecinkowych:
single-precision (32 bity),
double-precision (64bity),
single-extended precision (≥ 43 bitów)
double-extended precision (≥ 79 bitów, zazwyczaj 80 bitów),
•wartosci specjalne (np. nieskończoność, NaN),
•zmiennoprzecinkowe operacje,
•modele zaokrąglania,
•wyjątki.
Ogólny format w standardzie IEEE 754
sign(bit znaku): 0 — liczba dodatnia, 1 — liczba ujemna,
exponent (cecha): kod z nadmiarem (BIAS = 2e-1 - 1),
fraction (mantysa): liczba stałoprzecinkowa, kod U1,
pozbawiona najbardziej znaczącego bitu reprezentującego
część całkowitą — bit ten nie jest przechowywany.
e – liczba bitów cechy
Typ
Cecha
Mantysa
zera
0
0
liczby nieznormalizowane
0
≠0
liczby znormalizowane
od 1 do 2e-1
dowolna
nieskończoności
2e-1
0
NaN (nieokreślone)
2e-1
≠0
Liczby pojedynczej precyzji
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
31
23
•bit znaku: 0 — liczba dodatnia, 1 — liczba ujemna,
•cecha: (BIAS =127), zakres: -126 ÷127,
•mantysa: m =1.fraction
•Znormalizowane liczby o najmniejszym module:
±2-126 ≈±1.175494351 ·10-38
•Liczby o największym module:
±((1 - (1/2)24)2128)≈± 3.4028235 ·1038
0
Liczby podwójnej precyzji
63
52
•bit znaku: 0 — liczba dodatnia, 1 — liczba ujemna,
•cecha: (BIAS =1023), zakres: -1022 ÷1023,
•mantysa: m =1.fraction
•Znormalizowane liczby o najmniejszym module:
±2-1022 ≈±2.2250738585072020 ·10-308
•Liczby o największym module:
±((1 - (1/2)53)21024)≈± 1.7976931348623157 ·10308
0
Stałe i zmienne
Podstawowymi obiektami występującymi w programie są
stałe i zmienne. Ich znaczenie jest takie samo jak w
matematyce.
Stałe i zmienne muszą posiadać nazwę i posiadają
przypisaną wartość.
Nazwa jest ciągiem znaków, z których pierwszy musi być
literą, np.: x, alfa1, pierwiastek1,
Obowiązują tylko znaki ASCII (abc...z, ABC...XYZ). Nie ma
polskich liter ani greckich.
Charakter zmiennych jest deklarowany we wstępnej części
programu (zazwyczaj zaraz na początku, przed
instrukcjami właściwymi programu)
Zmienne są różnych typów:
• całkowite : 1, 2, 128
• rzeczywiste : 0.456, -734.129
• logiczne : true, false
• znakowe : imie, adres
• itp.
Typy zmiennych w Fortranie
•INTEGER*1 (1 bajt)
-128÷127
•INTEGER*2 (2 bajty)
-32768÷32767
•INTEGER*4 (4bajty)
-2147483648÷2147483647
•REAL*4 (4 bajty)
±1.175494E-38 ÷ 3.402823E+38
• REAL*8 (8 bajtów)
±2.225074D-308 ÷1.797693D+308
•COMPLEX (zespolony)
para liczb REAL
•LOGICAL (logiczny)
.true. .false. długość jak INTEGER
•CHARACTER*1
1 bajt
•CHARACTER*n
n bajtów
Typy zmiennych w Pascalu
•SHORTINT (-128..127)
1 bajt
•INTEGER (-32768..32767}
2 bajty
•LONGINT {-2147483648..2147483647}
4 bajty
•BYTE
1 bajt
•WORD
{0..255}
{0..65535}
2 bajty
•BOOLEAN {TRUE/FALSE} – logiczny
1/8 bajta
•CHAR 1 znak
1 bajt
•STRING 0-255 znaków
•REAL {2.9E-39 .. 1.7E38}
6 bajtów
•DOUBLE {5.0E-324 .. 1.7E308}
8 bajtów
•EXTENDED {1.9E-4951 .. 1.1E4932}
10 bajtów
Typy danych w języku C
•int - typ całkowity. Zmienne tego typu typu mogą przyjmować wartości
całkowite dodatnie lub ujemne.
•short int - typ całkowity krótki
•long int - typ całkowity długi
•float - typ zmiennoprzecinkowy pojedynczej precyzji.
•double - typ zmiennoprzecinkowy podwójnej precyzji.
•long double - typ zmiennoprzecinkowy podwójnej precyzji długi.
•void - typ pusty oznaczający brak wartości (stosowany w ANSI C).Tylko
parametry przekazywane do funkcji mogą być typu void (oznacza wtedy, że do
funkcji nic się nie przekazuje) lub zwracane przez funkcję (funkcja nic nie
zwraca). Oprócz tego typ void może być stosowany przy tworzeniu pewnych
typów złożonych.
•char - typ znakowy. Można za jego pomocą przechowywać znaki w kodzie
ASCII. Na ogół typ char ma 1 bajt długości w związku z czym można za jego
pomocą przechowywać liczby z zakresu -128 .. 127 (jeśli jest ze znakiem) lub 0
.. 255 (jeśli jest bez znaku).
Tablice
Tablica jest to struktura danych zawierająca uporządkowany
zbiór obiektów tego samego typu i odpowiada
matematycznemu pojęciu wektora, macierzy, zmiennych
indeksowych, itp.
1
2
3
4
5
a
S = a 1 + a 2 + ... + a n
6
7
Dlaczego tablice?
Jeśli n=3, to nie tak ważne.
A jeśli n=100?
- deklarujemy jedną zmienną tablicową a nie 100
zwykłych.
- w programie można łatwo odwołać się do elementu,
którego numer jest wyliczany, np.: k=2*i-1
Dla i=5 mamy k=9
Do zmiennej tablicowej A odwołujemy się: x:=A[9], lub
x:=A[k], a nawet x:=A[2*i-1]
Proste?
A gdyby nie było zmiennych tablicowych?
Dlaczego tablice, cd.
Przykład programu:
k=2*i-1
wybierz k z:
1: x:=A1
2: x:=A2
3: x:=A3
...
9: x:=A9
...
100: x:=A100
Bez sensu!
Deklraracje tablic
•FORTRAN:
DIMENSION A(100)
INTEGER B(55)
Uwaga! Indeksy tablic od 1 a(1)..a(100)
•PASCAL:
A:array [1..100] of real;
B:array[1..55] of integer;
•C:
double a[100];
int b[55];
Uwaga! Indeksy tablic od 0 a[0]..a[99]