When I do something trigonometric, I reach for a library implementing common trig functions, e.g. `Math.sin`

. From school through university through work, I’ve been taught to treat these functions as black boxes. Before we had calculators at school, there were books of sine tables - more black boxes. How do these functions actually work? How do you define `sin(x)`

?

```
function sin(x) {
return /* ??? */;
}
```

One definition of sine which I was familiar with is: sine is the function traced out by a point on a rotating circle, when viewing the circle from the edge. If you try to implementing sine with this definition, you look up the definition of a circle, plug in the angles, and get …

```
function sin(x) {
return Math.sin(x);
}
```

… great. But a different definition of sine is: sine is the function traced out by an object on a spring. A spring exerts a force on the object, pushing it back towards the equilibrium. An ideal spring is a “simple harmonic oscillator”, which means that it exerts a force proportional to the distance from the equilibrium.

Based on this definition, we can write a `sin`

function which works by simulating a spring:

```
var delta = 0.001;
function springSin(x) {
var velocity = delta;
var y = 0;
for (var t = 0; t < x; t += delta) {
y += velocity;
velocity -= y * (delta * delta);
}
return y;
}
```

We can optimize this using the repeating and symmetric nature of the sine function:

```
var delta = 0.001;
function optimizedSpringSin(x) {
var sign = 1;
if (x < 0) { x = -1; sign = -sign; } // [0, inf]
x = x % (2 * Math.PI); // [0, 2*Math.PI]
if (Math.PI < x) { x -= Math.PI; sign = -sign; } // [0, Math.PI]
if (Math.PI/2 < x) { x = Math.PI - x; } // [0, 1/2 Math.PI]
// Now x is in [0, 1/2 PI]
return springSin(x) * sign;
}
```

Here’s a plot of the `Math.sin`

function (green) next to the `optimizedSpringSin`

function (black, slightly offset):

Why does the iterative `springSin`

function approximate the true sine function? Because there’s a relationship between oscillation and circles/triangles. Unfortunately I don’t understand that relationship.

The actual implementation of `sin`

in math libraries uses a “Taylor series approximation” of the sine function. Unfortunately I don’t understand that, either.

*
I wrote this because I felt like it.
This post is my own, and not associated with my employer.
*