Quick actions

cmd+k|ctrl+k

Navigation

Languages

Sin table lookup

Snippet info

Language

C

Visibility

public

Author

evine

Created

2021-04-25T16:00:44.644885Z

Updated

2021-04-25T16:11:47.547738Z

#include <stdio.h>
#include <math.h>
#include <assert.h>

typedef struct {
    double input;
    double output;
} Sin_Table_Cell;

Sin_Table_Cell sin_table[128];

double lerp(double a, double b, double t) {
    return (1 - t) * a + t * b;
}

double sin_l(double v) {
    double fi = (v / 6.283185307179586) * 128;
    // My sin_table generation is a bit broken around the overflow
    assert(fi >= 1);
    assert(fi < 127);
    
    int li = fi;
    int hi = li + 1;
    double ls = sin_table[li].output;
    double hs = sin_table[hi].output;
    double diff = fi - li;
    
    return lerp(ls, hs, diff);
}

int main(void) {
    for(int i = 0; i < 128; ++i) {
        double input = i / 20.3821656051;
        //printf("\t(Sin_Table_Cell){%g, %g},\n", input, sin(input));
    }
    
    double v = 0.7;
    printf("sin(%g)   == %g\n", v, sin(v));
    printf("sin_l(%g) == %g\n", v, sin_l(v));
    
    return 0;
}

