The bisection always terminated after one iteration. Change the code to
check if the middle is different from the lower and upper limits as
suggested in the original recipe.
This fixes commit
b14689d59b06ec21a9e079c65a0882b7bf457448.
/* OK, so the root for b lies in (blo, bhi). Start bisecting */
do {
bmid = 0.5 * (blo + bhi);
+ if (!(blo < bmid && bmid < bhi))
+ break;
eval_robust_residual(x + start, y + start, n_points, bmid, &a, &rmid);
if (rmid == 0.0) {
break;
} else {
assert(0);
}
- } while ((bhi - blo) > tol && (bmid - blo) * (bhi - bmid) > 0.0);
+ } while (bhi - blo > tol);
*b0 = a;
*b1 = bmid;