diff options
-rw-r--r-- | libdimension/polynomial.c | 7 | ||||
-rw-r--r-- | tests/libdimension/Makefile.am | 4 | ||||
-rw-r--r-- | tests/libdimension/polynomial.c | 59 |
3 files changed, 66 insertions, 4 deletions
diff --git a/libdimension/polynomial.c b/libdimension/polynomial.c index f361d38..32dd922 100644 --- a/libdimension/polynomial.c +++ b/libdimension/polynomial.c @@ -80,7 +80,7 @@ dmnsn_real_degree(double poly[], size_t degree) static inline double dmnsn_improve_root(double poly[], size_t degree, double x) { - double error; + double dx; do { /* Calculate the value of the polynomial and its derivative at once */ double p = poly[degree], dp = 0.0; @@ -89,10 +89,9 @@ dmnsn_improve_root(double poly[], size_t degree, double x) p = p*x + poly[i]; } - double dx = p/dp; - error = fabs(dx/x); + dx = p/dp; x -= dx; - } while (error > dmnsn_epsilon); + } while (fabs(dx) > dmnsn_epsilon); return x; } diff --git a/tests/libdimension/Makefile.am b/tests/libdimension/Makefile.am index f6918dc..252deba 100644 --- a/tests/libdimension/Makefile.am +++ b/tests/libdimension/Makefile.am @@ -22,6 +22,7 @@ INCLUDES = -I$(top_srcdir)/libdimension check_LTLIBRARIES = libdimension-tests.la check_PROGRAMS = error-test \ warning-test \ + polynomial-test \ prtree-test \ png-test \ gl-test \ @@ -54,6 +55,9 @@ error_test_LDADD = libdimension-tests.la warning_test_SOURCES = warning.c warning_test_LDADD = libdimension-tests.la +polynomial_test_SOURCES = polynomial.c +polynomial_test_LDADD = libdimension-tests.la + prtree_test_SOURCES = prtree.c prtree_test_LDADD = libdimension-tests.la diff --git a/tests/libdimension/polynomial.c b/tests/libdimension/polynomial.c new file mode 100644 index 0000000..230a1a7 --- /dev/null +++ b/tests/libdimension/polynomial.c @@ -0,0 +1,59 @@ +/************************************************************************* + * Copyright (C) 2010 Tavian Barnes <tavianator@gmail.com> * + * * + * This file is part of The Dimension Test Suite. * + * * + * The Dimension Test Suite is free software; you can redistribute it * + * and/or modify it under the terms of the GNU General Public License as * + * published by the Free Software Foundation; either version 3 of the * + * License, or (at your option) any later version. * + * * + * The Dimension Test Suite is distributed in the hope that it will be * + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty * + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see <http://www.gnu.org/licenses/>. * + *************************************************************************/ + +/* + * Basic tests of PR-trees + */ + +#include "dimension.h" +#include <stddef.h> +#include <stdio.h> + +int +main() +{ + double poly[6], x[5]; + // poly[] = (x + 1)*(x - 1.2345)*(x - 2.3456)*(x - 5)*(x - 100) + poly[5] = 1.0; + poly[4] = -107.5801; + poly[3] = 770.2260432; + poly[2] = -1215.2863928; + poly[1] = -646.270936; + poly[0] = 1447.8216; + + size_t n = dmnsn_solve_polynomial(poly, 5, x); + if (n != 4) { + fprintf(stderr, + "--- Wrong number of roots found (%zu, should be %u) ---\n", + n, 4); + return EXIT_FAILURE; + } + + for (size_t i = 0; i < n; ++i) { + double evmin = dmnsn_evaluate_polynomial(poly, 5, x[i] - dmnsn_epsilon); + double ev = dmnsn_evaluate_polynomial(poly, 5, x[i]); + double evmax = dmnsn_evaluate_polynomial(poly, 5, x[i] + dmnsn_epsilon); + if (fabs(evmin) < ev || fabs(evmax) < ev) { + fprintf(stderr, "--- Root %.15g is inaccurate! ---\n", x[i]); + return EXIT_FAILURE; + } + } + + return EXIT_SUCCESS; +} |