Dwójkowy system stałoprzecinkowy


Podrozdziały Tematy pokrewne

 

Wartość dwójkowej liczby stałoprzecinkowej

Metodę obliczania wartości liczb stałoprzecinkowych opisaliśmy dokładnie w jednym z wcześniejszych rozdziałów. Po przecinku wagi pozycji są kolejnymi ujemnymi potęgami podstawy, zatem:

 

Zapamiętaj:

Wartość dziesiętna stałoprzecinkowej liczby binarnej

bn-1...b1b0,b-1b-2...b-m = bn-12n-1 + ... + b121 + b020 + b-12-1 + b-22-2 + ... + b-m2-m

gdzie:

b - bit, cyfra dwójkowa 0 lub 1
n - liczba bitów całkowitych
m - liczba bitów ułamkowych

 

Przykład:

Obliczyć wartość stałoprzecinkowej liczby dwójkowej 110101,111011(2).

 

Sposób pierwszy

Obliczamy wartość części całkowitej sumując wagi pozycji zawierających cyfrę 1:

 

110101(2) = 32 + 16 + 4 + 1 = 53(10)

 

Identycznie obliczamy wartość części ułamkowej:

 

0,111011(2) = 1/2 + 1/4 + 1/8 + 1/32 + 1/64
0,111011(2) = 32/64 + 16/64 + 8/64 + 2/64 + 1/64
0,111011(2) = 59/64

 

Łączymy obie części w całość otrzymując wynik:

 

110101,111011(2) = 53 59/64

 

Sposób drugi

Wartość części całkowitej obliczamy jak powyżej. Część ułamkową traktujemy chwilowo jak liczbę całkowitą, obliczamy jej wartość i wynik mnożymy przez wagę ostatniej pozycji liczby wejściowej:

 

111011(2) = 32 + 16 + 8 + 2 + 1 = 59

 

Waga ostatniej pozycji wynosi 1/64, zatem

 

0,111011(2) = 59 × 1/64 = 59/64

 

Łączymy część całkowitą z częścią ułamkową i otrzymujemy:

 

110101,111011(2) = 53 59/64

 

Sposób trzeci

Traktujemy część całkowitą i część ułamkową jak jedną liczbę całkowitą. Za pomocą schematu Hornera wyznaczamy wartość tej liczby, a wynik mnożymy przez wagę ostatniej pozycji liczby wejściowej:

 

110101,111011(2) = ?

W = 1
W = (1 + 1) + 1 = 3
W = (3 + 3) + 0 = 6
W = (6 + 6) + 1 = 13
W = (13 + 13) + 0 = 26
W = (26 + 26) + 1 = 53 - część całkowita obliczona, kontynuujemy z częścią ułamkową
W = (53 + 53) + 1 = 107
W = (107 + 107) + 1 = 215
W = (215 + 215) + 1 = 431
W = (431 + 431) + 0 = 862
W = (862 + 862) + 1 = 1725
W = (1725 + 1725) + 1 = 3451 - koniec części ułamkowej

 

Otrzymany wynik mnożymy przez wagę ostatniej pozycji, czyli przez 1/64:

 

110101,111011(2).= 3451 × 1/64 = 53 59/64

 

Zakres dwójkowych liczb stałoprzecinkowych

Odpowiedzmy sobie na pytanie: jaką największą liczbę można przedstawić za pomocą n bitów całkowitych i m bitów ułamkowych, gdzie n i m są liczbami naturalnymi ?

Liczbę stałoprzecinkową możemy potraktować jako złożenie dwóch liczb - całkowitej n-bitowej oraz ułamkowej m-bitowej.

Część całkowita dla n bitów przyjmuje największą wartość równą 2n - 1.

Część ułamkowa będzie największa, gdy wszystkie jej bity ustawione zostaną na 1. Dla m bitów wartość takiej liczby wyniesie (2m - 1) / 2m (porusz podany powyżej przykład obliczeniowy, gdzie wartość części ułamkowej liczby dwójkowej obliczamy jako liczbę całkowitą pomnożoną przez wagę ostatniej pozycji).

Łączymy obie części i otrzymujemy:

 

dla n bitów całkowitych i m bitów ułamkowych największą liczbą jest

2n - 1 +  2m - 1
   2m

 

Przeliczanie liczb dziesiętnych na dwójkowe liczby stałoprzecinkowe

Metodę wyznaczania reprezentacji stałoprzecinkowej liczby dziesiętnej w innym systemie pozycyjnym opisaliśmy w jednym z wcześniejszych rozdziałów.

 

Sposób pierwszy

