use crate::double_double::DoubleDouble;
#[inline]
pub(crate) fn poly_dd_3(x: DoubleDouble, poly: [(u64, u64); 3], l: f64) -> DoubleDouble {
let zch = poly[2];
let ach = f64::from_bits(zch.0) + l;
let acl = (f64::from_bits(zch.0) - ach) + l + f64::from_bits(zch.1);
let mut ch = DoubleDouble::new(acl, ach);
let zch = poly[1];
ch = DoubleDouble::quick_mult(ch, x);
let th = ch.hi + f64::from_bits(zch.0);
let tl = (f64::from_bits(zch.0) - th) + ch.hi;
ch.hi = th;
ch.lo += tl + f64::from_bits(zch.1);
let zch = poly[0];
ch = DoubleDouble::quick_mult(ch, x);
let th = ch.hi + f64::from_bits(zch.0);
let tl = (f64::from_bits(zch.0) - th) + ch.hi;
ch.hi = th;
ch.lo += tl + f64::from_bits(zch.1);
ch
}
#[inline]
pub(crate) fn poly_dekker_generic<const N: usize>(
x: DoubleDouble,
poly: [(u64, u64); N],
) -> DoubleDouble {
let zch = poly.last().unwrap();
let ach = f64::from_bits(zch.0);
let acl = f64::from_bits(zch.1);
let mut ch = DoubleDouble::new(acl, ach);
for zch in poly.iter().rev().skip(1) {
ch = DoubleDouble::quick_mult(ch, x);
let th = ch.hi + f64::from_bits(zch.0);
let tl = (f64::from_bits(zch.0) - th) + ch.hi;
ch.hi = th;
ch.lo += tl + f64::from_bits(zch.1);
}
ch
}