Serwis Edukacyjny w I-LO w Tarnowie ![]() Materiały dla uczniów liceum |
Wyjście Spis treści Wstecz Dalej
Autor artykułu: mgr Jerzy Wałaszek |
©2023 mgr Jerzy Wałaszek |
Waga: | 2n-1/(-2n-1) | 2n-2 | ... | 22 | 21 | 20 |
Cyfra: | bn-1 | bn-2 | ... | b2 | b1 | b0 |
Pozycja: | n-1 | n-2 | ... | 2 | 1 | 0 |
Wagi pozycji są równe potędze podstawy 2 o wykładniku równym numerowi pozycji (w U2 najstarsza waga jest ujemna, co zaznaczono tutaj na czerwono). Numery pozycji kończą się na 0, jednak tworzą one malejący ciąg liczb całkowitych. Jeśli będziemy ten ciąg kontynuować poza 0, to otrzymamy numery ujemne:
Waga: | 2n-1/(-2n-1) | 2n-2 | ... | 22 | 21 | 20 | 2-1 | 2-2 | 2-3 | ... |
Cyfra: | bn-1 | bn-2 | ... | b2 | b1 | b0 | b-1 | b-2 | b-3 | ... |
Pozycja: | n-1 | n-2 | ... | 2 | 1 | 0 | -1 | -2 | -3 | ... |
Potęga 2 o wykładniku ujemnym jest ułamkiem:
Otrzymamy w ten sposób ułamkową liczbę NBS/U2. Zasada obliczania wartości jest taka sama jak poprzednio: dodajemy do siebie wagi pozycji, na których stoi cyfra 1.
Na przykład mamy liczbę U2, która ma 4 cyfry całkowite i cztery ułamkowe. Znaleźć wartość liczby: 1100,1001U2
Zapisujemy ponad cyframi wagi ich pozycji:
-23 | 22 | 21 | 20 | 2-1 | 2-2 | 2-3 | 2-4 | |
-8 | 4 | 2 | 1 | 1/2 | 1/4 | 1/8 | 1/16 | |
1 | 1 | 0 | 0 | , | 1 | 0 | 0 | 1 |
3 | 2 | 1 | 0 | -1 | -2 | -3 | -4 |
Sumujemy wagi pozycji z cyfrą 1:
Jak widzisz, liczby stałoprzecinkowe są po prostu rozwinięciem liczb całkowitych przez dodanie pozycji o wagach ułamkowych.
Więcej na ten temat znajdziesz w obszernym artykule o kodowaniu liczb.
Prędkość światła wynosi w próżni 299 792 458 m/s.
W ciągu sekundy światło pokonuje 299 792 458 m.
W ciągu minuty światło pokonuje 17 987 547 480 m.
W ciągu godziny światło pokonuje 1 079 252 848 800 m.
W ciągu dnia światło pokonuje 25 902 068 371 200 m.
W ciągu roku światło pokonuje 9 460 730 472 580 800 m.
Najbliższa nam galaktyka Andromedy jest w odległości 2,52 miliona lat świetlnych, czyli 23 841 040 790 903 616 000 000 m.
Jak widzisz, posługiwanie się tak dużymi liczbami jest kłopotliwe, dlatego naukowcy zapisują duże/małe liczby w tzw. notacji naukowej:
23 841 040 790 903 616 000 000 ≈ 2,38 × 1022
Przyjrzyjmy się tej notacji. Liczba składa się z trzech części:
Liczbę o takiej postaci nazywamy liczbą zmiennoprzecinkową (ang. floating-point number). Powodem tej nazwy jest to, iż pozycja przecinka w mantysie może być dowolna:
2,38×1022 = 23,8×1021 = 0,0238×1024
Liczby zmiennoprzecinkowe pozwalają zapisywać wartości całkowite oraz niecałkowite:
19, 55 = 1,955 × 101 = 1955 × 10-2
Mantysa jest liczbą stałoprzecinkową, cecha (wykładnik) jest liczbą całkowitą. Wartość liczby fp (zmiennoprzecinkowej) obliczamy zawsze wg wzoru:
LFP = m × pc LFP – wartość liczby fp m – mantysa p – podstawa systemu c – cecha |
Zwróć uwagę, iż wzór jest niezależny od systemu liczbowego, w którym pracujemy. Jeśli za podstawę p przyjmiemy 2, otrzymamy dwójkową liczbę zmiennoprzecinkową. Aby zakodować ją za pomocą bitów, musimy określić format jej składników. Na potrzeby tego rozdziału stwórzmy "szkolny" system zmiennoprzecinkowy. Umówmy się, że kod bitowy liczby fp będzie złożony z 8 bitów. Bity te podzielimy na dwie grupy: mantysę i cechę (podstawa wynosi 2, jest znana, więc nie ma potrzeby umieszczania jej w kodzie liczby):
cecha | mantysa | ||||||
b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 |
Cecha będzie reprezentowana przez 4 najstarsze bity b4 ... b7. Umówmy się, że te bity będą traktowane jako 4-bitowa liczba U2.
Mantysa będzie zawarta w czterech najmłodszych bitach b0 ... b3. Umówmy się, że bity te będą traktowane jako stałoprzecinkowa liczba U2. Pozycję przecinka ustalamy pomiędzy bitem b2 i b3. Wagi bitów są zatem następujące:
cecha | mantysa | ||||||
-8 | 4 | 2 | 1 | -1 | 1/2 | 1/4 | 1/8 |
b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 |
Znając te wagi możemy obliczać wartość liczby fp.
Wyznaczamy cechę i mantysę:
c = 0011U2 = 2 + 1 = 3
m =0,111U2 = 1/2 + 1/4 + 1/8 = 7/8
LFP = m × pc
LFP = 7/8 × 23
LFP =7/8 × 8
LFP = 7
00110111FP = 7(10)
Wynik jest liczbą całkowitą.
Obliczyć wartość kodu 10011111FP = ?
c = 1001U2 = -8 + 1 = -7
m = 1,111U2 = -1 + 7/8 = -1/8
LFP = m × pc
LFP = -1/8 × 2-7
LFP = -1/8 × 1/128
LFP = -1/1024 = -0,0009765625(10)
Wynik jest liczbą ułamkową.
Cecha wpływa na zakres liczb reprezentowanych przez liczbę fp. Mantysa wpływa na precyzję liczby fp.
Jak przeliczyć daną wartość dziesiętną na naszą liczbę fp? Nie będę podawał tu algorytmu, bo w postaci ogólnej jest zbyt skomplikowany, pokażę jedynie, jak to zrobić na prostym przykładzie. Załóżmy, iż chcemy znaleźć postać fp liczby 12(10):
Najpierw tworzymy liczbę U2 z trzema miejscami po przecinku:
12(10) = 01100,000U2
Dla takiej liczby cecha wynosi 0000U2 (dlaczego?). Teraz musimy przesuwać w prawo bity mantysy, aż zajmą właściwe miejsce (zaznaczone tu na czerwono). Każde przesunięcie w prawo bitów mantysy wymaga zwiększenia o 1 cechy, aby liczba fp zachowała tę samą wartość:
cecha | mantysa | operacja |
0000 |
01100,000
|
START |
0001 |
00110,000
|
m-->>, c + 1 |
0010 |
00011,000
|
m-->>, c + 1 |
0011 |
00001,100
|
m-->>, c + 1 |
0100 |
00000,110
|
m-->>, c + 1 |
Po czterech przesunięciach w prawo, bity mantysy znalazły się na właściwym miejscu. Mantysa ma postać 0,110. Cecha ma postać 0100. Łączymy cechę z mantysą i otrzymujemy liczbę fp o wartości 12(10) = 01000110FP.
Teraz spróbujmy w ten sam sposób zakodować liczbę 9(10):
9(10) = 01001,000(U2)
cecha | mantysa | operacja |
0000 |
01001,000
|
START |
0001 |
00100,100
|
m-->>, c + 1 |
0010 |
00010,010
|
m-->>, c + 1 |
0011 |
00001,001
|
m-->>, c + 1 |
0100 |
00000,100
|
m-->>, c + 1 |
Zauważ, iż po czwartym przesunięciu bitów mantysy, straciliśmy najmłodszy bit 1, ponieważ nie ma go jak zapisać w bitach ułamkowych mantysy. Nastąpiła utrata precyzji. Otrzymaliśmy liczbę:
c = 0100U2 = 4(10)
m = 0,100U2 = 1/2
LFP = 1/2 × 24 = 1/2 × 16 = 8
Zapamiętaj to zdarzenie - liczby fp nie są dokładne tak jak liczby całkowite. Liczba da się przedstawić dokładnie, jeśli można ją w całości umieścić w mantysie po przesunięciu bitowym, jeśli nie, otrzymamy wartość przybliżoną. Ilość bitów mantysy wpływa na dokładność, czyli na precyzję liczby fp. Liczby fp używane w komputerze są kodowane na 32 (precyzja 7 cyfr znaczących) lub na 64 bitach (precyzja 15 cyfr znaczących). Dokładniej omówimy to przy programowaniu.
Więcej informacji na ten temat znajdziesz w tym artykule.
![]() |
Zespół Przedmiotowy Chemii-Fizyki-Informatyki w I Liceum Ogólnokształcącym im. Kazimierza Brodzińskiego w Tarnowie ul. Piłsudskiego 4 ©2023 mgr Jerzy Wałaszek |
Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone
pod warunkiem podania źródła oraz niepobierania za to pieniędzy.
Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.