Serwis Edukacyjny
w I-LO w Tarnowie
obrazek

Materiały dla uczniów liceum

  Wyjście       Spis treści       Wstecz       Dalej  

Autor artykułu: mgr Jerzy Wałaszek
Zmodyfikowano 29.01.2024

©2024 mgr Jerzy Wałaszek
I LO w Tarnowie

Matura - programowanie w C++

Liczby zmiennoprzecinkowe

SPIS TREŚCI

Liczby stałoprzecinkowe

Opisane wcześniej systemy NBS i U2 pozwalają na kodowanie tylko liczb całkowitych. Jeśli chcemy używać komputer do obliczeń naukowych, musimy mieć możliwość pracy z liczbami ułamkowymi. Przyjrzyjmy się wagom NBS/U2:
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:

-8 + 4 + 1/2 + 1/16 =
-8 + 4 + 8/16 + 1/16 =
-8 + 49/16 =
-37/16 = -3,4375

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.

Do zapamiętania:


Na początek:  podrozdziału   strony 

System zmiennoprzecinkowy

Z systemem zmiennoprzecinkowym spotkałeś się już zapewne na fizyce. Przy jego pomocy zapisujemy bardzo duże lub bardzo małe liczby.

Przykład:

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.

galaktyka
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.

Przykłady:

Obliczyć wartość kodu 00110111FP = ?

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.

Do zapamiętania:


Na początek:  podrozdziału   strony 

Zespół Przedmiotowy
Chemii-Fizyki-Informatyki

w I Liceum Ogólnokształcącym
im. Kazimierza Brodzińskiego
w Tarnowie
ul. Piłsudskiego 4
©2024 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.