convert to double only once, and make sure we can deal with negative results of -y

This commit is contained in:
Lennart Poettering 2008-06-26 18:49:02 +02:00
parent eab1cb8df9
commit dcbb7f2680

View file

@ -295,24 +295,29 @@ static void estimate(pa_smoother *s, pa_usec_t x, pa_usec_t *y, double *deriv) {
*deriv = s->dp; *deriv = s->dp;
} else { } else {
double tx, ty;
/* Ok, we're not yet on track, thus let's interpolate, and /* Ok, we're not yet on track, thus let's interpolate, and
* make sure that the first derivative is smooth */ * make sure that the first derivative is smooth */
calc_abc(s); calc_abc(s);
tx = (double) x;
/* Move to origin */ /* Move to origin */
x -= s->ex; tx -= (double) s->ex;
/* Horner scheme */ /* Horner scheme */
*y = (pa_usec_t) ((double) x * (s->c + (double) x * (s->b + (double) x * s->a))); ty = (tx * (s->c + tx * (s->b + tx * s->a)));
/* Move back from origin */ /* Move back from origin */
*y += s->ey; ty += (double) s->ey;
*y = ty >= 0 ? (pa_usec_t) ty : 0;
/* Horner scheme */ /* Horner scheme */
if (deriv) if (deriv)
*deriv = s->c + ((double) x * (s->b*2 + (double) x * s->a*3)); *deriv = s->c + (tx * (s->b*2 + tx * s->a*3));
} }
/* Guarantee monotonicity */ /* Guarantee monotonicity */