static inline A0 finalize(const A0& a0, const A0& x, const A0& c, const A0 & k, const A0& ,const A0& ) { A0 y = oneminus(((-(x*c)/(Two<A0>()-c))-x)); return fast_ldexp(y, fast_toint(k)); }
value_t compute(const FUNC &f, const input_t& a, const input_t& b) { typedef typename details::fudge<FUNC,1,vtab_t,input_t,test> fudge1; typedef typename details::fudge<FUNC,13,vtab_t,input_t,test> fudge13; input_t d = b-a; real_t e = nt2::eps(nt2::abs(d)); input_t c = nt2::average(a, b); input_t h = d*Half<real_t>(); input_t se = e*sign(d); const real_t cs[] = {real_t(.942882415695480), nt2::Sqrt_2o_3<real_t>(), real_t(.641853342345781), nt2::Sqrt_1o_5<real_t>(), real_t(.236383199662150)}; rtab_t s(nt2::of_size(1, 5), &cs[0], &cs[5]); itab_t z = h*s; itab_t x = nt2::cath(nt2::cath(nt2::cath(nt2::cath(a, c-z), c), c+nt2::fliplr(z)), b); vtab_t y = f(x); fcnt_ = 13; fudge1::fdg(f, y, fcnt_, singular_a_, a, se); // Fudge a to avoid infinities. fudge13::fdg(f, y, fcnt_, singular_b_, b, -se); // Fudge b to avoid infinities. // Call the recursive core integrator. // Increase tolerance if refinement appears to be effective. value_t Q1 = h*nt2::globalsum(lobatto()*y(nt2::_(1,4,13)))*c245_; value_t Q2 = h*nt2::globalsum(kronrod()*y(nt2::_(1,2,13))); const real_t cs1[] = {real_t(.0158271919734802),real_t(.094273840218850),real_t(.155071987336585), real_t(.188821573960182),real_t(.199773405226859),real_t(.224926465333340)}; rtab_t s1(nt2::of_size(1, 6), &cs1[0], &cs1[6]); rtab_t w = nt2::cath(nt2::cath(s1, real_t(.242611071901408)), nt2::fliplr(s1)); value_t Q0 = h*nt2::globalsum(w*y)*c1470_; real_t r = nt2::abs((Q2-Q0)/(Q1-Q0+nt2::Smallestposval<real_t>())); if (r > 0 && r < 1) tol_ /= r; tol_*= c1470_; // Call the recursive core integrator. hmin_ = fast_ldexp(e, -10); //e/1024 return quadlstep(f,a,b,y(1),y(13))/c1470_; }
static inline A0 finalize(const A0&, const A0& x, const A0& c, const A0 & k, const A0& hi,const A0& lo) { A0 y = oneminus(((lo-(x*c)/(Two<A0>()-c))-hi)); return fast_ldexp(y, toint(k)); }
static inline A0 finalize(const A0& a0, const A0& , const A0& c , const A0& k, const A0& , const A0& ) { A0 y = fast_ldexp(c, toint(k)); //adjust for 10^n n flint return sel(b_and(is_gtz(a0), is_flint(a0)), round2even(y), y); }
static inline A0 finalize(const A0& a0, const A0& x, const A0& c, const A0 & k, const A0& ,const A0& ) { details::ignore_unused(a0); A0 y = oneminus(((-(x*c)/(Two<A0>()-c))-x)); return fast_ldexp(y, toint(k)); }
static inline A0 finalize(const A0& a0, const A0& , const A0& c , const A0& k, const A0& , const A0& ) { A0 y = fast_ldexp(c, fast_toint(k)); //adjust for 10^n n flint return where( (isgtz(a0) && isflint(a0)) , round(y), y); }
static inline A0 finalize(const A0& a0, const A0& x, const A0& c, const A0 & k, const A0& ,const A0& ) { A0 y = oneminus(((-(x*c)/(Two<A0>()-c))-x)); y = fast_ldexp(y, fast_toint(k)); // adjust for 2^n n flint return where(isflint(a0), round(y), y); }
static inline A0 finalize(const A0& a0, const A0& x, const A0& c, const A0 & k, const A0& ,const A0& ) { A0 y = oneminus(((-(x*c)/(Two<A0>()-c))-x)); y = fast_ldexp(y, toint(k)); // adjust for 2^n n flint return sel(b_and(is_gtz(a0), is_flint(a0)), round2even(y), y); }