Gad*dammit*!

So here I am, looking forward to a nice quiet weekend; hang
back, watch some telly and maybe read a bit – but
*NNnnneeeEEEEEUUUuuuuuuuu!!* *Someone* had to write an interesting
article about sine approximation.
With a *challenge* at the end. *And* using an inefficient kind
of approximation. And so now, instead of just relaxing, I have to spend
my entire weekend *and* most of the week figuring out a better way
of doing it. I hate it when this happens `>_<`.

Okay, maybe not.

Sarcasm aside, it is an interesting read. While the standard way of
calculating a sine – via a look-up table – works and
works well, there's just something unsatisfying about it. The
LUT-based approach is just … dull.
Uninspired. Cowardly. *Inelegant*.
In contrast, finding a suitable algorithm for it requires effort and a
modicum of creativity, so something like that always piques my interest.

In this case it's sine approximation. I'd been wondering about that when I did my arctan article, but figured it would require too many terms to really be worth the effort. But looking at Mr Schraut's post (whose site you should be visiting from time to time too; there's good stuff there) it seems you can get a decent version quite rapidly. The article centers around the work found at devmaster thread 5784, which derived the following two equations:

(1) | \begin{array}{} S_2(x) &=& \frac4\pi x - \frac4{\pi^2} x^2 \\ \\ S_{4d}(x) &=& (1-P)S_2(x) + P S_2^2(x) \end{array} |

These approximations work quite well, but I feel that it actually uses the wrong starting point. There are alternative approximations that give more accurate results at nearly no extra cost in complexity. In this post, I'll derive higher-order alternatives for both. In passing, I'll also talk about a few of the tools that can help analyse functions and, of course, provide some source code and do some comparisons.

Continue reading