Funkcje trygonometryczne
Obliczanie w asemblerze
Created Nov 23, 2022 - Last updated: Nov 23, 2022
SSE nie ma instrukcji liczących wartości trygonometryczne. Dlatego postanowiłem trochę poćwiczyć asembler x86_64 i co nieco z tego zakresu zaimplementować. Obliczenie nie musi być tak optymalne jak biblioteczne wersje (libc) ale ma być dokładne. Bazą jest wzór Eulera.
$e^x$
$$e^x = 1 + \frac{x^1}{1} + \frac{x^2}{2!} + \frac{x^3}{3!} + \frac{x^4}{4!} + …$$
Wyraźnie pachnie pętlą…
Licznik kolejnego wyrażenia to licznik poprzedniego wymnożony przez $x$. Pierwszy licznik niech będzie $x$.
Mianownik zawiera silnię, więc wystarczy mnożyć poprzedni mianownik przez iterację pętli. No prawie - początek wymaga przyjęcia jedynki. Wartość dla której liczona jest silnia sprawdzi się jako licznik pętli.
$cos(x)$
$$\cos x = 1 - \frac{x^2}{2!} + \frac{x^4}{4!} - \dots=\sum_{n=0}^\infty\frac{(-1)^nx^{2n}}{(2n)!}$$
$sin(x)$
$$\sin x = x - \frac{x^3}{3!} + \frac{x^5}{5!} - \dots=\sum_{n=0}^\infty \frac{(-1)^n x^{2n+1}}{(2n+1)!}$$
A może lepiej zapisać to tak:
$$\sin x = - (\frac{x^3}{3!} + \frac{x^7}{7!} + \dots) +$$
$$ + (\frac{x^5}{5!} + \frac{x^9}{9!} + \dots) +$$
$$ + x$$
Licznik pętli przydatny w liczeniu silni rośnie co 2. Obliczone ułamki na przemian dodajemy do dwóch zmiennych. Pierwszą z nich odejmujemy od drugiej. Do rezultatu dodajemy jeszcze początkowy $x$.
Jak daleko liczyć pętlę? W nieskończoność! Albo do momentu, gdy precyzja IEEE754 da o sobie znać.