static char * test_glq_next_root_fail() { double roots[10]; int i, order, rc; /* Test order fail */ i = 1; order = -1; rc = glq_next_root(0.5, i, order, roots); sprintf(msg, "(order %d) return code %d, expected 1", order, rc); mu_assert(rc == 1, msg); order = 0; rc = glq_next_root(-0.1, i, order, roots); sprintf(msg, "(order %d) return code %d, expected 1", order, rc); mu_assert(rc == 1, msg); order = 1; rc = glq_next_root(1.1, i, order, roots); sprintf(msg, "(order %d) return code %d, expected 1", order, rc); mu_assert(rc == 1, msg); /* Test index fail */ order = 5; i = -1; rc = glq_next_root(0.5, i, order, roots); sprintf(msg, "(index %d, order %d) return code %d, expected 2", order, i, rc); mu_assert(rc == 2, msg); i = 5; rc = glq_next_root(0.5, i, order, roots); sprintf(msg, "(index %d, order %d) return code %d, expected 2", order, i, rc); mu_assert(rc == 2, msg); i = 10; rc = glq_next_root(0.5, i, order, roots); sprintf(msg, "(index %d, order %d) return code %d, expected 2", order, i, rc); mu_assert(rc == 2, msg); return 0; }
/* Calculates the GLQ nodes using glq_next_root. */ int glq_nodes(int order, double *nodes) { register int i; int rc = 0; double initial; if(order < 2) { return 1; } if(nodes == NULL) { return 2; } for(i = 0; i < order; i++) { initial = cos(PI*(order - i - 0.25)/(order + 0.5)); if(glq_next_root(initial, i, order, nodes) == 3) { rc = 3; } } return rc; }
static char * test_glq_next_root() { double prec = pow(10, -9), root[19], initial; int rc, i, order; /* Test order 2 */ order = 2; for(i = 0; i < order; i++) { initial = cos(PI*((order - i) - 0.25)/(order + 0.5)); rc = glq_next_root(initial, i, order, root); sprintf(msg, "(order %d, root %d) return code %d, expected 0", order, i, rc); mu_assert(rc == 0, msg); sprintf(msg, "(order %d, root %d) expected %.15f got %.15f", order, i, o2roots[i], root[i]); mu_assert_almost_equals(root[i], o2roots[i], prec, msg); } /* Test order 3 */ order = 3; for(i = 0; i < order; i++) { initial = cos(PI*((order - i) - 0.25)/(order + 0.5)); rc = glq_next_root(initial, i, order, root); sprintf(msg, "(order %d, root %d) return code %d, expected 0", order, i, rc); mu_assert(rc == 0, msg); sprintf(msg, "(order %d, root %d) expected %.15f got %.15f", order, i, o3roots[i], root[i]); mu_assert_almost_equals(root[i], o3roots[i], prec, msg); } /* Test order 4 */ order = 4; for(i = 0; i < order; i++) { initial = cos(PI*((order - i) - 0.25)/(order + 0.5)); rc = glq_next_root(initial, i, order, root); sprintf(msg, "(order %d, root %d) return code %d, expected 0", order, i, rc); mu_assert(rc == 0, msg); sprintf(msg, "(order %d, root %d) expected %.15f got %.15f", order, i, o4roots[i], root[i]); mu_assert_almost_equals(root[i], o4roots[i], prec, msg); } /* Test order 5 */ order = 5; for(i = 0; i < order; i++) { initial = cos(PI*((order - i) - 0.25)/(order + 0.5)); rc = glq_next_root(initial, i, order, root); sprintf(msg, "(order %d, root %d) return code %d, expected 0", order, i, rc); mu_assert(rc == 0, msg); sprintf(msg, "(order %d, root %d) expected %.15f got %.15f", order, i, o5roots[i], root[i]); mu_assert_almost_equals(root[i], o5roots[i], prec, msg); } /* Test order 19 */ order = 19; for(i = 0; i < order; i++) { initial = cos(PI*((order - i) - 0.25)/(order + 0.5)); rc = glq_next_root(initial, i, order, root); sprintf(msg, "(order %d, root %d) return code %d, expected 0", order, i, rc); mu_assert(rc == 0, msg); sprintf(msg, "(order %d, root %d) expected %.15f got %.15f", order, i, o19roots[i], root[i]); mu_assert_almost_equals(root[i], o19roots[i], prec, msg); } return 0; }