PWr - Zasady arytmetyki zmiennoprzecinkowej i stałoprzecinkowej
From Education
Operandami algorytmów arytmetyki komputerowej są kody reprezentujące liczby. Do reprezentacji ułamków stusuje się reprezentację stało- lub zmiennoprzecinkową. Zbiór reprezentowanych wartości jest zbiorem dyskretnym i skończonych, charakteryzuje się prezycją wyników operacji na liczbach, rozdzielczością i zakresem liczb.
Contents |
[edit] Reprezentacja stałoprzecinkowa
W przypadku reprezentacji stałoprzecinkowej mamy najczęściej do czynienia z reprezentacją w systemie uzupełnieniowym (np. U2) przy czym część najmłodszych bitów reprezentacji poświęcona jest na część ułamkową.
Na przykład: mając do dyspozycji słowo 32-bitowe, można wydzielić 24 bity na część całkowitą, 8 bitów na część ułamkową, albo po 16 bitów na część całkowitą i ułamkową, albo 30 bitów na część całkowitą i zostawić tylko 2 bity do zapisu części ułamkowej. W przypadku liczby 8-bitowej z 4 bitami przeznaczonymi na część całkowitą, przykładową liczbą może być:
xxxx,xxxx -> 0110,0010 -> 1*4 + 1*2 + 1*1/8 = 6,12510
Dokładność wyników operacji jest stała i wynosi 1/16 (zdolność reprezentacji najmniejszej lizby określona przez najmłodszy bit). Zakres to -8,9375 .. 7,9375 a rozdzielczość to 1/16.
Reprezentacja stałoprzecinkowa to w takim razie uporządkowany ciąg liczb (zer i jedynek), z których każdej przypisana jest jakaś waga. Wagi kolejnych pozycji od najmłodszej do najstarszej stanowią dwukrotność poprzednika. Jeśli waga najmłodszego bitu jest ułamkiem (1/2, 1/4, itp.) mamy do czynienia z reprezentacją stałoprzecinkową.
Podziału na część całkowitą i ułamkową dokonuje arbitralnie projektant systemu lub programista, który przewiduje z jak dużymi liczbami całkowitymi lub z jak dużą dokładnością obliczenia będą wykonywane. Zwiększanie precyzji liczby to zmniejszanie zakresu, gdyż bity które mają reprezentować część ułamkową (stać za przecinkiem) nie mogą już reprezentować wartości całkowitych. Stwierdzenie odwrotne również jest prawdziwe: zwiększanie zakresu (całkowitoliczbowego) to zmniejszanie precyzji (mniej bitów do dyspozycji na opisanie części ułamkowej).
Zapis stałoprzecinkowy ma tę zaletę, że arytmetyka stałoprzecinkowa może zostać zrealizowana za pomocą działań całkowitoliczbowych. Możliwe jest dzięki temu działanie na ułamkach tam, gdzie nie ma możliwości użycia liczb zmiennoprzecinkowych: na prostych mikrokomputerach lub w programach używających rozkazów MMX. Zapis stałoprzecinkowy był także powszechnie stosowany gdy jednostka zmiennoprzecinkowa procesora była nie dość wydajna, a jednocześnie nie była potrzebna wysoka dokładność obliczeń, np. w szybkich procedurach graficznych.
[edit] Reprezentacja zmiennoprzecinkowa
Liczba zmiennoprzecinkowa reprezentowana jest jako trójka MBE (B oznacza od tej pory betę), gdzie M jest znacznikiem (significand, dawniej mantysa - mantissa), B - bazą reprezentacji (radix), E wykładnikiem (exponent). Liczba w takiej reprezentacji to:
F = MBE
W celu reprezentowania liczb dodatnij i ujemnych stosuje się reprezentację znaku przy pomocy bitu. Od 1985 roku istnieje standard opisu liczb zmiennoprzecinkowych IEEE754 (wznowiony i uzupełniony w postaci IEE854 w 1987). Standard te przewiduje istnienie liczb zmiennoprzecinkowych reprezentowanych przez 32 bitową (pojedynczej precyzji):
3 22 11 00 0 1 43 65 87 0 SEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMM
Bazą w reprezentacji dwójkowej jest 2, zatem liczbę można reprezentowac jako:
F = S M 2E
Mantysa reprezentowana jest w przypadku liczb znormalizowanych jako wartość z ukrytą jedynką, znaczy to, że 11 i szereg 0 w mantysie to 1,11000000002 czyli 1,7510.
[edit] Arytmetyka zmienno- i stałoprzecinkowa
W przypadku arytmetyki stałoprzecinkowej prawdziwe są wszystkie twierdzenia stosowane w systemie uzupełnieniowym (przemienność dodawania, dodawania względem mnożenia, itd.). Dodawanie i odejmowanie nie wymaga korekcji (może wystąpić przepełnienie). Mnożenie wymaga skalowania. Jeśli obie liczby mają 4 bity po przecinku - wynik będzie posiadał 8 bitów po przecinku, zatem:
0010,0010
x0001,1101
----------
00100010
00100010
00100010
00100010
--------------
001111011010
czyli:
0011,11011010
czyli:
0011,1101
W przypadku arytmetyki zmiennoprzecinkowej dodawanie i odejmowanie liczb wymaga dostosowania wykładnika mniejszego do większego i obarczone jest błędem w przypadku różnicy wykładników. Wzór (dla dodawania - zamienić na +):
x1 - x2 = (M1 - M2BE2-E1)BE1
Jedna z mantys musi zostać zdenormalizowana, jeśli wykładniki się różnią.
Mnożenie: x1 x2 = (M1 M2)BE1+E2
Dzielenie: x1 / x2 = (M1 / M2)BE1-E2
[edit] Źródła informacji
- Biernat J. Arytmetyka komputerów, Warszawa, PWN 1996, str. 8
- Biernat J. Metody i układy arytmetyki komputerowej, Wrocław, Oficyna Wydawnicza Politechniki Wrocławskiej 2001
[edit] Pochodzenie tekstu
Tekst pochodzi z polskiej Wikipedii lub opiera się na haśle z Wikipedii i udostępniony jest na licencji GFDL.
- Co to GFDL? - artykuł na pl.wikipedia.org
- GFDL - licencja GFDL w witrynie gnu.org
