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