| @@ -13,23 +13,28 @@ | |||||
| #endif | #endif | ||||
| #include <cstring> | #include <cstring> | ||||
| #include <cstdio> | |||||
| #include "core.h" | #include "core.h" | ||||
| using namespace lol; | using namespace lol; | ||||
| /* The order of the approximation we're looking for */ | /* The order of the approximation we're looking for */ | ||||
| static int const ORDER = 8; | |||||
| static int const ORDER = 4; | |||||
| /* The function we want to approximate */ | /* The function we want to approximate */ | ||||
| static real myfun(real const &x) | static real myfun(real const &x) | ||||
| { | { | ||||
| static real const one = 1.0; | |||||
| if (!x) | |||||
| return real::R_PI_2; | |||||
| return sin(x * real::R_PI_2) / x; | |||||
| //return cos(x) - one; | |||||
| //return exp(x); | |||||
| return exp(x); | |||||
| //if (!x) | |||||
| // return real::R_PI_2; | |||||
| //return sin(x * real::R_PI_2) / x; | |||||
| } | |||||
| static real myerror(real const &x) | |||||
| { | |||||
| return myfun(x); | |||||
| //return real::R_1; | |||||
| } | } | ||||
| /* Naive matrix inversion */ | /* Naive matrix inversion */ | ||||
| @@ -205,7 +210,6 @@ static void remez_init(real *coeff, real *zeroes) | |||||
| static void remez_findzeroes(real *coeff, real *zeroes, real *control) | static void remez_findzeroes(real *coeff, real *zeroes, real *control) | ||||
| { | { | ||||
| /* FIXME: this is fake for now */ | |||||
| for (int i = 0; i < ORDER + 1; i++) | for (int i = 0; i < ORDER + 1; i++) | ||||
| { | { | ||||
| real a = control[i]; | real a = control[i]; | ||||
| @@ -277,7 +281,7 @@ static void remez_finderror(real *coeff, real *zeroes, real *control) | |||||
| if (maxerror > final) | if (maxerror > final) | ||||
| final = maxerror; | final = maxerror; | ||||
| control[i] = (a + b) * (real)0.5; | control[i] = (a + b) * (real)0.5; | ||||
| printf("%g (in %g)\n", (double)maxerror, (double)control[i]); | |||||
| printf("%g (at %g)\n", (double)maxerror, (double)control[i]); | |||||
| break; | break; | ||||
| } | } | ||||
| } | } | ||||
| @@ -313,7 +317,10 @@ static void remez_step(real *coeff, real *control) | |||||
| sum += (real)cheby[n][k] * powers[k]; | sum += (real)cheby[n][k] * powers[k]; | ||||
| mat.m[i][n] = sum; | mat.m[i][n] = sum; | ||||
| } | } | ||||
| mat.m[i][ORDER + 1] = (real)(-1 + (i & 1) * 2); | |||||
| if (i & 1) | |||||
| mat.m[i][ORDER + 1] = fabs(myerror(control[i])); | |||||
| else | |||||
| mat.m[i][ORDER + 1] = -fabs(myerror(control[i])); | |||||
| } | } | ||||
| /* Solve the system */ | /* Solve the system */ | ||||