Liczbę rozdzielamy na część całkowitą oraz część ułamkową. Część całkowitą przeliczamy na system dwójkowy wg metody podanej w rozdziale poprzednim.

Kolejne bity części ułamkowej otrzymujemy mnożąc ją przez dwa (lub dodając do siebie). Część całkowita wyniku jest kolejną cyfrą binarną. Do następnych obliczeń bierzemy część ułamkową wyniku. Operację kontynuujemy dotąd, aż otrzymamy wynik zero lub wyznaczymy zadaną ilość cyfr ułamkowych.

 

Przykład:

Przeliczyć na system dwójkowy liczbę dziesiętną 5,645(10) z dokładnością do 15 ułamkowych cyfr binarnych.

Wyznaczamy część całkowitą liczby 5(10) = 101(2).

Wyznaczamy cyfry części ułamkowej 0,645(10)

 

0,645 × 2 =  1,29  - cyfra 1
0,29 × 2 =  0,58  - cyfra 0
0,58 × 2 =  1,16  - cyfra 1
0,16 × 2 =  0,32  - cyfra 0
0,32 × 2 =  0,64  - cyfra 0
0,64 × 2 =  1,28  - cyfra 1
0,28 × 2 =  0,56  - cyfra 0
0,56 × 2 =  1,12  - cyfra 1
0,12 × 2 =  0,24  - cyfra 0
0,24 × 2 =  0,48  - cyfra 0
0,48 × 2 =  0,96  - cyfra 0
0,96 × 2 =  1,92  - cyfra 1
0,92 × 2 =  1,84  - cyfra 1
0,84 × 2 =  1,68  - cyfra 1
0,68 × 2 =  1,36  - cyfra 1 - koniec, mamy 15 cyfr ułamkowych

 

Łączymy otrzymane wyniki:

 

5,645(10) = 101,101001010001111(2)

 

Ponieważ po osiągnięciu 15 cyfr część ułamkowa wciąż jest różna od 0, otrzymane rozwiązanie jest przybliżone (z dokładnością do 15 ułamkowych cyfr binarnych).

 

Sposób drugi

Załóżmy, iż chcemy znaleźć rozwinięcie binarne liczby dziesiętnej z dokładnością m bitów ułamkowych. W tym celu liczbę dziesiętną mnożymy przez 2m, bierzemy część całkowitą wyniku i przeliczamy ją na zapis binarny. Następnie za pomocą przecinka oddzielamy od końca zapisu m bitów i otrzymujemy zapis binarny wyjściowej liczby dziesiętnej z zadaną dokładnością.

 

Przykład:

Przeliczyć na system dwójkowy liczbę 154,35(10) z dokładnością do 10 bitów ułamkowych.

Liczbę mnożymy przez 210 = 1024, zaokrąglamy w dół do wartości całkowitej i przeliczamy na system dwójkowy:

 

[154,35 × 1024] = [158054,4] = 158054

 

158054 div 2 =  79027  i reszta 0
79027 div 2 =  39513  i reszta 1
39513 div 2 =  19756  i reszta 1
19756 div 2 =  9878  i reszta 0
9878 div 2 =  4939  i reszta 0
4939 div 2 =  2469  i reszta 1
2469 div 2 =  1234  i reszta 1
1234 div 2 =  617  i reszta 0
617 div 2 =  308  i reszta 1
308 div 2 =  154  i reszta 0
154 div 2 =  77  i reszta 0
77 div 2 =  38  i reszta 1
38 div 2 =  19  i reszta 0
19 div 2 =  9  i reszta 1
9 div 2 =  4  i reszta 1
4 div 2 =  2  i reszta 0
2 div 2 =  1  i reszta 0
1 div 2 =  0  i reszta 1, koniec

 

158054(10) = 100110100101100110(2)

 

Rozdzielamy przecinkiem 10 cyfr końcowych i otrzymujemy ostatecznie:

 

154,35(10) = 10011010,0101100110(2)

 

Jest to oczywiście wartość przybliżona (błąd jest mniejszy od 1/1000) :

 

10011010,0101100110(2) = 154 358/1024 = 154.349609375

 

Spróbuj uzasadnić poprawność tej metody.

 


DLA
GENIUSZA

Błędy zaokrągleń

Analizując podane przykłady dochodzimy do wniosku, iż nie zawsze da się dokładnie przedstawić liczbę dziesiętną w systemie binarnym. Czasem otrzymujemy rozwinięcia nieskończone (okresowe). Jeśli rozwinięcie binarne posiada ograniczoną ilość cyfr ułamkowych, to wynik konwersji może być obarczony błędem zaokrąglenia - ang. rounding error (zwany również błędem obcięcia - cancellation error).

 

