示例#1
0
 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));
 }
示例#2
0
 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_;
 }
示例#3
0
	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));
	}
示例#4
0
	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);
	}
示例#5
0
	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));
	}
示例#6
0
        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);
        }
示例#7
0
 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);
 }
示例#8
0
	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);
	}