- static value_type recursive_adaptive_integrate(const recursive_info<F>* info, Real a, Real b, unsigned max_levels, Real abs_tol, Real* error, Real* L1)
+ static auto recursive_adaptive_integrate(const recursive_info<F>* info, Real a, Real b, unsigned max_levels, Real abs_tol, Real* error, Real* L1)->decltype(std::declval<F>()(std::declval<Real>()))
{
- using std::fabs;
+ typedef decltype(info->f(Real(a))) K;
+ using std::abs;
Real error_local;
Real mean = (b + a) / 2;
Real scale = (b - a) / 2;
- auto ff = [&](const Real& x)->Real
+ auto ff = [&](const Real& x)->K
{
return info->f(scale * x + mean);
};
- Real estimate = scale * integrate_non_adaptive_m1_1(ff, &error_local, L1);
+ K r1 = integrate_non_adaptive_m1_1(ff, &error_local, L1);
- static value_type integrate(F f, Real a, Real b, unsigned max_depth = 15, Real tol = tools::root_epsilon<Real>(), Real* error = nullptr, Real* pL1 = nullptr)
+ static auto integrate(F f, Real a, Real b, unsigned max_depth = 15, Real tol = tools::root_epsilon<Real>(), Real* error = nullptr, Real* pL1 = nullptr)->decltype(std::declval<F>()(std::declval<Real>()))
{
+ typedef decltype(f(a)) K;
static const char* function = "boost::math::quadrature::gauss_kronrod<%1%>::integrate(f, %1%, %1%)";
if (!(boost::math::isnan)(a) && !(boost::math::isnan)(b))
{
// Infinite limits:
if ((a <= -tools::max_value<Real>()) && (b >= tools::max_value<Real>()))