nieco o FP

Transkrypt

nieco o FP
MIKROKONTROLERY i MIKROPROCESORY ARYTMETYKA ZMIENNOPRZECINKOWA
Arytmetyka zmiennoprzecinkowa a procesory cyfrowe
Prawa algebry stosują się wyłącznie do arytmetyki
o nieograniczonej precyzji
x=x+1 dla x będącego liczbą całkowitą jest zgodne z algebrą,
dopóki nie przekroczymy maksymalnej wartości, która jest możliwa do
zapisania w skończonej długości słowa komputera.
Z liczbami rzeczywistymi rzecz jest nieporównanie bardziej złożona.
Zwykle liczby rzeczywiste przedstawia się w „notacji naukowej”:
±N.NN e±NN
gdzie N jest cyfrą z danego systemu (np. dziesiętnego).
W procesorze cyfrowym przeznaczamy pewną liczbę bitów na
mantysę i wykładnik.
Piotr Malecki
1/15
MIKROKONTROLERY i MIKROPROCESORY ARYTMETYKA ZMIENNOPRZECINKOWA
Konsekwentnie: liczby rzeczywiste w procesorach cyfrowych
są tylko podzbiorem liczb rzeczywistych, tylko tymi, które można
przedstawić przy pomocy skończonej liczby bitów.
Ma to olbrzymi wpływ na wyniki obliczeń!
Załóżmy, przykładowo, że operujemy liczbami z trzycyfrową
mantysą i dwucyfrową cechą: ±N.NN e±NN
Przed dodawaniem i odejmowaniem sprowadzamy zapis do
postaci o jednakowym wykładniku. Np. dodając 1.23 e1 do 4.56e0
przedstawiamy drugi składnik jako 0.456 e1 i otrzymujemy
sumę 1.686e1 . Wynik musi jednak być zaokrąglony, by spełnić
wymogi ograniczonej precyzji: i zatem wynosi 1.69 e1 . Ale, nawet
taki rachunek nie jest możliwy na procesorze, na którym nie
możemy uzyskać pośredniego składnika 0.456 e1.
W rzeczywistości nasz rachunek przyniesie wynik 1.68 e1, który jest
jeszcze mniej dokładny!
Piotr Malecki
2/15
MIKROKONTROLERY i MIKROPROCESORY ARYTMETYKA ZMIENNOPRZECINKOWA
W obliczeniach składających się z sekwencji operacji
arytmetycznych, błędy wynikające z ograniczonej precyzji kumulują się!
Przykład: dodajemy 1.23e3 do 1.00e0
Wynik pozostaje niezmieniony:1.23e3 + 0.001e3 = 1.23e3
Ponieważ nie możemy przedstawić 0.001e3
z powodu niedostatecznej precyzji.
Jeśli tę operację dodawania powtórzymy np. 10 razy, to otrzymamy
nadal wynik 1.23 e3 !
Gdybyśmy jednakże dodali najpierw do siebie 10 razy 1.00 e0,
a następne wynik (1.00 e1) do 1.23 e3 to otrzymalibyśmy inny
(poprawny) wynik 1.24 e3 !
Arytmetyka o ograniczonej precyzji prowadzi tu do zasady:
PORZĄDEK WYKONYWANIA DZIAŁAŃ WPŁYWA NA WYNIK !
Otrzymuje się dokładniejsze wyniki, gdy względne wielkości
liczb (wykładniki) są zbliżone. Przy sekwencji obliczeń powinno się
grupować bliższe sobie składniki.
3/15
Piotr Malecki
MIKROKONTROLERY i MIKROPROCESORY ARYTMETYKA ZMIENNOPRZECINKOWA
Inny problem pokazuje odejmowanie.
Np. 1.23 e0 – 1.22 e0 = 0.01 e0
Po normalizacji, którą zwykle wykonuje się w końcu operacji
arytmetycznych wynik ten 1.00 e-2 sugeruje, że dwie ostatnie cyfry
znaczące są równe zeru, co w rzeczywistości może być przypadkowe.
Mnożenia i dzielenia nie podlegają tym ograniczeniom
( nie ma potrzeby sprowadzania czynników do postaci
z jednakowymi wykładnikami)
Natomiast, operacje te mnożą, wzmacniają powstałe już błędy!
W poprzednim przykładzie pomnożenie przez dwa
obydwu wyników prowadzi do jeszcze większych rozbieżności:
2.46 e0 lub 2.48 e0
Piotr Malecki
4/15
MIKROKONTROLERY i MIKROPROCESORY ARYTMETYKA ZMIENNOPRZECINKOWA
Pewną regułą może być zmierzanie do takiej organizacji obliczeń,
by mnożenia i dzielenia wykonywane były wcześniej niż
dodawania i odejmowania
Tak więc obliczając wyrażenie x*(y+z)
można uzyskać nieco lepszą dokładność wykonując
x*y + x*z
(co trudno czasem zaakceptować programistom, którzy
zwracają uwagę na inną „ekonomię” obliczeń)
Mnożenie i dzielenie ma oczywiste problemy – również związane
z ograniczoną precyzją arytmetyki procesorów cyfrowych nadmiar i niedomiar (overflow and underflow) pojawiające się
przy mnożeniu dwóch wielkich liczb lub przy dzieleniu
małej liczby przez wielką
Piotr Malecki
5/15
MIKROKONTROLERY i MIKROPROCESORY ARYTMETYKA ZMIENNOPRZECINKOWA
Porównanie liczb zmiennoprzecinkowych jest operacją, prowadzącą do
błędnych wyników jeśli przeprowadzona niepoprawnie.
NIGDY NIE NALEŻY TESTOWAĆ
CZY DWIE LICZBY ZMIENNOPRZECINKOWE SĄ RÓWNE!
Np. dodawanie 1.31 e0 + 2.69 e0 powinno dać wynik 4.00 e0,
podobnie jak, 2.50 e0 + 1.50 e0.
Jednakże porównanie najpewniej
NIE WSKAŻE, ŻE WYNIKI SĄ IDENTYCZNE !
Poprawnym postępowaniem powinno być przyjęcie
dopuszczalnego błędu (tolerancji) i sprawdzenie,
czy wyniki mieszczą się w tych granicach.
If wartość1 >= (wartość2 – tol) AND wartość1 <= (wartość2 +tol) ..
lub
if abs(warość1 – wartość2) <= tol then ...
Piotr Malecki
6/15
MIKROKONTROLERY i MIKROPROCESORY ARYTMETYKA ZMIENNOPRZECINKOWA
WARUNKI POWINNO SIĘ FORMUŁOWAĆ NASTĘPUJĄCO:
=
if abs(x-y)
<= tol
then ...
<> (!=)
if abs(x-y)
> tol
then ...
<
if (x-y)
< tol
then ...
<=
if (x-y)
<= tol
then ...
>
if (x-y)
> tol
then ...
>=
if (x-y)
>= tol
then ...
Piotr Malecki
7/15
MIKROKONTROLERY i MIKROPROCESORY ARYTMETYKA ZMIENNOPRZECINKOWA
Gdy INTEL przystępował do produkcji koprocesora
zmiennoprzecinkowego dla swojego nowego (wtedy)
procesora 8086, to zwrócił się do najlepszych
znawców analiz numerycznych o projekt formatów
liczb zmiennoprzecinkowych dla 8087 FPU.
Kahn, Coonan i Stone zaprojektowali tzw
KCS Floating Point Standard, a IEEE przyjęła to za normę.
Powstały:
format liczb pojedynczej precyzji,
format podwójnej precyzji,
format precyzji rozszerzonej
Piotr Malecki
8/15
MIKROKONTROLERY i MIKROPROCESORY ARYTMETYKA ZMIENNOPRZECINKOWA
FORMAT POJEDYNCZEJ PRECYZJI (32 bity)
składa się z 24-bitowej mantysy, która reprezentuje wartości
od 1.0 do (prawie) 2.0
1.mmmmmmm mmmmmmmm mmmmmmmm
oraz 8-bitowej cechy
Przyjmuje się, że pierwszy, HO, bit mantysy jest zawsze 1
i stoi na lewo od znaku oddzielającego część całkowitą od
ułamkowej.
Skoro jest ZAWSZE 1 to się go NIE zapisuje.
Pozycję na lewo od (domyślnej) „kropki dwójkowej”
zajmuje za to bit reprezentujący znak.
Pozostałe 23 bity to bity na prawo od „kropki” dwójkowej.
Mantysa jest zatem zawsze większa lub równa 1.0
(i najwyżej „prawie” równa 2.)
Piotr Malecki
9/15
MIKROKONTROLERY i MIKROPROCESORY ARYTMETYKA ZMIENNOPRZECINKOWA
Wprawdzie między 1. a 2. jest nieskończona liczba wartości,
to mantysa może reprezentować jedynie osiem milionów z nich!
24-bitowa mantysa (faktycznie 23-bitowa z domyślnym bitem
o wartości 1.0) jest binarną liczbą bez znaku, a znak
jest zapisany jako oddzielny bit !
Przyjmuje się, że zwykłe zastosowania traktują zero jako
reprezentację z bitem znaku równym zero.
POJEDYNCZA PRECYZJA:
S EEEEEEEE FFFFFFF
01
9
Jeśli 0<E<255 to
Piotr Malecki
FFFFFFFF
FFFFFFFF
31
V = (-1)**S * 2**(E-127) * (1.F)
10/15
MIKROKONTROLERY i MIKROPROCESORY ARYTMETYKA ZMIENNOPRZECINKOWA
If E=255 and F is nonzero, then V=NaN ("Not a number")
If E=255 and F is zero and S is 1, then V = - Infinity
If E=255 and F is zero and S is 0, then V = Infinity
If E=0 and F is nonzero, then V=(-1)**S * 2 ** (-126) * (0.F)
These are "unnormalized" values.
If E=0 and F is zero and S is 1, then V = - 0
If E=0 and F is zero and S is 0, then V = 0
Piotr Malecki
11/15
MIKROKONTROLERY i MIKROPROCESORY ARYTMETYKA ZMIENNOPRZECINKOWA
POJEDYNCZA PRECYZJA:
S EEEEEEEE FFFFFFFFFFFFFFFFFFFFFFF
0 1
8 9
31
PRZYPADKI SZCZEGÓLNE:
0
1
0
1
00000000
00000000
11111111
11111111
00000000000000000000000
00000000000000000000000
00000000000000000000000
00000000000000000000000
0 11111111 00000000000000000000000
1 11111111 00100010001001010101010
... RACZEJ ZWYKŁE ...
0 10000000 00000000000000000000000
0 10000001 10100000000000000000000
1 10000001 10100000000000000000000
... I ZNÓW TROCHĘ NIEZWYKŁE ...
0 00000001 00000000000000000000000
0 00000000 10000000000000000000000
0 00000000 00000000000000000000001
= 0
= -0
= NIESKOŃCZONOŚĆ
= -NIESKOŃCZONOŚĆ
=
=
NaN
NaN
= +1 * 2**(128-127) * 1.0
= +1 * 2**(129-127) * 1.101
= -1 * 2**(129-127) * 1.101
= +1 * 2**(1-127)
= +1 * 2**(-127)
= +1 * 2**(-127)
= 2.0
= 6.5
= -6.5
* 1.0
= 2**(-126)
* 0.1
= 2**(-127)
* 2**(-23)= 2**(-150)
ZBIERAJĄC: WYKŁADNIK ZŁOŻONY Z SAMYCH JEDYNEK „OBSŁUGUJE” OBYDWIE
NIESKOŃCZONOŚCI ORAZ „NOT a NUMBER”,
A ZŁOŻONY Z SAMYCH ZER JEST ZAREZERWOWANY DLA ZERA ORAZ „DENORMALS”
(fizycznie zero, a logicznie -127 )
Piotr Malecki
12/15
MIKROKONTROLERY i MIKROPROCESORY ARYTMETYKA ZMIENNOPRZECINKOWA
LICZBA ZNORMALIZOWANA
TO TAKA, DLA KTÓREJ CZĘŚĆ CAŁKOWITA
– BIT NAJBARDZIEJ ZNACZĄCY -JEST RÓWNY 1 .
W SPAKOWANEJ FORMIE BIT TEN NIE JEST WIDOCZNY, JEST DOMYŚLNY.
LOGICZNA DŁUGOŚĆ MANTYSY JEST O JEDEN BIT WIĘKSZA NIŻ JEJ DŁUGOŚĆ FIZYCZNA.
PRZED WYKONYWANIEM OPERACJI MATEMATYCZNYCH POSTAĆ SPAKOWANA JEST ROZWIJANA.
COPROCESOR ZAWSZE UŻYWA POSTACI 80-CIO BITOWEJ,
UŻYWAJĄC SWOICH 80-BITOWYCH REJESTRÓW !!!
LICZBY SĄ AUTOMATYCZNIE ODPAKOWYWANE PRZY ŁADOWANIU REJESTRÓW
I PAKOWANE PRZY ODSYŁANIU DO PAMIĘCI.
NIE ISTNIEJE SPAKOWANA FORMA 80-BITOWA.
„DENORMAL”- LICZBA ZDENORMALIZOWANA TO TAKA, W KTÓREJ CZĘŚĆ WYKŁADNICZA JEST ZERO,
A TAKŻE CZĘŚĆ CAŁKOWITA (NAJBARDZIEJ ZNACZĄCA) MATYSY JEST RÓWNA ZERU.
„UNNORMAL” - LICZBA NIEZNORMALIZOWANA TO TAKA, W KTÓREJ CZĘŚĆ CAŁKOWITA MANTYSY
JEST ZERO, A CZĘŚĆ WYKŁADNICZA DOWOLNA. UNNORMALS MOŻNA ZOBACZYĆ OCZYWI ŚCIE
JEDYNIE W FORMIE ROZPAKOWANEJ.
Piotr Malecki
13/15
MIKROKONTROLERY i MIKROPROCESORY ARYTMETYKA ZMIENNOPRZECINKOWA
PODWÓJNA PRECYZJA
(IEEE):
S EEEEEEEEEEE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
0 1
11 12
63
11-BITOWA CECHA ORAZ 52-BITOWA MANTYSA
(Z 53-CIM BITEM DOMYŚLNYM)
Jeśli 0<E<2047 to
Piotr Malecki
V = (-1)**S * 2**(E-1023) * (1.F)
14/15
MIKROKONTROLERY i MIKROPROCESORY ARYTMETYKA ZMIENNOPRZECINKOWA
PRZYPADKI SZCZEGÓLNE
If E=2047 and F is nonzero, then V=NaN ("Not a number")
If E=2047 and F is zero and S is 1, then V = - Infinity
If E=2047 and F is zero and S is 0, then V = Infinity
If E=0 and F is nonzero, then V=(-1)**S * 2 ** (-1022) * (0.F)
These are "unnormalized" values.
If E=0 and F is zero and S is 1, then V = - 0
If E=0 and F is zero and S is 0, then V = 0
Piotr Malecki
15/15