11 #define VEC1024LINCMP(X0, X1, Y0, YS) \
12 cl->curve ().get_vector ((X0), (X1), vec, 1024); \
13 for (int i = 0; i < 1024; ++i) { \
15 snprintf (msg, 64, "at i=%d (x0=%.1f, x1=%.1f, y0=%.1f, ys=%.3f)", \
17 CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE ( \
19 (Y0) + i * (YS), vec[i], \
46 CPPUNIT_ASSERT_EQUAL_MESSAGE (
"veclen=1 @ 2048..2048", 2560.
f, vec[0]);
52 CPPUNIT_ASSERT_EQUAL_MESSAGE (
"veclen=1 @ 2048-2049", 2560.125
f, vec[0]);
55 CPPUNIT_ASSERT_EQUAL_MESSAGE (
"veclen=1 @ 2048-2049", 2561.
f, vec[0]);
59 CPPUNIT_ASSERT_EQUAL_MESSAGE (
"veclen=1 , 2048..2049", 2560.
f, vec[0]);
62 CPPUNIT_ASSERT_EQUAL_MESSAGE (
"veclen=1 , 2048..2049", 2560.
f, vec[0]);
66 CPPUNIT_ASSERT_EQUAL_MESSAGE (
"veclen=2 , 2048..2048 @ 0", 2560.
f, vec[0]);
67 CPPUNIT_ASSERT_EQUAL_MESSAGE (
"veclen=2 , 2048..2048 @ 1", 2560.
f, vec[1]);
70 CPPUNIT_ASSERT_EQUAL_MESSAGE (
"veclen=2 , 2048..2056 @ 0", 2560.
f, vec[0]);
71 CPPUNIT_ASSERT_EQUAL_MESSAGE (
"veclen=2 , 2048..2056 @ 0", 2562.
f, vec[1]);
74 CPPUNIT_ASSERT_EQUAL_MESSAGE (
"veclen=3 , 2048..2056 @ 0", 2560.
f, vec[0]);
75 CPPUNIT_ASSERT_EQUAL_MESSAGE (
"veclen=3 , 2048..2056 @ 1", 2561.
f, vec[1]);
76 CPPUNIT_ASSERT_EQUAL_MESSAGE (
"veclen=3 , 2048..2056 @ 2", 2562.
f, vec[2]);
82 CPPUNIT_ASSERT_EQUAL_MESSAGE (
"veclen=1 @ -1", 2048.
f, vec[0]);
85 CPPUNIT_ASSERT_EQUAL_MESSAGE (
"veclen=1 @ 9999", 4096.
f, vec[0]);
88 for (
int i = 0; i < 13; ++i) {
89 CPPUNIT_ASSERT_EQUAL_MESSAGE (
"veclen=13 @ -999..0", 2048.
f, vec[i]);
93 for (
int i = 0; i < 8; ++i) {
94 CPPUNIT_ASSERT_EQUAL_MESSAGE (
"veclen=8 @ 9998..9999", 4096.
f, vec[i]);
114 CPPUNIT_ASSERT_EQUAL_MESSAGE (
"veclen=1 @ 50", 3.
f, vec[0]);
117 CPPUNIT_ASSERT_EQUAL_MESSAGE (
"veclen=1 @ 100", 4.
f, vec[0]);
120 CPPUNIT_ASSERT_EQUAL_MESSAGE (
"veclen=1 @ 150", 2.
f, vec[0]);
123 CPPUNIT_ASSERT_EQUAL_MESSAGE (
"veclen=3 130..150 @ 0", 2.8
f, vec[0]);
124 CPPUNIT_ASSERT_EQUAL_MESSAGE (
"veclen=3 130..150 @ 2", 2.4
f, vec[1]);
125 CPPUNIT_ASSERT_EQUAL_MESSAGE (
"veclen=3 130..150 @ 3", 2.0
f, vec[2]);
128 CPPUNIT_ASSERT_EQUAL_MESSAGE (
"veclen=3 80..160 @ 0", 3.6
f, vec[0]);
129 CPPUNIT_ASSERT_EQUAL_MESSAGE (
"veclen=3 80..160 @ 2", 3.2
f, vec[1]);
130 CPPUNIT_ASSERT_EQUAL_MESSAGE (
"veclen=3 80..160 @ 3", 1.6
f, vec[2]);
239 static const struct point data[] = {
258 for (i=0; i<
sizeof(data)/
sizeof(data[0]); i++) {
259 l.
add (data[i].x, data[i].y);
267 const float *g = &f[10];
270 CPPUNIT_ASSERT_EQUAL( 30.0f, g[-10]);
271 CPPUNIT_ASSERT_EQUAL( 30.0f, g[ 0]);
272 CPPUNIT_ASSERT_EQUAL(130.0f, g[ 10]);
273 CPPUNIT_ASSERT_EQUAL(150.0f, g[ 30]);
274 CPPUNIT_ASSERT_EQUAL(150.0f, g[ 40]);
275 CPPUNIT_ASSERT_EQUAL(150.0f, g[ 50]);
276 CPPUNIT_ASSERT_EQUAL(320.0f, g[100]);
277 CPPUNIT_ASSERT_EQUAL(320.0f, g[110]);
338 long double a1, b1, c1, d1, a2, b2, c2, d2, fdx0, fddx0, fdx1, fdx2, fddx1, fddx2;
339 double x0 = data[0].x;
340 double y0 = data[0].y;
341 double x1 = data[1].x;
342 double y1 = data[1].y;
343 double x2 = data[2].x;
344 double y2 = data[2].y;
345 double x3 = data[3].x;
346 double y3 = data[3].y;
348 double dx0 = x1 - x0;
349 double dy0 = y1 - y0;
350 double dx1 = x2 - x1;
351 double dy1 = y2 - y1;
352 double dx2 = x3 - x2;
353 double dy2 = y3 - y2;
356 fdx1 = 2.0 / ( dx1 / dy1 + dx0 / dy0 );
357 fdx0 = 3.0 / 2.0 * dy0 / dx0 - fdx1 / 2.0;
359 fddx0 = -2.0 * (fdx1 + 2.0 * fdx0) / dx0 + 6.0 * dy0 / (dx0*dx0);
360 fddx1 = 2.0 * (2.0 * fdx1 + fdx0) / dx0 - 6.0 * dy0 / (dx0*dx0);
361 d1 = 1.0 / 6.0 * (fddx1 - fddx0) / dx0;
362 c1 = 1.0 / 2.0 * (x1 * fddx0 - x0 * fddx1) / dx0;
363 b1 = (dy0 - c1 * (x1* x1 - x0*x0) - d1 * (x1*x1*x1 - x0*x0*x0)) / dx0;
364 a1 = y0 - b1*x0 - c1*x0*x0 - d1*x0*x0*x0;
371 CPPUNIT_ASSERT_DOUBLES_EQUAL(30.0, a1, 0);
372 CPPUNIT_ASSERT_DOUBLES_EQUAL(14.09, b1, 0.001);
373 CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, c1, 0);
374 CPPUNIT_ASSERT_DOUBLES_EQUAL(-0.0409, d1, 0.00001);
376 for (x = 0; x <= 10; x++) {
377 double v = a1 + b1*x + c1*x*x + d1*x*x*x;
379 snprintf(msg, 64,
"interpolating %d: v=%f, x=%f...\n", x, v, g[x]);
380 CPPUNIT_ASSERT_DOUBLES_EQUAL(v, g[x], 0.000004);
384 fdx2 = 2.0 / ( dx2 / dy2 + dx1 / dy1 );
386 fddx1 = -2.0 * (fdx2 + 2.0 * fdx1) / dx1 + 6.0 * dy1 / (dx1*dx1);
387 fddx2 = 2.0 * (2.0 * fdx2 + fdx1) / dx1 - 6.0 * dy1 / (dx1*dx1);
388 d2 = 1.0 / 6.0 * (fddx2 - fddx1) / dx1;
389 c2 = 1.0 / 2.0 * (x2 * fddx1 - x1 * fddx2) / dx1;
390 b2 = (dy1 - c2 * (x2*x2 - x1*x1) - d2 * (x2*x2*x2 - x1*x1*x1)) / dx1;
391 a2 = y1 - b2*x1 - c2*x1*x1 - d2*x1*x1*x1;
398 CPPUNIT_ASSERT_DOUBLES_EQUAL(109.09, a2, 0.001);
399 CPPUNIT_ASSERT_DOUBLES_EQUAL(2.31818, b2, 0.00001);
400 CPPUNIT_ASSERT_DOUBLES_EQUAL(-0.01818, c2, 0.00001);
401 CPPUNIT_ASSERT_DOUBLES_EQUAL(-0.0004545, d2, 0.0000001);
403 for (x = 10; x <= 30; x++) {
404 double v = a2 + b2*x + c2*x*x + d2*x*x*x;
406 snprintf(msg, 64,
"interpolating %d: v=%f, x=%f...\n", x, v, g[x]);
407 CPPUNIT_ASSERT_DOUBLES_EQUAL(v, g[x], 0.000008);
void set_interpolation(InterpolationStyle)
void get_vector(double x0, double x1, float *arg, int32_t veclen)
void fast_simple_add(double when, double value)
double unlocked_eval(double x) const
#define VEC1024LINCMP(X0, X1, Y0, YS)
CPPUNIT_TEST_SUITE_REGISTRATION(CurveTest)
virtual void add(double when, double value, bool with_guards=true, bool with_default=true)