Login lub e-mail Hasło   

Dwójkowy system stałoprzecinkowy

Odnośnik do oryginalnej publikacji: http://www.i-lo.tarnow.pl/edu/inf/alg/nu(...)ex.html
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...
Wyświetlenia: 5.541 Zamieszczono 30/10/2006

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:

   
   
    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

 
       

 

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

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

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.

 

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 x 2 =  1,29  - cyfra 1
0,29 x 2 =  0,58  - cyfra 0
0,58 x 2 =  1,16  - cyfra 1
0,16 x 2 =  0,32  - cyfra 0
0,32 x 2 =  0,64  - cyfra 0
0,64 x 2 =  1,28  - cyfra 1
0,28 x 2 =  0,56  - cyfra 0
0,56 x 2 =  1,12  - cyfra 1
0,12 x 2 =  0,24  - cyfra 0
0,24 x 2 =  0,48  - cyfra 0
0,48 x 2 =  0,96  - cyfra 0
0,96 x 2 =  1,92  - cyfra 1
0,92 x 2 =  1,84  - cyfra 1
0,84 x 2 =  1,68  - cyfra 1
0,68 x 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ą.

 

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 x 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

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 x 100 [%]

 

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 x 100 = 6,25% - błąd względny procentowy 

 

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

Podobne artykuły


8
komentarze: 79 | wyświetlenia: 1153
111
komentarze: 32 | wyświetlenia: 60728
54
komentarze: 56 | wyświetlenia: 32590
54
komentarze: 68 | wyświetlenia: 31293
50
komentarze: 27 | wyświetlenia: 63526
49
komentarze: 18 | wyświetlenia: 64978
39
komentarze: 50 | wyświetlenia: 23278
39
komentarze: 30 | wyświetlenia: 28846
37
komentarze: 9 | wyświetlenia: 28520
36
komentarze: 37 | wyświetlenia: 23499
34
komentarze: 21 | wyświetlenia: 26317
32
komentarze: 12 | wyświetlenia: 26675
 
Autor
Artykuł

Powiązane tematy






Brak wiadomości


Dodaj swoją opinię
W trosce o jakość komentarzy wymagamy od użytkowników, aby zalogowali się przed dodaniem komentarza. Jeżeli nie posiadasz jeszcze swojego konta, zarejestruj się. To tylko chwila, a uzyskasz dostęp do dodatkowych możliwości!
 

© 2005-2018 grupa EIOBA. Wrocław, Polska