Browse Source

test: add support for relative error in the Remez exchange test program.

legacy
Sam Hocevar sam 13 years ago
parent
commit
123f903065
1 changed files with 17 additions and 10 deletions
  1. +17
    -10
      test/math/remez.cpp

+ 17
- 10
test/math/remez.cpp View File

@@ -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 */


Loading…
Cancel
Save