summaryrefslogtreecommitdiffstats
path: root/libdimension/polynomial.c
diff options
context:
space:
mode:
authorTavian Barnes <tavianator@tavianator.com>2012-12-21 19:30:30 -0500
committerTavian Barnes <tavianator@tavianator.com>2012-12-21 19:32:35 -0500
commita0a11f34d75eef9971a870fd51dd6d08f7708311 (patch)
treee1338fab71a9c4f878f426e2ba1ef5bcc8ce520f /libdimension/polynomial.c
parentc0680e8a3aecdf686223a97811e68b585eb25df7 (diff)
downloaddimension-a0a11f34d75eef9971a870fd51dd6d08f7708311.tar.xz
Fix the polynomial solver when the bounds are exact.
Diffstat (limited to 'libdimension/polynomial.c')
-rw-r--r--libdimension/polynomial.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/libdimension/polynomial.c b/libdimension/polynomial.c
index a08318b..9491861 100644
--- a/libdimension/polynomial.c
+++ b/libdimension/polynomial.c
@@ -214,6 +214,12 @@ dmnsn_bisect_root(const double poly[], size_t degree, double min, double max)
{
double evmin = dmnsn_polynomial_evaluate(poly, degree, min);
double evmax = dmnsn_polynomial_evaluate(poly, degree, max);
+
+ /* Handle equal bounds, and equal values at the bounds. */
+ if (dmnsn_unlikely(fabs(evmax - evmin) < dmnsn_epsilon)) {
+ return (min + max)/2.0;
+ }
+
double evinitial = dmnsn_min(fabs(evmin), fabs(evmax));
double mid, evmid;
int lastsign = 0;
@@ -425,7 +431,7 @@ dmnsn_polynomial_print(FILE *file, const double poly[], size_t degree)
if (i < degree) {
fprintf(file, (poly[i] >= 0.0) ? " + " : " - ");
}
- fprintf(file, "%.15g", fabs(poly[i]));
+ fprintf(file, "%.17g", fabs(poly[i]));
if (i >= 2) {
fprintf(file, "*x^%zu", i);
} else if (i == 1) {