Trig table

by soulwire

JavaScript

function Tabulate( func, precision ) {

    precision = precision || 2;

    var TWO_PI = Math.PI * 2,
        p = Math.pow( 10, precision ),
        s = 1.0 / p,
        n = 1.0 + TWO_PI * p,
        a = new Float32Array( ~~n ),
        i, t;

    for ( i = 0, t = 0; i < n; i++, t += s ) a[ i ] = func( t );

    return function( r ) {
        return r >= 0
            ? a[ ~~( ( r % TWO_PI ) * p ) ]
            : a[ ~~( ( TWO_PI + r % TWO_PI ) * p ) ];
    }
}

// Test
var sin = new Tabulate( Math.sin, 4 );
var data = [];

for ( var i = 0; i < 10; i++ ) {

    var n = -10 + Math.random() * 20;
    var s1 = Math.sin( n );
    var s2 = sin( n );
    var d = Math.abs( s2 - s1 );

    data.push({
        radians: n,
        original: s1,
        tabulated: s2,
        delta: d
    });
}

console.table( data );