Sin_Table_Cell sin_table[128] = {
	(Sin_Table_Cell){0, 0},
	(Sin_Table_Cell){0.0490625, 0.0490428},
	(Sin_Table_Cell){0.098125, 0.0979676},
	(Sin_Table_Cell){0.147187, 0.146657},
	(Sin_Table_Cell){0.19625, 0.194993},
	(Sin_Table_Cell){0.245312, 0.242859},
	(Sin_Table_Cell){0.294375, 0.290142},
	(Sin_Table_Cell){0.343437, 0.336726},
	(Sin_Table_Cell){0.3925, 0.382499},
	(Sin_Table_Cell){0.441562, 0.427353},
	(Sin_Table_Cell){0.490625, 0.471177},
	(Sin_Table_Cell){0.539687, 0.513868},
	(Sin_Table_Cell){0.58875, 0.555322},
	(Sin_Table_Cell){0.637812, 0.595439},
	(Sin_Table_Cell){0.686875, 0.634124}, // sin_l(0.7) samples this and
	(Sin_Table_Cell){0.735937, 0.671282}, // this sample, and does a lerp between them
	(Sin_Table_Cell){0.785, 0.706825},
	(Sin_Table_Cell){0.834062, 0.740667},
	(Sin_Table_Cell){0.883125, 0.772726},
	(Sin_Table_Cell){0.932187, 0.802926},
	(Sin_Table_Cell){0.98125, 0.831193},
	(Sin_Table_Cell){1.03031, 0.85746},
	(Sin_Table_Cell){1.07937, 0.881663},
	(Sin_Table_Cell){1.12844, 0.903744},
	(Sin_Table_Cell){1.1775, 0.923651},
	(Sin_Table_Cell){1.22656, 0.941334},
	(Sin_Table_Cell){1.27562, 0.956752},
	(Sin_Table_Cell){1.32469, 0.969868},
	(Sin_Table_Cell){1.37375, 0.980649},
	(Sin_Table_Cell){1.42281, 0.98907},
	(Sin_Table_Cell){1.47187, 0.995111},
	(Sin_Table_Cell){1.52094, 0.998757},
	(Sin_Table_Cell){1.57, 1},
	(Sin_Table_Cell){1.61906, 0.998835},
	(Sin_Table_Cell){1.66812, 0.995267},
	(Sin_Table_Cell){1.71719, 0.989304},
	(Sin_Table_Cell){1.76625, 0.98096},
	(Sin_Table_Cell){1.81531, 0.970255},
	(Sin_Table_Cell){1.86437, 0.957214},
	(Sin_Table_Cell){1.91344, 0.941871},
	(Sin_Table_Cell){1.9625, 0.92426},
	(Sin_Table_Cell){2.01156, 0.904425},
	(Sin_Table_Cell){2.06062, 0.882413},
	(Sin_Table_Cell){2.10969, 0.858278},
	(Sin_Table_Cell){2.15875, 0.832077},
	(Sin_Table_Cell){2.20781, 0.803874},
	(Sin_Table_Cell){2.25687, 0.773736},
	(Sin_Table_Cell){2.30594, 0.741736},
	(Sin_Table_Cell){2.355, 0.707951},
	(Sin_Table_Cell){2.40406, 0.672462},
	(Sin_Table_Cell){2.45312, 0.635355},
	(Sin_Table_Cell){2.50219, 0.596718},
	(Sin_Table_Cell){2.55125, 0.556646},
	(Sin_Table_Cell){2.60031, 0.515234},
	(Sin_Table_Cell){2.64937, 0.472581},
	(Sin_Table_Cell){2.69844, 0.428792},
	(Sin_Table_Cell){2.7475, 0.383971},
	(Sin_Table_Cell){2.79656, 0.338225},
	(Sin_Table_Cell){2.84562, 0.291666},
	(Sin_Table_Cell){2.89469, 0.244404},
	(Sin_Table_Cell){2.94375, 0.196555},
	(Sin_Table_Cell){2.99281, 0.148232},
	(Sin_Table_Cell){3.04187, 0.0995525},
	(Sin_Table_Cell){3.09094, 0.0506335},
	(Sin_Table_Cell){3.14, 0.00159265},
	(Sin_Table_Cell){3.18906, -0.047452},
	(Sin_Table_Cell){3.23812, -0.0963825},
	(Sin_Table_Cell){3.28719, -0.145081},
	(Sin_Table_Cell){3.33625, -0.19343},
	(Sin_Table_Cell){3.38531, -0.241314},
	(Sin_Table_Cell){3.43437, -0.288617},
	(Sin_Table_Cell){3.48344, -0.335226},
	(Sin_Table_Cell){3.5325, -0.381027},
	(Sin_Table_Cell){3.58156, -0.425912},
	(Sin_Table_Cell){3.63062, -0.469772},
	(Sin_Table_Cell){3.67969, -0.512501},
	(Sin_Table_Cell){3.72875, -0.553997},
	(Sin_Table_Cell){3.77781, -0.594159},
	(Sin_Table_Cell){3.82687, -0.632892},
	(Sin_Table_Cell){3.87594, -0.670101},
	(Sin_Table_Cell){3.925, -0.705698},
	(Sin_Table_Cell){3.97406, -0.739596},
	(Sin_Table_Cell){4.02312, -0.771714},
	(Sin_Table_Cell){4.07219, -0.801975},
	(Sin_Table_Cell){4.12125, -0.830306},
	(Sin_Table_Cell){4.17031, -0.856639},
	(Sin_Table_Cell){4.21937, -0.88091},
	(Sin_Table_Cell){4.26844, -0.903062},
	(Sin_Table_Cell){4.3175, -0.923039},
	(Sin_Table_Cell){4.36656, -0.940796},
	(Sin_Table_Cell){4.41562, -0.956288},
	(Sin_Table_Cell){4.46469, -0.969479},
	(Sin_Table_Cell){4.51375, -0.980336},
	(Sin_Table_Cell){4.56281, -0.988834},
	(Sin_Table_Cell){4.61187, -0.994953},
	(Sin_Table_Cell){4.66094, -0.998677},
	(Sin_Table_Cell){4.71, -0.999997},
	(Sin_Table_Cell){4.75906, -0.998911},
	(Sin_Table_Cell){4.80812, -0.995421},
	(Sin_Table_Cell){4.85719, -0.989535},
	(Sin_Table_Cell){4.90625, -0.981268},
	(Sin_Table_Cell){4.95531, -0.970639},
	(Sin_Table_Cell){5.00437, -0.957674},
	(Sin_Table_Cell){5.05344, -0.942404},
	(Sin_Table_Cell){5.1025, -0.924867},
	(Sin_Table_Cell){5.15156, -0.905103},
	(Sin_Table_Cell){5.20062, -0.883162},
	(Sin_Table_Cell){5.24969, -0.859094},
	(Sin_Table_Cell){5.29875, -0.83296},
	(Sin_Table_Cell){5.34781, -0.80482},
	(Sin_Table_Cell){5.39687, -0.774744},
	(Sin_Table_Cell){5.44594, -0.742803},
	(Sin_Table_Cell){5.495, -0.709075},
	(Sin_Table_Cell){5.54406, -0.67364},
	(Sin_Table_Cell){5.59312, -0.636584},
	(Sin_Table_Cell){5.64219, -0.597995},
	(Sin_Table_Cell){5.69125, -0.557968},
	(Sin_Table_Cell){5.74031, -0.516598},
	(Sin_Table_Cell){5.78937, -0.473984},
	(Sin_Table_Cell){5.83844, -0.43023},
	(Sin_Table_Cell){5.8875, -0.385441},
	(Sin_Table_Cell){5.93656, -0.339723},
	(Sin_Table_Cell){5.98562, -0.293189},
	(Sin_Table_Cell){6.03469, -0.245948},
	(Sin_Table_Cell){6.08375, -0.198116},
	(Sin_Table_Cell){6.13281, -0.149807},
	(Sin_Table_Cell){6.18187, -0.101137},
	(Sin_Table_Cell){6.23094, -0.052224},
};
INFO