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ć.