Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-07-11 08:15:12

0001 //  Copyright John Maddock 2015.
0002 //  Use, modification and distribution are subject to the
0003 //  Boost Software License, Version 1.0. (See accompanying file
0004 //  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
0005 
0006 #ifndef BOOST_MATH_QUADRATURE_GAUSS_HPP
0007 #define BOOST_MATH_QUADRATURE_GAUSS_HPP
0008 
0009 #ifdef _MSC_VER
0010 #pragma once
0011 #endif
0012 
0013 #include <limits>
0014 #include <vector>
0015 #include <boost/math/special_functions/legendre.hpp>
0016 #include <boost/math/constants/constants.hpp>
0017 
0018 #ifdef _MSC_VER
0019 #pragma warning(push)
0020 #pragma warning(disable:4127)
0021 #endif
0022 
0023 namespace boost { namespace math{ namespace quadrature{ namespace detail{
0024 
0025 template <class T>
0026 struct gauss_constant_category
0027 {
0028    static const unsigned value =
0029       (std::numeric_limits<T>::is_specialized == 0) ? 999 :
0030       (std::numeric_limits<T>::radix == 2) ?
0031       (
0032 #ifdef BOOST_HAS_FLOAT128
0033          (std::numeric_limits<T>::digits <= 113) && std::is_constructible<T, __float128>::value ? 0 :
0034 #else
0035          (std::numeric_limits<T>::digits <= std::numeric_limits<long double>::digits) && std::is_constructible<T, long double>::value ? 0 :
0036 #endif
0037          (std::numeric_limits<T>::digits10 <= 110) && std::is_constructible<T, const char*>::value ? 4 : 999
0038       ) : (std::numeric_limits<T>::digits10 <= 110) && std::is_constructible<T, const char*>::value ? 4 : 999;
0039    
0040    using storage_type =
0041       std::conditional_t<(std::numeric_limits<T>::is_specialized == 0), T,
0042          std::conditional_t<(std::numeric_limits<T>::radix == 2),
0043             std::conditional_t< ((std::numeric_limits<T>::digits <= std::numeric_limits<float>::digits) && std::is_constructible<T, float>::value),
0044                float,
0045                std::conditional_t<((std::numeric_limits<T>::digits <= std::numeric_limits<double>::digits) && std::is_constructible<T, double>::value),
0046                   double,
0047                   std::conditional_t<((std::numeric_limits<T>::digits <= std::numeric_limits<long double>::digits) && std::is_constructible<T, long double>::value),
0048                      long double,
0049 #ifdef BOOST_HAS_FLOAT128
0050                      std::conditional_t<((std::numeric_limits<T>::digits <= 113) && std::is_constructible<T, __float128>::value),
0051                         __float128,
0052                         T
0053                      >
0054                   >
0055 #else
0056                      T
0057                   >
0058 #endif
0059                >
0060             >, T
0061          >
0062       >;
0063 };
0064 
0065 #ifndef BOOST_MATH_GAUSS_NO_COMPUTE_ON_DEMAND
0066 
0067 template <class Real, unsigned N, unsigned Category>
0068 class gauss_detail
0069 {
0070    static std::vector<Real> calculate_weights()
0071    {
0072       std::vector<Real> result(abscissa().size(), 0);
0073       for (unsigned i = 0; i < abscissa().size(); ++i)
0074       {
0075          Real x = abscissa()[i];
0076          Real p = boost::math::legendre_p_prime(N, x);
0077          result[i] = 2 / ((1 - x * x) * p * p);
0078       }
0079       return result;
0080    }
0081 public:
0082    static const std::vector<Real>& abscissa()
0083    {
0084       static std::vector<Real> data = boost::math::legendre_p_zeros<Real>(N);
0085       return data;
0086    }
0087    static const std::vector<Real>& weights()
0088    {
0089       static std::vector<Real> data = calculate_weights();
0090       return data;
0091    }
0092 };
0093 
0094 #else
0095 
0096 template <class Real, unsigned N, unsigned Category>
0097 class gauss_detail;
0098 
0099 #endif
0100 #ifndef BOOST_HAS_FLOAT128
0101 template <class T>
0102 class gauss_detail<T, 7, 0>
0103 {
0104    using storage_type = typename gauss_constant_category<T>::storage_type;
0105 public:
0106    static std::array<storage_type, 4> const & abscissa()
0107    {
0108       static constexpr std::array<storage_type, 4> data = {
0109          static_cast<storage_type>(0.00000000000000000000000000000000000e+00L),
0110          static_cast<storage_type>(4.05845151377397166906606412076961463e-01L),
0111          static_cast<storage_type>(7.41531185599394439863864773280788407e-01L),
0112          static_cast<storage_type>(9.49107912342758524526189684047851262e-01L),
0113       };
0114       return data;
0115    }
0116    static std::array<storage_type, 4> const & weights()
0117    {
0118       static constexpr std::array<storage_type, 4> data = {
0119          static_cast<storage_type>(4.17959183673469387755102040816326531e-01L),
0120          static_cast<storage_type>(3.81830050505118944950369775488975134e-01L),
0121          static_cast<storage_type>(2.79705391489276667901467771423779582e-01L),
0122          static_cast<storage_type>(1.29484966168869693270611432679082018e-01L),
0123       };
0124       return data;
0125    }
0126 };
0127 #else
0128 template <class T>
0129 class gauss_detail<T, 7, 0>
0130 {
0131    using storage_type = typename gauss_constant_category<T>::storage_type;
0132 public:
0133    static std::array<storage_type, 4> const & abscissa()
0134    {
0135       static const std::array<storage_type, 4> data = {
0136          static_cast<storage_type>(0.00000000000000000000000000000000000e+00Q),
0137          static_cast<storage_type>(4.05845151377397166906606412076961463e-01Q),
0138          static_cast<storage_type>(7.41531185599394439863864773280788407e-01Q),
0139          static_cast<storage_type>(9.49107912342758524526189684047851262e-01Q),
0140       };
0141       return data;
0142    }
0143    static std::array<storage_type, 4> const & weights()
0144    {
0145       static const std::array<storage_type, 4> data = {
0146          static_cast<storage_type>(4.17959183673469387755102040816326531e-01Q),
0147          static_cast<storage_type>(3.81830050505118944950369775488975134e-01Q),
0148          static_cast<storage_type>(2.79705391489276667901467771423779582e-01Q),
0149          static_cast<storage_type>(1.29484966168869693270611432679082018e-01Q),
0150       };
0151       return data;
0152    }
0153 };
0154 #endif
0155 template <class T>
0156 class gauss_detail<T, 7, 4>
0157 {
0158 public:
0159    static  std::array<T, 4> const & abscissa()
0160    {
0161       static  std::array<T, 4> data = { // LCOV_EXCL_START
0162          BOOST_MATH_HUGE_CONSTANT(T, 0, 0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00),
0163          BOOST_MATH_HUGE_CONSTANT(T, 0, 4.0584515137739716690660641207696146334738201409937012638704325179466381322612565532831268972774658776528675866604802e-01),
0164          BOOST_MATH_HUGE_CONSTANT(T, 0, 7.4153118559939443986386477328078840707414764714139026011995535196742987467218051379282683236686324705969251809311201e-01),
0165          BOOST_MATH_HUGE_CONSTANT(T, 0, 9.4910791234275852452618968404785126240077093767061778354876910391306333035484014080573077002792572414430073966699522e-01),
0166       }; // LCOV_EXCL_STOP
0167       return data;
0168    }
0169    static  std::array<T, 4> const & weights()
0170    {
0171       static  std::array<T, 4> data = { // LCOV_EXCL_START
0172          BOOST_MATH_HUGE_CONSTANT(T, 0, 4.1795918367346938775510204081632653061224489795918367346938775510204081632653061224489795918367346938775510204081633e-01),
0173          BOOST_MATH_HUGE_CONSTANT(T, 0, 3.8183005050511894495036977548897513387836508353386273475108345103070554643412970834868465934404480145031467176458536e-01),
0174          BOOST_MATH_HUGE_CONSTANT(T, 0, 2.7970539148927666790146777142377958248692506522659876453701403269361881043056267681324094290119761876632337521337205e-01),
0175          BOOST_MATH_HUGE_CONSTANT(T, 0, 1.2948496616886969327061143267908201832858740225994666397720863872465523497204230871562541816292084508948440200163443e-01),
0176       }; // LCOV_EXCL_STOP
0177       return data;
0178    }
0179 };
0180 #ifndef BOOST_HAS_FLOAT128
0181 template <class T>
0182 class gauss_detail<T, 10, 0>
0183 {
0184    using storage_type = typename gauss_constant_category<T>::storage_type;
0185 public:
0186    static std::array<storage_type, 5> const & abscissa()
0187    {
0188       static constexpr std::array<storage_type, 5> data = {
0189          static_cast<storage_type>(1.48874338981631210884826001129719985e-01L),
0190          static_cast<storage_type>(4.33395394129247190799265943165784162e-01L),
0191          static_cast<storage_type>(6.79409568299024406234327365114873576e-01L),
0192          static_cast<storage_type>(8.65063366688984510732096688423493049e-01L),
0193          static_cast<storage_type>(9.73906528517171720077964012084452053e-01L),
0194       };
0195       return data;
0196    }
0197    static std::array<storage_type, 5> const & weights()
0198    {
0199       static constexpr std::array<storage_type, 5> data = {
0200          static_cast<storage_type>(2.95524224714752870173892994651338329e-01L),
0201          static_cast<storage_type>(2.69266719309996355091226921569469353e-01L),
0202          static_cast<storage_type>(2.19086362515982043995534934228163192e-01L),
0203          static_cast<storage_type>(1.49451349150580593145776339657697332e-01L),
0204          static_cast<storage_type>(6.66713443086881375935688098933317929e-02L),
0205       };
0206       return data;
0207    }
0208 };
0209 #else
0210 template <class T>
0211 class gauss_detail<T, 10, 0>
0212 {
0213    using storage_type = typename gauss_constant_category<T>::storage_type;
0214 public:
0215    static std::array<storage_type, 5> const & abscissa()
0216    {
0217       static const std::array<storage_type, 5> data = {
0218          static_cast<storage_type>(1.48874338981631210884826001129719985e-01Q),
0219          static_cast<storage_type>(4.33395394129247190799265943165784162e-01Q),
0220          static_cast<storage_type>(6.79409568299024406234327365114873576e-01Q),
0221          static_cast<storage_type>(8.65063366688984510732096688423493049e-01Q),
0222          static_cast<storage_type>(9.73906528517171720077964012084452053e-01Q),
0223       };
0224       return data;
0225    }
0226    static std::array<storage_type, 5> const & weights()
0227    {
0228       static const std::array<storage_type, 5> data = {
0229          static_cast<storage_type>(2.95524224714752870173892994651338329e-01Q),
0230          static_cast<storage_type>(2.69266719309996355091226921569469353e-01Q),
0231          static_cast<storage_type>(2.19086362515982043995534934228163192e-01Q),
0232          static_cast<storage_type>(1.49451349150580593145776339657697332e-01Q),
0233          static_cast<storage_type>(6.66713443086881375935688098933317929e-02Q),
0234       };
0235       return data;
0236    }
0237 };
0238 #endif
0239 template <class T>
0240 class gauss_detail<T, 10, 4>
0241 {
0242 public:
0243    static  std::array<T, 5> const & abscissa()
0244    {
0245       static  std::array<T, 5> data = { // LCOV_EXCL_START
0246          BOOST_MATH_HUGE_CONSTANT(T, 0, 1.4887433898163121088482600112971998461756485942069169570798925351590361735566852137117762979946369123003116080525534e-01),
0247          BOOST_MATH_HUGE_CONSTANT(T, 0, 4.3339539412924719079926594316578416220007183765624649650270151314376698907770350122510275795011772122368293504099894e-01),
0248          BOOST_MATH_HUGE_CONSTANT(T, 0, 6.7940956829902440623432736511487357576929471183480946766481718895255857539507492461507857357048037949983390204739932e-01),
0249          BOOST_MATH_HUGE_CONSTANT(T, 0, 8.6506336668898451073209668842349304852754301496533045252195973184537475513805556135679072894604577069440463108641177e-01),
0250          BOOST_MATH_HUGE_CONSTANT(T, 0, 9.7390652851717172007796401208445205342826994669238211923121206669659520323463615962572356495626855625823304251877421e-01),
0251       }; // LCOV_EXCL_STOP
0252       return data;
0253    }
0254    static  std::array<T, 5> const & weights()
0255    {
0256       static  std::array<T, 5> data = { // LCOV_EXCL_START
0257          BOOST_MATH_HUGE_CONSTANT(T, 0, 2.9552422471475287017389299465133832942104671702685360135430802975599593821715232927035659579375421672271716440125256e-01),
0258          BOOST_MATH_HUGE_CONSTANT(T, 0, 2.6926671930999635509122692156946935285975993846088379580056327624215343231917927676422663670925276075559581145036870e-01),
0259          BOOST_MATH_HUGE_CONSTANT(T, 0, 2.1908636251598204399553493422816319245877187052267708988095654363519991065295128124268399317720219278659121687281289e-01),
0260          BOOST_MATH_HUGE_CONSTANT(T, 0, 1.4945134915058059314577633965769733240255663966942736783547726875323865472663001094594726463473195191400575256104544e-01),
0261          BOOST_MATH_HUGE_CONSTANT(T, 0, 6.6671344308688137593568809893331792857864834320158145128694881613412064084087101776785509685058877821090054714520419e-02),
0262       }; // LCOV_EXCL_STOP
0263       return data;
0264    }
0265 };
0266 
0267 #ifndef BOOST_HAS_FLOAT128
0268 template <class T>
0269 class gauss_detail<T, 15, 0>
0270 {
0271    using storage_type = typename gauss_constant_category<T>::storage_type;
0272 public:
0273    static std::array<storage_type, 8> const & abscissa()
0274    {
0275       static constexpr std::array<storage_type, 8> data = {
0276          static_cast<storage_type>(0.00000000000000000000000000000000000e+00L),
0277          static_cast<storage_type>(2.01194093997434522300628303394596208e-01L),
0278          static_cast<storage_type>(3.94151347077563369897207370981045468e-01L),
0279          static_cast<storage_type>(5.70972172608538847537226737253910641e-01L),
0280          static_cast<storage_type>(7.24417731360170047416186054613938010e-01L),
0281          static_cast<storage_type>(8.48206583410427216200648320774216851e-01L),
0282          static_cast<storage_type>(9.37273392400705904307758947710209471e-01L),
0283          static_cast<storage_type>(9.87992518020485428489565718586612581e-01L),
0284       };
0285       return data;
0286    }
0287    static std::array<storage_type, 8> const & weights()
0288    {
0289       static constexpr std::array<storage_type, 8> data = {
0290          static_cast<storage_type>(2.02578241925561272880620199967519315e-01L),
0291          static_cast<storage_type>(1.98431485327111576456118326443839325e-01L),
0292          static_cast<storage_type>(1.86161000015562211026800561866422825e-01L),
0293          static_cast<storage_type>(1.66269205816993933553200860481208811e-01L),
0294          static_cast<storage_type>(1.39570677926154314447804794511028323e-01L),
0295          static_cast<storage_type>(1.07159220467171935011869546685869303e-01L),
0296          static_cast<storage_type>(7.03660474881081247092674164506673385e-02L),
0297          static_cast<storage_type>(3.07532419961172683546283935772044177e-02L),
0298       };
0299       return data;
0300    }
0301 };
0302 #else
0303 template <class T>
0304 class gauss_detail<T, 15, 0>
0305 {
0306    using storage_type = typename gauss_constant_category<T>::storage_type;
0307 public:
0308    static std::array<storage_type, 8> const & abscissa()
0309    {
0310       static const std::array<storage_type, 8> data = {
0311          static_cast<storage_type>(0.00000000000000000000000000000000000e+00Q),
0312          static_cast<storage_type>(2.01194093997434522300628303394596208e-01Q),
0313          static_cast<storage_type>(3.94151347077563369897207370981045468e-01Q),
0314          static_cast<storage_type>(5.70972172608538847537226737253910641e-01Q),
0315          static_cast<storage_type>(7.24417731360170047416186054613938010e-01Q),
0316          static_cast<storage_type>(8.48206583410427216200648320774216851e-01Q),
0317          static_cast<storage_type>(9.37273392400705904307758947710209471e-01Q),
0318          static_cast<storage_type>(9.87992518020485428489565718586612581e-01Q),
0319       };
0320       return data;
0321    }
0322    static std::array<storage_type, 8> const & weights()
0323    {
0324       static const std::array<storage_type, 8> data = {
0325          static_cast<storage_type>(2.02578241925561272880620199967519315e-01Q),
0326          static_cast<storage_type>(1.98431485327111576456118326443839325e-01Q),
0327          static_cast<storage_type>(1.86161000015562211026800561866422825e-01Q),
0328          static_cast<storage_type>(1.66269205816993933553200860481208811e-01Q),
0329          static_cast<storage_type>(1.39570677926154314447804794511028323e-01Q),
0330          static_cast<storage_type>(1.07159220467171935011869546685869303e-01Q),
0331          static_cast<storage_type>(7.03660474881081247092674164506673385e-02Q),
0332          static_cast<storage_type>(3.07532419961172683546283935772044177e-02Q),
0333       };
0334       return data;
0335    }
0336 };
0337 #endif
0338 template <class T>
0339 class gauss_detail<T, 15, 4>
0340 {
0341 public:
0342    static  std::array<T, 8> const & abscissa()
0343    {
0344       static  std::array<T, 8> data = { // LCOV_EXCL_START
0345          BOOST_MATH_HUGE_CONSTANT(T, 0, 0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00),
0346          BOOST_MATH_HUGE_CONSTANT(T, 0, 2.0119409399743452230062830339459620781283645446263767961594972460994823900302018760183625806752105908967902257386509e-01),
0347          BOOST_MATH_HUGE_CONSTANT(T, 0, 3.9415134707756336989720737098104546836275277615869825503116534395160895778696141797549711416165976202589352169635648e-01),
0348          BOOST_MATH_HUGE_CONSTANT(T, 0, 5.7097217260853884753722673725391064123838639628274960485326541705419537986975857948341462856982614477912646497026257e-01),
0349          BOOST_MATH_HUGE_CONSTANT(T, 0, 7.2441773136017004741618605461393800963089929458410256355142342070412378167792521899610109760313432626923598549381925e-01),
0350          BOOST_MATH_HUGE_CONSTANT(T, 0, 8.4820658341042721620064832077421685136625617473699263409572755876067507517414548519760771975082148085090373835713340e-01),
0351          BOOST_MATH_HUGE_CONSTANT(T, 0, 9.3727339240070590430775894771020947124399627351530445790136307635020297379704552795054758617426808659746824044603157e-01),
0352          BOOST_MATH_HUGE_CONSTANT(T, 0, 9.8799251802048542848956571858661258114697281712376148999999751558738843736901942471272205036831914497667516843990079e-01),
0353       }; // LCOV_EXCL_STOP
0354       return data;
0355    }
0356    static  std::array<T, 8> const & weights()
0357    {
0358       static  std::array<T, 8> data = { // LCOV_EXCL_START
0359          BOOST_MATH_HUGE_CONSTANT(T, 0, 2.0257824192556127288062019996751931483866215800947735679670411605143539875474607409339344071278803213535148267082999e-01),
0360          BOOST_MATH_HUGE_CONSTANT(T, 0, 1.9843148532711157645611832644383932481869255995754199348473792792912479753343426813331499916481782320766020854889310e-01),
0361          BOOST_MATH_HUGE_CONSTANT(T, 0, 1.8616100001556221102680056186642282450622601227792840281549572731001325550269916061894976888609932360539977709001384e-01),
0362          BOOST_MATH_HUGE_CONSTANT(T, 0, 1.6626920581699393355320086048120881113090018009841290732186519056355356321227851771070517429241553621484461540657185e-01),
0363          BOOST_MATH_HUGE_CONSTANT(T, 0, 1.3957067792615431444780479451102832252085027531551124320239112863108844454190781168076825736357133363814908889327664e-01),
0364          BOOST_MATH_HUGE_CONSTANT(T, 0, 1.0715922046717193501186954668586930341554371575810198068702238912187799485231579972568585713760862404439808767837506e-01),
0365          BOOST_MATH_HUGE_CONSTANT(T, 0, 7.0366047488108124709267416450667338466708032754330719825907292914387055512874237044840452066693939219355489858595041e-02),
0366          BOOST_MATH_HUGE_CONSTANT(T, 0, 3.0753241996117268354628393577204417721748144833434074264228285504237189467117168039038770732399404002516991188859473e-02),
0367       }; // LCOV_EXCL_STOP
0368       return data;
0369    }
0370 };
0371 
0372 #ifndef BOOST_HAS_FLOAT128
0373 template <class T>
0374 class gauss_detail<T, 20, 0>
0375 {
0376    using storage_type = typename gauss_constant_category<T>::storage_type;
0377 public:
0378    static std::array<storage_type, 10> const & abscissa()
0379    {
0380       static constexpr std::array<storage_type, 10> data = {
0381          static_cast<storage_type>(7.65265211334973337546404093988382110e-02L),
0382          static_cast<storage_type>(2.27785851141645078080496195368574625e-01L),
0383          static_cast<storage_type>(3.73706088715419560672548177024927237e-01L),
0384          static_cast<storage_type>(5.10867001950827098004364050955250998e-01L),
0385          static_cast<storage_type>(6.36053680726515025452836696226285937e-01L),
0386          static_cast<storage_type>(7.46331906460150792614305070355641590e-01L),
0387          static_cast<storage_type>(8.39116971822218823394529061701520685e-01L),
0388          static_cast<storage_type>(9.12234428251325905867752441203298113e-01L),
0389          static_cast<storage_type>(9.63971927277913791267666131197277222e-01L),
0390          static_cast<storage_type>(9.93128599185094924786122388471320278e-01L),
0391       };
0392       return data;
0393    }
0394    static std::array<storage_type, 10> const & weights()
0395    {
0396       static constexpr std::array<storage_type, 10> data = {
0397          static_cast<storage_type>(1.52753387130725850698084331955097593e-01L),
0398          static_cast<storage_type>(1.49172986472603746787828737001969437e-01L),
0399          static_cast<storage_type>(1.42096109318382051329298325067164933e-01L),
0400          static_cast<storage_type>(1.31688638449176626898494499748163135e-01L),
0401          static_cast<storage_type>(1.18194531961518417312377377711382287e-01L),
0402          static_cast<storage_type>(1.01930119817240435036750135480349876e-01L),
0403          static_cast<storage_type>(8.32767415767047487247581432220462061e-02L),
0404          static_cast<storage_type>(6.26720483341090635695065351870416064e-02L),
0405          static_cast<storage_type>(4.06014298003869413310399522749321099e-02L),
0406          static_cast<storage_type>(1.76140071391521183118619623518528164e-02L),
0407       };
0408       return data;
0409    }
0410 };
0411 #else
0412 template <class T>
0413 class gauss_detail<T, 20, 0>
0414 {
0415    using storage_type = typename gauss_constant_category<T>::storage_type;
0416 public:
0417    static std::array<storage_type, 10> const & abscissa()
0418    {
0419       static const std::array<storage_type, 10> data = {
0420          static_cast<storage_type>(7.65265211334973337546404093988382110e-02Q),
0421          static_cast<storage_type>(2.27785851141645078080496195368574625e-01Q),
0422          static_cast<storage_type>(3.73706088715419560672548177024927237e-01Q),
0423          static_cast<storage_type>(5.10867001950827098004364050955250998e-01Q),
0424          static_cast<storage_type>(6.36053680726515025452836696226285937e-01Q),
0425          static_cast<storage_type>(7.46331906460150792614305070355641590e-01Q),
0426          static_cast<storage_type>(8.39116971822218823394529061701520685e-01Q),
0427          static_cast<storage_type>(9.12234428251325905867752441203298113e-01Q),
0428          static_cast<storage_type>(9.63971927277913791267666131197277222e-01Q),
0429          static_cast<storage_type>(9.93128599185094924786122388471320278e-01Q),
0430       };
0431       return data;
0432    }
0433    static std::array<storage_type, 10> const & weights()
0434    {
0435       static const std::array<storage_type, 10> data = {
0436          static_cast<storage_type>(1.52753387130725850698084331955097593e-01Q),
0437          static_cast<storage_type>(1.49172986472603746787828737001969437e-01Q),
0438          static_cast<storage_type>(1.42096109318382051329298325067164933e-01Q),
0439          static_cast<storage_type>(1.31688638449176626898494499748163135e-01Q),
0440          static_cast<storage_type>(1.18194531961518417312377377711382287e-01Q),
0441          static_cast<storage_type>(1.01930119817240435036750135480349876e-01Q),
0442          static_cast<storage_type>(8.32767415767047487247581432220462061e-02Q),
0443          static_cast<storage_type>(6.26720483341090635695065351870416064e-02Q),
0444          static_cast<storage_type>(4.06014298003869413310399522749321099e-02Q),
0445          static_cast<storage_type>(1.76140071391521183118619623518528164e-02Q),
0446       };
0447       return data;
0448    }
0449 };
0450 #endif
0451 template <class T>
0452 class gauss_detail<T, 20, 4>
0453 {
0454 public:
0455    static  std::array<T, 10> const & abscissa()
0456    {
0457       static  std::array<T, 10> data = { // LCOV_EXCL_START
0458          BOOST_MATH_HUGE_CONSTANT(T, 0, 7.6526521133497333754640409398838211004796266813497500804795244384256342048336978241545114181556215606998505646364133e-02),
0459          BOOST_MATH_HUGE_CONSTANT(T, 0, 2.2778585114164507808049619536857462474308893768292747231463573920717134186355582779495212519096870803177373131560430e-01),
0460          BOOST_MATH_HUGE_CONSTANT(T, 0, 3.7370608871541956067254817702492723739574632170568271182794861351564576437305952789589568363453337894476772208852815e-01),
0461          BOOST_MATH_HUGE_CONSTANT(T, 0, 5.1086700195082709800436405095525099842549132920242683347234861989473497039076572814403168305086777919832943068843526e-01),
0462          BOOST_MATH_HUGE_CONSTANT(T, 0, 6.3605368072651502545283669622628593674338911679936846393944662254654126258543013255870319549576130658211710937772596e-01),
0463          BOOST_MATH_HUGE_CONSTANT(T, 0, 7.4633190646015079261430507035564159031073067956917644413954590606853535503815506468110411362064752061238490065167656e-01),
0464          BOOST_MATH_HUGE_CONSTANT(T, 0, 8.3911697182221882339452906170152068532962936506563737325249272553286109399932480991922934056595764922060422035306914e-01),
0465          BOOST_MATH_HUGE_CONSTANT(T, 0, 9.1223442825132590586775244120329811304918479742369177479588221915807089120871907893644472619292138737876039175464603e-01),
0466          BOOST_MATH_HUGE_CONSTANT(T, 0, 9.6397192727791379126766613119727722191206032780618885606353759389204158078438305698001812525596471563131043491596423e-01),
0467          BOOST_MATH_HUGE_CONSTANT(T, 0, 9.9312859918509492478612238847132027822264713090165589614818413121798471762775378083944940249657220927472894034724419e-01),
0468       }; // LCOV_EXCL_STOP
0469       return data;
0470    }
0471    static  std::array<T, 10> const & weights()
0472    {
0473       static  std::array<T, 10> data = { // LCOV_EXCL_START
0474          BOOST_MATH_HUGE_CONSTANT(T, 0, 1.5275338713072585069808433195509759349194864511237859727470104981759745316273778153557248783650390593544001842813788e-01),
0475          BOOST_MATH_HUGE_CONSTANT(T, 0, 1.4917298647260374678782873700196943669267990408136831649621121780984442259558678069396132603521048105170913854567338e-01),
0476          BOOST_MATH_HUGE_CONSTANT(T, 0, 1.4209610931838205132929832506716493303451541339202030333736708298382808749793436761694922428320058260133068573666201e-01),
0477          BOOST_MATH_HUGE_CONSTANT(T, 0, 1.3168863844917662689849449974816313491611051114698352699643649370885435642948093314355797518397262924510598005463625e-01),
0478          BOOST_MATH_HUGE_CONSTANT(T, 0, 1.1819453196151841731237737771138228700504121954896877544688995202017474835051151630572868782581901744606267543092317e-01),
0479          BOOST_MATH_HUGE_CONSTANT(T, 0, 1.0193011981724043503675013548034987616669165602339255626197161619685232202539434647534931576947985821375859035525483e-01),
0480          BOOST_MATH_HUGE_CONSTANT(T, 0, 8.3276741576704748724758143222046206100177828583163290744882060785693082894079419471375190843790839349096116111932764e-02),
0481          BOOST_MATH_HUGE_CONSTANT(T, 0, 6.2672048334109063569506535187041606351601076578436364099584345437974811033665678644563766056832203512603253399592073e-02),
0482          BOOST_MATH_HUGE_CONSTANT(T, 0, 4.0601429800386941331039952274932109879090639989951536817606854561832296750987328295538920623044384976189825709675075e-02),
0483          BOOST_MATH_HUGE_CONSTANT(T, 0, 1.7614007139152118311861962351852816362143105543336732524349326677348419259621847817403105542146097668703716227512570e-02),
0484       }; // LCOV_EXCL_STOP
0485       return data;
0486    }
0487 };
0488 
0489 #ifndef BOOST_HAS_FLOAT128
0490 template <class T>
0491 class gauss_detail<T, 25, 0>
0492 {
0493    using storage_type = typename gauss_constant_category<T>::storage_type;
0494 public:
0495    static std::array<storage_type, 13> const & abscissa()
0496    {
0497       static constexpr std::array<storage_type, 13> data = {
0498          static_cast<storage_type>(0.00000000000000000000000000000000000e+00L),
0499          static_cast<storage_type>(1.22864692610710396387359818808036806e-01L),
0500          static_cast<storage_type>(2.43866883720988432045190362797451586e-01L),
0501          static_cast<storage_type>(3.61172305809387837735821730127640667e-01L),
0502          static_cast<storage_type>(4.73002731445714960522182115009192041e-01L),
0503          static_cast<storage_type>(5.77662930241222967723689841612654067e-01L),
0504          static_cast<storage_type>(6.73566368473468364485120633247622176e-01L),
0505          static_cast<storage_type>(7.59259263037357630577282865204360976e-01L),
0506          static_cast<storage_type>(8.33442628760834001421021108693569569e-01L),
0507          static_cast<storage_type>(8.94991997878275368851042006782804954e-01L),
0508          static_cast<storage_type>(9.42974571228974339414011169658470532e-01L),
0509          static_cast<storage_type>(9.76663921459517511498315386479594068e-01L),
0510          static_cast<storage_type>(9.95556969790498097908784946893901617e-01L),
0511       };
0512       return data;
0513    }
0514    static std::array<storage_type, 13> const & weights()
0515    {
0516       static constexpr std::array<storage_type, 13> data = {
0517          static_cast<storage_type>(1.23176053726715451203902873079050142e-01L),
0518          static_cast<storage_type>(1.22242442990310041688959518945851506e-01L),
0519          static_cast<storage_type>(1.19455763535784772228178126512901047e-01L),
0520          static_cast<storage_type>(1.14858259145711648339325545869555809e-01L),
0521          static_cast<storage_type>(1.08519624474263653116093957050116619e-01L),
0522          static_cast<storage_type>(1.00535949067050644202206890392685827e-01L),
0523          static_cast<storage_type>(9.10282619829636498114972207028916534e-02L),
0524          static_cast<storage_type>(8.01407003350010180132349596691113023e-02L),
0525          static_cast<storage_type>(6.80383338123569172071871856567079686e-02L),
0526          static_cast<storage_type>(5.49046959758351919259368915404733242e-02L),
0527          static_cast<storage_type>(4.09391567013063126556234877116459537e-02L),
0528          static_cast<storage_type>(2.63549866150321372619018152952991449e-02L),
0529          static_cast<storage_type>(1.13937985010262879479029641132347736e-02L),
0530       };
0531       return data;
0532    }
0533 };
0534 #else
0535 template <class T>
0536 class gauss_detail<T, 25, 0>
0537 {
0538    using storage_type = typename gauss_constant_category<T>::storage_type;
0539 public:
0540    static std::array<storage_type, 13> const & abscissa()
0541    {
0542       static const std::array<storage_type, 13> data = {
0543          static_cast<storage_type>(0.00000000000000000000000000000000000e+00Q),
0544          static_cast<storage_type>(1.22864692610710396387359818808036806e-01Q),
0545          static_cast<storage_type>(2.43866883720988432045190362797451586e-01Q),
0546          static_cast<storage_type>(3.61172305809387837735821730127640667e-01Q),
0547          static_cast<storage_type>(4.73002731445714960522182115009192041e-01Q),
0548          static_cast<storage_type>(5.77662930241222967723689841612654067e-01Q),
0549          static_cast<storage_type>(6.73566368473468364485120633247622176e-01Q),
0550          static_cast<storage_type>(7.59259263037357630577282865204360976e-01Q),
0551          static_cast<storage_type>(8.33442628760834001421021108693569569e-01Q),
0552          static_cast<storage_type>(8.94991997878275368851042006782804954e-01Q),
0553          static_cast<storage_type>(9.42974571228974339414011169658470532e-01Q),
0554          static_cast<storage_type>(9.76663921459517511498315386479594068e-01Q),
0555          static_cast<storage_type>(9.95556969790498097908784946893901617e-01Q),
0556       };
0557       return data;
0558    }
0559    static std::array<storage_type, 13> const & weights()
0560    {
0561       static const std::array<storage_type, 13> data = {
0562          static_cast<storage_type>(1.23176053726715451203902873079050142e-01Q),
0563          static_cast<storage_type>(1.22242442990310041688959518945851506e-01Q),
0564          static_cast<storage_type>(1.19455763535784772228178126512901047e-01Q),
0565          static_cast<storage_type>(1.14858259145711648339325545869555809e-01Q),
0566          static_cast<storage_type>(1.08519624474263653116093957050116619e-01Q),
0567          static_cast<storage_type>(1.00535949067050644202206890392685827e-01Q),
0568          static_cast<storage_type>(9.10282619829636498114972207028916534e-02Q),
0569          static_cast<storage_type>(8.01407003350010180132349596691113023e-02Q),
0570          static_cast<storage_type>(6.80383338123569172071871856567079686e-02Q),
0571          static_cast<storage_type>(5.49046959758351919259368915404733242e-02Q),
0572          static_cast<storage_type>(4.09391567013063126556234877116459537e-02Q),
0573          static_cast<storage_type>(2.63549866150321372619018152952991449e-02Q),
0574          static_cast<storage_type>(1.13937985010262879479029641132347736e-02Q),
0575       };
0576       return data;
0577    }
0578 };
0579 #endif
0580 template <class T>
0581 class gauss_detail<T, 25, 4>
0582 {
0583 public:
0584    static  std::array<T, 13> const & abscissa()
0585    {
0586       static  std::array<T, 13> data = { // LCOV_EXCL_START
0587          BOOST_MATH_HUGE_CONSTANT(T, 0, 0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+00),
0588          BOOST_MATH_HUGE_CONSTANT(T, 0, 1.2286469261071039638735981880803680553220534604978373842389353789270883496885841582643884994633105537597765980412320e-01),
0589          BOOST_MATH_HUGE_CONSTANT(T, 0, 2.4386688372098843204519036279745158640563315632598447642113565325038747278585595067977636776325034060327548499765742e-01),
0590          BOOST_MATH_HUGE_CONSTANT(T, 0, 3.6117230580938783773582173012764066742207834704337506979457877784674538239569654860329531506093761400789294612122812e-01),
0591          BOOST_MATH_HUGE_CONSTANT(T, 0, 4.7300273144571496052218211500919204133181773846162729090723082769560327584128603010315684778279363544192787010704498e-01),
0592          BOOST_MATH_HUGE_CONSTANT(T, 0, 5.7766293024122296772368984161265406739573503929151825664548350776102301275263202227671659646579649084013116066120581e-01),
0593          BOOST_MATH_HUGE_CONSTANT(T, 0, 6.7356636847346836448512063324762217588341672807274931705965696177828773684928421158196368568030932194044282149314388e-01),
0594          BOOST_MATH_HUGE_CONSTANT(T, 0, 7.5925926303735763057728286520436097638752201889833412091838973544501862882026240760763679724185230331463919586229073e-01),
0595          BOOST_MATH_HUGE_CONSTANT(T, 0, 8.3344262876083400142102110869356956946096411382352078602086471546171813247709012525322973947759168107133491065937347e-01),
0596          BOOST_MATH_HUGE_CONSTANT(T, 0, 8.9499199787827536885104200678280495417455484975358390306170168295917151090119945137118600693039178162093726882638296e-01),
0597          BOOST_MATH_HUGE_CONSTANT(T, 0, 9.4297457122897433941401116965847053190520157060899014192745249713729532254404926130890521815127348327109666786665572e-01),
0598          BOOST_MATH_HUGE_CONSTANT(T, 0, 9.7666392145951751149831538647959406774537055531440674467098742731616386753588055389644670948300617866819865983054648e-01),
0599          BOOST_MATH_HUGE_CONSTANT(T, 0, 9.9555696979049809790878494689390161725756264940480817121080493113293348134372793448728802635294700756868258870429256e-01),
0600       }; // LCOV_EXCL_STOP
0601       return data;
0602    }
0603    static  std::array<T, 13> const & weights()
0604    {
0605       static  std::array<T, 13> data = { // LCOV_EXCL_START
0606          BOOST_MATH_HUGE_CONSTANT(T, 0, 1.2317605372671545120390287307905014243823362751815166539135219731691200794926142128460112517504958377310054583945994e-01),
0607          BOOST_MATH_HUGE_CONSTANT(T, 0, 1.2224244299031004168895951894585150583505924756305904090758008223203896721918010243033540891078906637115620156845304e-01),
0608          BOOST_MATH_HUGE_CONSTANT(T, 0, 1.1945576353578477222817812651290104739017670141372642551958788133518409022018773502442869720975271321374348568426235e-01),
0609          BOOST_MATH_HUGE_CONSTANT(T, 0, 1.1485825914571164833932554586955580864093619166818014959151499003148279667112542256534429898558156273250513652351744e-01),
0610          BOOST_MATH_HUGE_CONSTANT(T, 0, 1.0851962447426365311609395705011661934007758798672201615649430734883929279360844269339768350029654172135832773427565e-01),
0611          BOOST_MATH_HUGE_CONSTANT(T, 0, 1.0053594906705064420220689039268582698846609452814190706986904199941294815904602968195565620373258211755226681206658e-01),
0612          BOOST_MATH_HUGE_CONSTANT(T, 0, 9.1028261982963649811497220702891653380992558959334310970483768967017384678410526902484398142953718885872521590850372e-02),
0613          BOOST_MATH_HUGE_CONSTANT(T, 0, 8.0140700335001018013234959669111302290225732853675893716201462973612828934801289559457377714225318048243957479325813e-02),
0614          BOOST_MATH_HUGE_CONSTANT(T, 0, 6.8038333812356917207187185656707968554709494354636562615071226410003654051711473106651522969481873733098761760660898e-02),
0615          BOOST_MATH_HUGE_CONSTANT(T, 0, 5.4904695975835191925936891540473324160109985553111349048508498244593774678436511895711924079433444763756746828817613e-02),
0616          BOOST_MATH_HUGE_CONSTANT(T, 0, 4.0939156701306312655623487711645953660845783364104346504698414899297432880215512770478971055110424130123527015425511e-02),
0617          BOOST_MATH_HUGE_CONSTANT(T, 0, 2.6354986615032137261901815295299144935963281703322468755366165783870934008879499371529821528172928890350362464605104e-02),
0618          BOOST_MATH_HUGE_CONSTANT(T, 0, 1.1393798501026287947902964113234773603320526292909696448948061116189891729766743355923677112945033505688431618009664e-02),
0619       }; // LCOV_EXCL_STOP
0620       return data;
0621    }
0622 };
0623 
0624 
0625 #ifndef BOOST_HAS_FLOAT128
0626 template <class T>
0627 class gauss_detail<T, 30, 0>
0628 {
0629    using storage_type = typename gauss_constant_category<T>::storage_type;
0630 public:
0631    static std::array<storage_type, 15> const & abscissa()
0632    {
0633       static constexpr std::array<storage_type, 15> data = {
0634          static_cast<storage_type>(5.14718425553176958330252131667225737e-02L),
0635          static_cast<storage_type>(1.53869913608583546963794672743255920e-01L),
0636          static_cast<storage_type>(2.54636926167889846439805129817805108e-01L),
0637          static_cast<storage_type>(3.52704725530878113471037207089373861e-01L),
0638          static_cast<storage_type>(4.47033769538089176780609900322854000e-01L),
0639          static_cast<storage_type>(5.36624148142019899264169793311072794e-01L),
0640          static_cast<storage_type>(6.20526182989242861140477556431189299e-01L),
0641          static_cast<storage_type>(6.97850494793315796932292388026640068e-01L),
0642          static_cast<storage_type>(7.67777432104826194917977340974503132e-01L),
0643          static_cast<storage_type>(8.29565762382768397442898119732501916e-01L),
0644          static_cast<storage_type>(8.82560535792052681543116462530225590e-01L),
0645          static_cast<storage_type>(9.26200047429274325879324277080474004e-01L),
0646          static_cast<storage_type>(9.60021864968307512216871025581797663e-01L),
0647          static_cast<storage_type>(9.83668123279747209970032581605662802e-01L),
0648          static_cast<storage_type>(9.96893484074649540271630050918695283e-01L),
0649       };
0650       return data;
0651    }
0652    static std::array<storage_type, 15> const & weights()
0653    {
0654       static constexpr std::array<storage_type, 15> data = {
0655          static_cast<storage_type>(1.02852652893558840341285636705415044e-01L),
0656          static_cast<storage_type>(1.01762389748405504596428952168554045e-01L),
0657          static_cast<storage_type>(9.95934205867952670627802821035694765e-02L),
0658          static_cast<storage_type>(9.63687371746442596394686263518098651e-02L),
0659          static_cast<storage_type>(9.21225222377861287176327070876187672e-02L),
0660          static_cast<storage_type>(8.68997872010829798023875307151257026e-02L),
0661          static_cast<storage_type>(8.07558952294202153546949384605297309e-02L),
0662          static_cast<storage_type>(7.37559747377052062682438500221907342e-02L),
0663          static_cast<storage_type>(6.59742298821804951281285151159623612e-02L),
0664          static_cast<storage_type>(5.74931562176190664817216894020561288e-02L),
0665          static_cast<storage_type>(4.84026728305940529029381404228075178e-02L),
0666          static_cast<storage_type>(3.87991925696270495968019364463476920e-02L),
0667          static_cast<storage_type>(2.87847078833233693497191796112920436e-02L),
0668          static_cast<storage_type>(1.84664683110909591423021319120472691e-02L),
0669          static_cast<storage_type>(7.96819249616660561546588347467362245e-03L),
0670       };
0671       return data;
0672    }
0673 };
0674 #else
0675 template <class T>
0676 class gauss_detail<T, 30, 0>
0677 {
0678    using storage_type = typename gauss_constant_category<T>::storage_type;
0679 public:
0680    static std::array<storage_type, 15> const & abscissa()
0681    {
0682       static const std::array<storage_type, 15> data = {
0683          static_cast<storage_type>(5.14718425553176958330252131667225737e-02Q),
0684          static_cast<storage_type>(1.53869913608583546963794672743255920e-01Q),
0685          static_cast<storage_type>(2.54636926167889846439805129817805108e-01Q),
0686          static_cast<storage_type>(3.52704725530878113471037207089373861e-01Q),
0687          static_cast<storage_type>(4.47033769538089176780609900322854000e-01Q),
0688          static_cast<storage_type>(5.36624148142019899264169793311072794e-01Q),
0689          static_cast<storage_type>(6.20526182989242861140477556431189299e-01Q),
0690          static_cast<storage_type>(6.97850494793315796932292388026640068e-01Q),
0691          static_cast<storage_type>(7.67777432104826194917977340974503132e-01Q),
0692          static_cast<storage_type>(8.29565762382768397442898119732501916e-01Q),
0693          static_cast<storage_type>(8.82560535792052681543116462530225590e-01Q),
0694          static_cast<storage_type>(9.26200047429274325879324277080474004e-01Q),
0695          static_cast<storage_type>(9.60021864968307512216871025581797663e-01Q),
0696          static_cast<storage_type>(9.83668123279747209970032581605662802e-01Q),
0697          static_cast<storage_type>(9.96893484074649540271630050918695283e-01Q),
0698       };
0699       return data;
0700    }
0701    static std::array<storage_type, 15> const & weights()
0702    {
0703       static const std::array<storage_type, 15> data = {
0704          static_cast<storage_type>(1.02852652893558840341285636705415044e-01Q),
0705          static_cast<storage_type>(1.01762389748405504596428952168554045e-01Q),
0706          static_cast<storage_type>(9.95934205867952670627802821035694765e-02Q),
0707          static_cast<storage_type>(9.63687371746442596394686263518098651e-02Q),
0708          static_cast<storage_type>(9.21225222377861287176327070876187672e-02Q),
0709          static_cast<storage_type>(8.68997872010829798023875307151257026e-02Q),
0710          static_cast<storage_type>(8.07558952294202153546949384605297309e-02Q),
0711          static_cast<storage_type>(7.37559747377052062682438500221907342e-02Q),
0712          static_cast<storage_type>(6.59742298821804951281285151159623612e-02Q),
0713          static_cast<storage_type>(5.74931562176190664817216894020561288e-02Q),
0714          static_cast<storage_type>(4.84026728305940529029381404228075178e-02Q),
0715          static_cast<storage_type>(3.87991925696270495968019364463476920e-02Q),
0716          static_cast<storage_type>(2.87847078833233693497191796112920436e-02Q),
0717          static_cast<storage_type>(1.84664683110909591423021319120472691e-02Q),
0718          static_cast<storage_type>(7.96819249616660561546588347467362245e-03Q),
0719       };
0720       return data;
0721    }
0722 };
0723 #endif
0724 template <class T>
0725 class gauss_detail<T, 30, 4>
0726 {
0727 public:
0728    static  std::array<T, 15> const & abscissa()
0729    {
0730       static  std::array<T, 15> data = { // LCOV_EXCL_START
0731          BOOST_MATH_HUGE_CONSTANT(T, 0, 5.1471842555317695833025213166722573749141453666569564255160843987964755210427109055870090707285485841217089963590678e-02),
0732          BOOST_MATH_HUGE_CONSTANT(T, 0, 1.5386991360858354696379467274325592041855197124433846171896298291578714851081610139692310651074078557990111754952062e-01),
0733          BOOST_MATH_HUGE_CONSTANT(T, 0, 2.5463692616788984643980512981780510788278930330251842616428597508896353156907880290636628138423620257595521678255758e-01),
0734          BOOST_MATH_HUGE_CONSTANT(T, 0, 3.5270472553087811347103720708937386065363100802142562659418446890026941623319107866436039675211352945165817827083104e-01),
0735          BOOST_MATH_HUGE_CONSTANT(T, 0, 4.4703376953808917678060990032285400016240759386142440975447738172761535172858420700400688872124189834257262048739699e-01),
0736          BOOST_MATH_HUGE_CONSTANT(T, 0, 5.3662414814201989926416979331107279416417800693029710545274348291201490861897837863114116009718990258091585830703557e-01),
0737          BOOST_MATH_HUGE_CONSTANT(T, 0, 6.2052618298924286114047755643118929920736469282952813259505117012433531497488911774115258445532782106478789996137481e-01),
0738          BOOST_MATH_HUGE_CONSTANT(T, 0, 6.9785049479331579693229238802664006838235380065395465637972284673997672124315996069538163644008904690545069439941341e-01),
0739          BOOST_MATH_HUGE_CONSTANT(T, 0, 7.6777743210482619491797734097450313169488361723290845320649438736515857017299504505260960258623968420224697596501719e-01),
0740          BOOST_MATH_HUGE_CONSTANT(T, 0, 8.2956576238276839744289811973250191643906869617034167880695298345365650658958163508295244350814016004371545455777732e-01),
0741          BOOST_MATH_HUGE_CONSTANT(T, 0, 8.8256053579205268154311646253022559005668914714648423206832605312161626269519165572921583828573210485349058106849548e-01),
0742          BOOST_MATH_HUGE_CONSTANT(T, 0, 9.2620004742927432587932427708047400408647453682532906091103713367942299565110232681677288015055886244486106298320068e-01),
0743          BOOST_MATH_HUGE_CONSTANT(T, 0, 9.6002186496830751221687102558179766293035921740392339948566167242493995770706842922718944370380002378239172677454384e-01),
0744          BOOST_MATH_HUGE_CONSTANT(T, 0, 9.8366812327974720997003258160566280194031785470971136351718001015114429536479104370207597166035471368057762560137209e-01),
0745          BOOST_MATH_HUGE_CONSTANT(T, 0, 9.9689348407464954027163005091869528334088203811775079010809429780238769521016374081588201955806171741257405095963817e-01),
0746       }; // LCOV_EXCL_STOP
0747       return data;
0748    }
0749    static  std::array<T, 15> const & weights()
0750    {
0751       static  std::array<T, 15> data = { // LCOV_EXCL_START
0752          BOOST_MATH_HUGE_CONSTANT(T, 0, 1.0285265289355884034128563670541504386837555706492822258631898667601623865660942939262884632188870916503815852709086e-01),
0753          BOOST_MATH_HUGE_CONSTANT(T, 0, 1.0176238974840550459642895216855404463270628948712684086426094541964251360531767494547599781978391198881693385887696e-01),
0754          BOOST_MATH_HUGE_CONSTANT(T, 0, 9.9593420586795267062780282103569476529869263666704277221365146183946660389908809018092299289324184705373523229592037e-02),
0755          BOOST_MATH_HUGE_CONSTANT(T, 0, 9.6368737174644259639468626351809865096406461430160245912994275732837534742003123724951247818104195363343093583583429e-02),
0756          BOOST_MATH_HUGE_CONSTANT(T, 0, 9.2122522237786128717632707087618767196913234418234107527675047001973047070094168298464052916811907158954949394100501e-02),
0757          BOOST_MATH_HUGE_CONSTANT(T, 0, 8.6899787201082979802387530715125702576753328743545344012222129882153582254261494247955033509639105330215477601953921e-02),
0758          BOOST_MATH_HUGE_CONSTANT(T, 0, 8.0755895229420215354694938460529730875892803708439299890258593706051180567026345604212402769217808080749416147400962e-02),
0759          BOOST_MATH_HUGE_CONSTANT(T, 0, 7.3755974737705206268243850022190734153770526037049438941269182374599399314635211710401352716638183270192254236882630e-02),
0760          BOOST_MATH_HUGE_CONSTANT(T, 0, 6.5974229882180495128128515115962361237442953656660378967031516042143672466094179365819913911598737439478205808271237e-02),
0761          BOOST_MATH_HUGE_CONSTANT(T, 0, 5.7493156217619066481721689402056128797120670721763134548715799003232147409954376925211999650950125355559974348279846e-02),
0762          BOOST_MATH_HUGE_CONSTANT(T, 0, 4.8402672830594052902938140422807517815271809197372736345191936791805425677102152797767439563562263454374645955072007e-02),
0763          BOOST_MATH_HUGE_CONSTANT(T, 0, 3.8799192569627049596801936446347692033200976766395352107732789705946970952769793919055026279035105656340228558382274e-02),
0764          BOOST_MATH_HUGE_CONSTANT(T, 0, 2.8784707883323369349719179611292043639588894546287496474180122608145988940013933101730206711484171554940392262251283e-02),
0765          BOOST_MATH_HUGE_CONSTANT(T, 0, 1.8466468311090959142302131912047269096206533968181403371298365514585599521307973654080519029675417955638095832046164e-02),
0766          BOOST_MATH_HUGE_CONSTANT(T, 0, 7.9681924961666056154658834746736224504806965871517212294851633569200384329013332941536616922861735209846506562158817e-03),
0767       }; // LCOV_EXCL_STOP
0768       return data;
0769    }
0770 };
0771 
0772 }
0773 
0774 template <class Real, unsigned N, class Policy = boost::math::policies::policy<> >
0775 class gauss : public detail::gauss_detail<Real, N, detail::gauss_constant_category<Real>::value>
0776 {
0777    typedef detail::gauss_detail<Real, N, detail::gauss_constant_category<Real>::value> base;
0778 public:
0779 
0780    template <class F>
0781    static auto integrate(F f, Real* pL1 = nullptr)->decltype(std::declval<F>()(std::declval<Real>()))
0782    {
0783      // In many math texts, K represents the field of real or complex numbers.
0784      // Too bad we can't put blackboard bold into C++ source!
0785       typedef decltype(f(Real(0))) K;
0786       static_assert(!std::is_integral<K>::value,
0787                    "The return type cannot be integral, it must be either a real or complex floating point type.");
0788       using std::abs;
0789       unsigned non_zero_start = 1;
0790       K result = Real(0);
0791       if (N & 1) {
0792          result = f(Real(0)) * static_cast<Real>(base::weights()[0]);
0793       }
0794       else {
0795          result = 0;
0796          non_zero_start = 0;
0797       }
0798       Real L1 = abs(result);
0799       for (unsigned i = non_zero_start; i < base::abscissa().size(); ++i)
0800       {
0801          K fp = f(static_cast<Real>(base::abscissa()[i]));
0802          K fm = f(static_cast<Real>(-base::abscissa()[i]));
0803          result += (fp + fm) * static_cast<Real>(base::weights()[i]);
0804          L1 += (abs(fp) + abs(fm)) * static_cast<Real>(base::weights()[i]);
0805       }
0806       if (pL1)
0807          *pL1 = L1;
0808       return result;
0809    }
0810    template <class F>
0811    static auto integrate(F f, Real a, Real b, Real* pL1 = nullptr)->decltype(std::declval<F>()(std::declval<Real>()))
0812    {
0813       typedef decltype(f(a)) K;
0814       static const char* function = "boost::math::quadrature::gauss<%1%>::integrate(f, %1%, %1%)";
0815       if (!(boost::math::isnan)(a) && !(boost::math::isnan)(b))
0816       {
0817          // Infinite limits:
0818          Real min_inf = -tools::max_value<Real>();
0819          if ((a <= min_inf) && (b >= tools::max_value<Real>()))
0820          {
0821             auto u = [&](const Real& t)->K
0822             {
0823                Real t_sq = t*t;
0824                Real inv = 1 / (1 - t_sq);
0825                K res = f(t*inv)*(1 + t_sq)*inv*inv;
0826                return res;
0827             };
0828             return integrate(u, pL1);
0829          }
0830 
0831          // Right limit is infinite:
0832          if ((boost::math::isfinite)(a) && (b >= tools::max_value<Real>()))
0833          {
0834             auto u = [&](const Real& t)->K
0835             {
0836                Real z = 1 / (t + 1);
0837                Real arg = 2 * z + a - 1;
0838                K res = f(arg)*z*z;
0839                return res;
0840             };
0841             K Q = Real(2) * integrate(u, pL1);
0842             if (pL1)
0843             {
0844                *pL1 *= 2;
0845             }
0846             return Q;
0847          }
0848 
0849          if ((boost::math::isfinite)(b) && (a <= -tools::max_value<Real>()))
0850          {
0851             auto v = [&](const Real& t)->K
0852             {
0853                Real z = 1 / (t + 1);
0854                Real arg = 2 * z - 1;
0855                K res = f(b - arg) * z * z;
0856                return res;
0857             };
0858             K Q = Real(2) * integrate(v, pL1);
0859             if (pL1)
0860             {
0861                *pL1 *= 2;
0862             }
0863             return Q;
0864          }
0865 
0866          if ((boost::math::isfinite)(a) && (boost::math::isfinite)(b))
0867          {
0868             if (a == b)
0869             {
0870                return K(0);
0871             }
0872             if (b < a)
0873             {
0874                return -integrate(f, b, a, pL1);
0875             }
0876             Real avg = (a + b)*constants::half<Real>();
0877             Real scale = (b - a)*constants::half<Real>();
0878 
0879             auto u = [&](Real z)->K
0880             {
0881                return f(avg + scale*z);
0882             };
0883             K Q = scale*integrate(u, pL1);
0884 
0885             if (pL1)
0886             {
0887                *pL1 *= scale;
0888             }
0889             return Q;
0890          }
0891       }
0892       return static_cast<K>(policies::raise_domain_error(function, "The domain of integration is not sensible; please check the bounds.", a, Policy()));
0893    }
0894 };
0895 
0896 } // namespace quadrature
0897 } // namespace math
0898 } // namespace boost
0899 
0900 #ifdef _MSC_VER
0901 #pragma warning(pop)
0902 #endif
0903 
0904 #endif // BOOST_MATH_QUADRATURE_GAUSS_HPP