Błąd bezwzględny (ang. absolute error) jest modułem różnicy wartości dokładnej i wartości otrzymanej liczby binarnej. Jeśli błąd ten wynosi 0, to liczba binarna dokładnie przedstawia daną wartość. W przeciwnym razie wartość binarna jest przybliżeniem wartości dokładnej.

 

Δe = | Wd - Wb |, gdzie  Δe - błąd bezwzględny
Wd - wartość dokładna, dziesiętna
Wb - wartość binarna po konwersji

 

Dla m bitów ułamkowych zawsze zachodzi (przeanalizuj sposób uzyskiwania cyfr ułamkowych):

 

Δe < 2-m

 

Wynika z tego, iż błąd bezwzględny jest mniejszy od wagi najmniej znaczącej cyfry liczby binarnej.

 

Błąd względny (ang. relative error) powstaje po podzieleniu błędu bezwzględnego przez wartość dokładną:

 

δe =  Δe , gdzie  δe - błąd względny
Δe - błąd bezwzględny
Wd - wartość dokładna, różna od 0
|Wd|

 

Błąd względny pozwala nam się zorientować, jak dokładnie liczba binarna przedstawia zadaną wartość. Na przykład, jeśli błąd względny wyniesie 0,25, to znaczy, iż 1/4 wartości jest niedokładna. To czasem może być nie do przyjęcia!

Błąd względny można również wyrażać procentowo mnożąc δe przez 100:

 

δe% = δe × 100 [%]

 

Przykład:

Obliczyć błąd bezwzględny i względny rozwinięcia dwójkowego o 5 bitach ułamkowych dla liczby 0,3(10).

Wyznaczamy rozwinięcie dwójkowe wg jednej z opisanych wcześniej metod:

 

0.3(10) = 0,01001(2)

 

Obliczamy wartość otrzymanej liczby binarnej:

 

0,01001(2) = 9/32 = 0,28125(10)

 

Wyznaczamy błędy:

 

Wd = 0,3
Wb = 0.28125

Δe = |Wd - Wb| = |25,3 - 25.28125| = 0,01875 - błąd bezwzględny

δe = Δe / |Wd| = 0,01875 / |0,3| = 0,0625 - błąd względny

δe% = δe × 100 [%] = 0,0625 × 100 = 6,25% - błąd względny procentowy

 

Zadania

Zadanie 1 (łatwe)

Obliczyć wartość dziesiętną następujących liczb dwójkowych:
11,101(2) = (10)  

.

101,1101(2) = (10)  

.

1101011,11001(2) = (10)  

.

 

Zadanie 2 (łatwe)

Przeliczyć podane liczby dziesiętne na zapis dwójkowy:
7,6875(10) = (2)  

.

15,84375(10) = (2)  

.

27,8359375(10) = (2)  

.

 

Zadanie 3 (dosyć łatwe)

Wyznaczyć 100 cyfr ułamkowych dwójkowego rozwinięcia liczby dziesiętnej 0,8(10).

 

Zadanie 4 (dosyć łatwe)

Wyznacz błąd względny i bezwzględny rozwinięcia dwójkowego liczby dziesiętnej 0,2(10) o dokładności 10 binarnych cyfr ułamkowych.

 


Zobacz dalej...

Kody binarne | Naturalny system dwójkowy | Operacje arytmetyczne w systemie dwójkowym | Operacje logiczne na bitach | Konwersje dwójkowo ósemkowe i szesnastkowe



List do administratora Serwisu Edukacyjnego Nauczycieli I LO

Twój email: (jeśli chcesz otrzymać odpowiedź)
Temat:
Uwaga: ← tutaj wpisz wyraz  ilo , inaczej list zostanie zignorowany

Poniżej wpisz swoje uwagi lub pytania dotyczące tego rozdziału (max. 2048 znaków).

Liczba znaków do wykorzystania: 2048

 

W związku z dużą liczbą listów do naszego serwisu edukacyjnego nie będziemy udzielać odpowiedzi na prośby rozwiązywania zadań, pisania programów zaliczeniowych, przesyłania materiałów czy też tłumaczenia zagadnień szeroko opisywanych w podręcznikach.



   I Liceum Ogólnokształcące   
im. Kazimierza Brodzińskiego
w Tarnowie

©2017 mgr Jerzy Wałaszek

Dokument ten rozpowszechniany jest zgodnie z zasadami licencji
GNU Free Documentation License.