Wszystkie obliczenia w octavie są wykonywane w arytmetyce zmiennopozycyjnej (inaczej - arytmetyce fl) podwójnej precyzji (double) - choć w najnowszych wersjach octave'a istnieje możliwość używania zmiennych typu single, czyli zmiennych w pojedynczej precyzji arytmetyki zmiennopozycyjnej.
Dokładność względna arytmetyki podwójnej precyzji wynosi ok. , a dokładność arytmetyki pojedynczej precyzji wynosi ok.
.
W octavie jest kilka funkcji związanych bezpośrednio z własnościami arytmetyki fl, mianowicie:
eps
- zwraca epsilon maszynowy arytmetyki, tzn. najmniejszą liczbę eps
zwróci nam epsilon maszynowy dla arytmetyki podwójnej precyzji. Z kolei wywołanie eps(a)
- dla single(x)
- funkcja konwertująca zmienną np. typu double, czyli w podwójnej precyzji arytmetyki, do zmiennej typu single, czyli w pojedynczej precyzji arytmetyki zmiennopozycyjnej
double(x)
- funkcja konwertująca zmienną do typu zmiennej w podwójne precyzji arytmetyki, czyli odwrotna do funkcji single(x)
. Podwójna precyzja jest w octavie domyślna, więc wydaje się że, głównym zastosowaniem tej funkcji jest konwersja zmiennej typu single z powrotem do typu double
Zastosujmy funkcję eps
- sprawdźmy, czy rzeczywiście w fl jest większe od jeden, a np.
już nie - tu fragment kodu octave'a:
w arytmetyce zmiennopozycyjnej" />
Przy pomocy eps
możemy znaleźć najmniejszą liczbę dodatnią w arytmetyce podwójnej precyzji:
Sprawdźmy:
Sprawdźmy, jak działają funkcje związane ze zmianą precyzji arytmetyki single
i double
- tu fragment sesji octave'a:
Otrzymaliśmy, że epsilon maszynowy w podwójnej precyzji wynosi:
, a w pojedynczej precyzji arytmetyki:
.
Teraz znajdziemy najmniejszą liczbę dodatnią w arytmetyce pojedynczej precyzji:
Inną własnością arytmetyki fl, która może powodować problemy, jest tzw. redukcja cyfr przy odejmowaniu liczb tego samego znaku.
Przetestujmy to na dwóch równoważnych wzorach na
funkcję
Przetestujmy oba wzory dla bliskich zeru:
Wykres na rysunku [link] pokazuje, że wzór drugi jest lepszy ze względu na arytmetykę fl.
Możemy oczywiście policzyć też błąd pomiędzy wynikami:
Różnica jest
pozornie mała, bo rzędu . Jednak
jest rzędu
, więc
dokładność względna jest rzędu .
Jest to bardzo mała dokładność, jak na arytmetykę podwójnej precyzji, w której błąd względny obliczeń jest na poziomie .
Możemy policzyć względny błąd względem :
i otrzymamy .
Inny przykład na problemy redukcją cyfr, to obliczanie wartości funkcji
korzystające z rozwinięcia w szereg o wyrazach o różnych znakach.
Rozpatrzmy funkcję , która ma następujące rozwinięcie w globalnie zbieżny
szereg:
" />
Zaimplementujmy w octavie funkcję obliczającą przybliżenie funkcji matematycznej , korzystające z odpowiedniego obcięcia tego rozwinięcia dla dowolnego
rzeczywistego. Implementacja tej funkcji będzie wektorowa, tzn. wywołanie jej z macierzą
jako argumentem zwróci macierz przybliżeń wartości
na odpowiednich elementach macierzy
.
Przetestujmy naszą funkcję na .
Na wykresie nie widać różnicy.
Przetestujmy naszą funkcję dla większych argumentów: :
Widać z rysunku [link], że rozwijanie w szereg nie zawsze ma sens z powodu
własności arytmetyki zmiennopozycyjnej.
Można postawić pytanie, czy w rozwinięciu nie było za mało wyrazów szeregu?
Proszę sprawdzić, że zwiększenie ilości wyrazów szeregu nic nie zmieniło.
Popatrzmy, jak rośnie błąd na skali logarytmicznej, por. rysunek [link]:
Błąd w skali logarytmicznej rośnie liniowo. To oznacza, że
błąd rośnie wykładniczo.
dla
w zależności od
." />
Kolejnym przykładem sytuacji, w której mogą pojawić się problemy, to obliczanie pochodnej za pomocą ilorazów różnicowych, czyli wprost z definicji.
dla
w zależności od
w skali półlogarytmicznej" />
Przetestujmy przybliżone obliczanie pochodnej z definicji, czyli ze wzoru:
Wydawałoby się, że im jest mniejsze, tym lepsze przybliżenie otrzymamy.
Ale np. dla z
i
, np. dla
, otrzymamy w arytmetyce fl:
Sprawdźmy:
Czyli rzeczywiście nie może być dowolnie małe.
Spróbujmy znaleźć dla tego przykładu optymalne postaci
eksperymentalnie.
Na wykresie nie widać dokładnie, por. rysunek [link], gdzie jest minimum. Na wykresie w skali pół-logarytmicznej minimum jest widoczne, por. rysunek [link]:
Widzimy, że optymalne w tym przypadku jest rzędu
, czyli ok
.
Można powtórzyć te same obliczenia dla przybliżania pochodnej za pomocą tzw. ilorazu centralnego:
W kolejnych rozdziałach będziemy omawiali wpływ
arytmetyki zmiennopozycyjnej na wyniki obliczeń dla konkretnych zadań.