File indexing completed on 2025-10-30 08:21:51
0001 
0002 
0003 
0004 
0005 
0006 
0007 
0008 #ifndef BOOST_MATH_CALCULATE_CONSTANTS_CONSTANTS_INCLUDED
0009 #define BOOST_MATH_CALCULATE_CONSTANTS_CONSTANTS_INCLUDED
0010 #include <type_traits>
0011 
0012 namespace boost{ namespace math{ namespace constants{ namespace detail{
0013 
0014 template <class T>
0015 template<int N>
0016 inline T constant_pi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0017 {
0018    BOOST_MATH_STD_USING
0019 
0020    return ldexp(acos(T(0)), 1);
0021 
0022    
0023 
0024 
0025 
0026 
0027 
0028 
0029 
0030 
0031 
0032 
0033 
0034 
0035 
0036 
0037 
0038 
0039 
0040 
0041 
0042 
0043 
0044 
0045 
0046 
0047 
0048 
0049 
0050 
0051 
0052 
0053 
0054 
0055 
0056 
0057 
0058 
0059 
0060 
0061 
0062 
0063 
0064 
0065 
0066 
0067 }
0068 
0069 template <class T>
0070 template<int N>
0071 inline T constant_two_pi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0072 {
0073    return 2 * pi<T, policies::policy<policies::digits2<N> > >();
0074 }
0075 
0076 template <class T> 
0077 template<int N>
0078 inline T constant_two_div_pi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0079 {
0080    return 2 / pi<T, policies::policy<policies::digits2<N> > >();
0081 }
0082 
0083 template <class T>  
0084 template <int N>
0085 inline T constant_root_two_div_pi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0086 {
0087    BOOST_MATH_STD_USING
0088    return sqrt((2 / pi<T, policies::policy<policies::digits2<N> > >()));
0089 }
0090 
0091 template <class T>
0092 template<int N>
0093 inline T constant_one_div_two_pi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0094 {
0095    return 1 / two_pi<T, policies::policy<policies::digits2<N> > >();
0096 }
0097 
0098 template <class T>
0099 template<int N>
0100 inline T constant_root_pi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0101 {
0102    BOOST_MATH_STD_USING
0103    return sqrt(pi<T, policies::policy<policies::digits2<N> > >());
0104 }
0105 
0106 template <class T>
0107 template<int N>
0108 inline T constant_root_half_pi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0109 {
0110    BOOST_MATH_STD_USING
0111    return sqrt(pi<T, policies::policy<policies::digits2<N> > >() / 2);
0112 }
0113 
0114 template <class T>
0115 template<int N>
0116 inline T constant_root_two_pi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0117 {
0118    BOOST_MATH_STD_USING
0119    return sqrt(two_pi<T, policies::policy<policies::digits2<N> > >());
0120 }
0121 
0122 template <class T>
0123 template<int N>
0124 inline T constant_log_root_two_pi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0125 {
0126    BOOST_MATH_STD_USING
0127    return log(root_two_pi<T, policies::policy<policies::digits2<N> > >());
0128 }
0129 
0130 template <class T>
0131 template<int N>
0132 inline T constant_root_ln_four<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0133 {
0134    BOOST_MATH_STD_USING
0135    return sqrt(log(static_cast<T>(4)));
0136 }
0137 
0138 template <class T>
0139 template<int N>
0140 inline T constant_e<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0141 {
0142    
0143    
0144    
0145    
0146    
0147    BOOST_MATH_STD_USING
0148    return exp(static_cast<T>(1));
0149 }
0150 
0151 template <class T>
0152 template<int N>
0153 inline T constant_half<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0154 {
0155    return static_cast<T>(1) / static_cast<T>(2);
0156 }
0157 
0158 template <class T>
0159 template<int M>
0160 inline T constant_euler<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, M>)))
0161 {
0162    BOOST_MATH_STD_USING
0163    
0164    
0165    
0166    
0167    
0168    
0169    
0170    T n = 3 + (M ? (std::min)(M, tools::digits<T>()) : tools::digits<T>()) / 4;
0171    T lim = M ? ldexp(T(1), 1 - (std::min)(M, tools::digits<T>())) : tools::epsilon<T>();
0172    T lnn = log(n);
0173    T term = 1;
0174    T N = -lnn;
0175    T D = 1;
0176    T Hk = 0;
0177    T one = 1;
0178 
0179    for(unsigned k = 1;; ++k)
0180    {
0181       term *= n * n;
0182       term /= k * k;
0183       Hk += one / k;
0184       N += term * (Hk - lnn);
0185       D += term;
0186 
0187       if(term < D * lim)
0188          break;
0189    }
0190    return N / D;
0191 }
0192 
0193 template <class T>
0194 template<int N>
0195 inline T constant_euler_sqr<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0196 {
0197   BOOST_MATH_STD_USING
0198   return euler<T, policies::policy<policies::digits2<N> > >()
0199      * euler<T, policies::policy<policies::digits2<N> > >();
0200 }
0201 
0202 template <class T>
0203 template<int N>
0204 inline T constant_one_div_euler<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0205 {
0206   BOOST_MATH_STD_USING
0207   return static_cast<T>(1)
0208      / euler<T, policies::policy<policies::digits2<N> > >();
0209 }
0210 
0211 
0212 template <class T>
0213 template<int N>
0214 inline T constant_root_two<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0215 {
0216    BOOST_MATH_STD_USING
0217    return sqrt(static_cast<T>(2));
0218 }
0219 
0220 
0221 template <class T>
0222 template<int N>
0223 inline T constant_root_three<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0224 {
0225    BOOST_MATH_STD_USING
0226    return sqrt(static_cast<T>(3));
0227 }
0228 
0229 template <class T>
0230 template<int N>
0231 inline T constant_half_root_two<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0232 {
0233    BOOST_MATH_STD_USING
0234    return sqrt(static_cast<T>(2)) / 2;
0235 }
0236 
0237 template <class T>
0238 template<int N>
0239 inline T constant_ln_two<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0240 {
0241    
0242    
0243    
0244    
0245    
0246    BOOST_MATH_STD_USING
0247    return log(static_cast<T>(2));
0248 }
0249 
0250 template <class T>
0251 template<int N>
0252 inline T constant_ln_ten<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0253 {
0254    BOOST_MATH_STD_USING
0255    return log(static_cast<T>(10));
0256 }
0257 
0258 template <class T>
0259 template<int N>
0260 inline T constant_ln_ln_two<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0261 {
0262    BOOST_MATH_STD_USING
0263    return log(log(static_cast<T>(2)));
0264 }
0265 
0266 template <class T>
0267 template<int N>
0268 inline T constant_third<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0269 {
0270    BOOST_MATH_STD_USING
0271    return static_cast<T>(1) / static_cast<T>(3);
0272 }
0273 
0274 template <class T>
0275 template<int N>
0276 inline T constant_twothirds<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0277 {
0278    BOOST_MATH_STD_USING
0279    return static_cast<T>(2) / static_cast<T>(3);
0280 }
0281 
0282 template <class T>
0283 template<int N>
0284 inline T constant_two_thirds<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0285 {
0286    BOOST_MATH_STD_USING
0287    return static_cast<T>(2) / static_cast<T>(3);
0288 }
0289 
0290 template <class T>
0291 template<int N>
0292 inline T constant_three_quarters<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0293 {
0294    BOOST_MATH_STD_USING
0295    return static_cast<T>(3) / static_cast<T>(4);
0296 }
0297 
0298 template <class T>
0299 template<int N>
0300 inline T constant_sixth<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0301 {
0302   BOOST_MATH_STD_USING
0303   return static_cast<T>(1) / static_cast<T>(6);
0304 }
0305 
0306 
0307 template <class T>
0308 template<int N>
0309 inline T constant_pi_minus_three<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0310 {
0311    return pi<T, policies::policy<policies::digits2<N> > >() - static_cast<T>(3);
0312 }
0313 
0314 template <class T>
0315 template<int N>
0316 inline T constant_four_minus_pi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0317 {
0318    return static_cast<T>(4) - pi<T, policies::policy<policies::digits2<N> > >();
0319 }
0320 
0321 template <class T>
0322 template<int N>
0323 inline T constant_exp_minus_half<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0324 {
0325    BOOST_MATH_STD_USING
0326    return exp(static_cast<T>(-0.5));
0327 }
0328 
0329 template <class T>
0330 template<int N>
0331 inline T constant_exp_minus_one<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0332 {
0333   BOOST_MATH_STD_USING
0334   return exp(static_cast<T>(-1.));
0335 }
0336 
0337 template <class T>
0338 template<int N>
0339 inline T constant_one_div_root_two<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0340 {
0341    return static_cast<T>(1) / root_two<T, policies::policy<policies::digits2<N> > >();
0342 }
0343 
0344 template <class T>
0345 template<int N>
0346 inline T constant_one_div_root_pi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0347 {
0348    return static_cast<T>(1) / root_pi<T, policies::policy<policies::digits2<N> > >();
0349 }
0350 
0351 template <class T>
0352 template<int N>
0353 inline T constant_one_div_root_two_pi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0354 {
0355    return static_cast<T>(1) / root_two_pi<T, policies::policy<policies::digits2<N> > >();
0356 }
0357 
0358 template <class T>
0359 template<int N>
0360 inline T constant_root_one_div_pi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0361 {
0362    BOOST_MATH_STD_USING
0363    return sqrt(static_cast<T>(1) / pi<T, policies::policy<policies::digits2<N> > >());
0364 }
0365 
0366 template <class T>
0367 template<int N>
0368 inline T constant_four_thirds_pi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0369 {
0370    BOOST_MATH_STD_USING
0371    return pi<T, policies::policy<policies::digits2<N> > >() * static_cast<T>(4) / static_cast<T>(3);
0372 }
0373 
0374 template <class T>
0375 template<int N>
0376 inline T constant_half_pi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0377 {
0378    BOOST_MATH_STD_USING
0379    return pi<T, policies::policy<policies::digits2<N> > >()  / static_cast<T>(2);
0380 }
0381 
0382 template <class T>
0383 template<int N>
0384 inline T constant_third_pi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0385 {
0386    BOOST_MATH_STD_USING
0387    return pi<T, policies::policy<policies::digits2<N> > >()  / static_cast<T>(3);
0388 }
0389 
0390 template <class T>
0391 template<int N>
0392 inline T constant_sixth_pi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0393 {
0394    BOOST_MATH_STD_USING
0395    return pi<T, policies::policy<policies::digits2<N> > >()  / static_cast<T>(6);
0396 }
0397 
0398 template <class T>
0399 template<int N>
0400 inline T constant_two_thirds_pi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0401 {
0402    BOOST_MATH_STD_USING
0403    return pi<T, policies::policy<policies::digits2<N> > >() * static_cast<T>(2) / static_cast<T>(3);
0404 }
0405 
0406 template <class T>
0407 template<int N>
0408 inline T constant_three_quarters_pi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0409 {
0410    BOOST_MATH_STD_USING
0411    return pi<T, policies::policy<policies::digits2<N> > >() * static_cast<T>(3) / static_cast<T>(4);
0412 }
0413 
0414 template <class T>
0415 template<int N>
0416 inline T constant_pi_pow_e<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0417 {
0418    BOOST_MATH_STD_USING
0419    return pow(pi<T, policies::policy<policies::digits2<N> > >(), e<T, policies::policy<policies::digits2<N> > >()); 
0420 }
0421 
0422 template <class T>
0423 template<int N>
0424 inline T constant_pi_sqr<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0425 {
0426    BOOST_MATH_STD_USING
0427    return pi<T, policies::policy<policies::digits2<N> > >()
0428    *      pi<T, policies::policy<policies::digits2<N> > >() ; 
0429 }
0430 
0431 template <class T>
0432 template<int N>
0433 inline T constant_pi_sqr_div_six<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0434 {
0435    BOOST_MATH_STD_USING
0436    return pi<T, policies::policy<policies::digits2<N> > >()
0437    *      pi<T, policies::policy<policies::digits2<N> > >()
0438    / static_cast<T>(6); 
0439 }
0440 
0441 template <class T>
0442 template<int N>
0443 inline T constant_pi_cubed<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0444 {
0445    BOOST_MATH_STD_USING
0446    return pi<T, policies::policy<policies::digits2<N> > >()
0447    *      pi<T, policies::policy<policies::digits2<N> > >()
0448    *      pi<T, policies::policy<policies::digits2<N> > >()
0449    ; 
0450 }
0451 
0452 template <class T>
0453 template<int N>
0454 inline T constant_cbrt_pi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0455 {
0456    BOOST_MATH_STD_USING
0457    return pow(pi<T, policies::policy<policies::digits2<N> > >(), static_cast<T>(1)/ static_cast<T>(3));
0458 }
0459 
0460 template <class T>
0461 template<int N>
0462 inline T constant_one_div_cbrt_pi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0463 {
0464    BOOST_MATH_STD_USING
0465    return static_cast<T>(1)
0466    / pow(pi<T, policies::policy<policies::digits2<N> > >(), static_cast<T>(1)/ static_cast<T>(3));
0467 }
0468 
0469 
0470 
0471 template <class T>
0472 template<int N>
0473 inline T constant_e_pow_pi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0474 {
0475    BOOST_MATH_STD_USING
0476    return pow(e<T, policies::policy<policies::digits2<N> > >(), pi<T, policies::policy<policies::digits2<N> > >()); 
0477 }
0478 
0479 template <class T>
0480 template<int N>
0481 inline T constant_root_e<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0482 {
0483    BOOST_MATH_STD_USING
0484    return sqrt(e<T, policies::policy<policies::digits2<N> > >());
0485 }
0486 
0487 template <class T>
0488 template<int N>
0489 inline T constant_log10_e<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0490 {
0491    BOOST_MATH_STD_USING
0492    return log10(e<T, policies::policy<policies::digits2<N> > >());
0493 }
0494 
0495 template <class T>
0496 template<int N>
0497 inline T constant_one_div_log10_e<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0498 {
0499    BOOST_MATH_STD_USING
0500    return  static_cast<T>(1) /
0501      log10(e<T, policies::policy<policies::digits2<N> > >());
0502 }
0503 
0504 
0505 
0506 template <class T>
0507 template<int N>
0508 inline T constant_degree<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0509 {
0510    BOOST_MATH_STD_USING
0511    return pi<T, policies::policy<policies::digits2<N> > >()
0512    / static_cast<T>(180)
0513    ; 
0514 }
0515 
0516 template <class T>
0517 template<int N>
0518 inline T constant_radian<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0519 {
0520    BOOST_MATH_STD_USING
0521    return static_cast<T>(180)
0522    / pi<T, policies::policy<policies::digits2<N> > >()
0523    ; 
0524 }
0525 
0526 template <class T>
0527 template<int N>
0528 inline T constant_sin_one<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0529 {
0530    BOOST_MATH_STD_USING
0531    return sin(static_cast<T>(1)) ; 
0532 }
0533 
0534 template <class T>
0535 template<int N>
0536 inline T constant_cos_one<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0537 {
0538    BOOST_MATH_STD_USING
0539    return cos(static_cast<T>(1)) ; 
0540 }
0541 
0542 template <class T>
0543 template<int N>
0544 inline T constant_sinh_one<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0545 {
0546    BOOST_MATH_STD_USING
0547    return sinh(static_cast<T>(1)) ; 
0548 }
0549 
0550 template <class T>
0551 template<int N>
0552 inline T constant_cosh_one<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0553 {
0554    BOOST_MATH_STD_USING
0555    return cosh(static_cast<T>(1)) ; 
0556 }
0557 
0558 template <class T>
0559 template<int N>
0560 inline T constant_phi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0561 {
0562    BOOST_MATH_STD_USING
0563    return (static_cast<T>(1) + sqrt(static_cast<T>(5)) )/static_cast<T>(2) ; 
0564 }
0565 
0566 template <class T>
0567 template<int N>
0568 inline T constant_ln_phi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0569 {
0570    BOOST_MATH_STD_USING
0571    return log((static_cast<T>(1) + sqrt(static_cast<T>(5)) )/static_cast<T>(2) );
0572 }
0573 
0574 template <class T>
0575 template<int N>
0576 inline T constant_one_div_ln_phi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0577 {
0578    BOOST_MATH_STD_USING
0579    return static_cast<T>(1) /
0580      log((static_cast<T>(1) + sqrt(static_cast<T>(5)) )/static_cast<T>(2) );
0581 }
0582 
0583 
0584 
0585 template <class T>
0586 template<int N>
0587 inline T constant_zeta_two<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0588 {
0589    BOOST_MATH_STD_USING
0590 
0591      return pi<T, policies::policy<policies::digits2<N> > >()
0592      *  pi<T, policies::policy<policies::digits2<N> > >()
0593      /static_cast<T>(6);
0594 }
0595 
0596 template <class T>
0597 template<int N>
0598 inline T constant_zeta_three<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0599 {
0600    
0601    
0602 
0603    
0604    
0605    
0606    
0607 
0608   
0609   
0610   
0611   
0612   
0613 
0614   
0615   
0616    BOOST_MATH_STD_USING
0617    T n_fact=static_cast<T>(1); 
0618    T sum = static_cast<double>(77); 
0619    
0620    
0621    T lim = N ? ldexp(T(1), 1 - (std::min)(N, tools::digits<T>())) : tools::epsilon<T>();
0622    for(unsigned int n = 1; n < 40; ++n)
0623    { 
0624       
0625       n_fact *= n; 
0626       T n_fact_p10 = n_fact * n_fact * n_fact * n_fact * n_fact * n_fact * n_fact * n_fact * n_fact * n_fact; 
0627       T num = ((205 * n * n) + (250 * n) + 77) * n_fact_p10; 
0628       
0629       
0630       T d = 1;
0631       for(unsigned int i = 1; i <= (n+n + 1); ++i) 
0632       {
0633         d *= i;
0634       }
0635       T den = d * d * d * d * d; 
0636       
0637       T term = num/den;
0638       if (n % 2 != 0)
0639       { 
0640         sum -= term;
0641       }
0642       else
0643       {
0644         sum += term;
0645       }
0646       
0647       
0648       if(abs(term) < lim)
0649       {
0650          break;
0651       }
0652    }
0653    return sum / 64;
0654 }
0655 
0656 template <class T>
0657 template<int N>
0658 inline T constant_catalan<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0659 { 
0660   
0661  
0662 
0663   
0664 
0665    
0666    
0667    
0668    BOOST_MATH_STD_USING
0669    T k_fact = 1;
0670    T tk_fact = 1;
0671    T sum = 1;
0672    T term;
0673    T lim = N ? ldexp(T(1), 1 - (std::min)(N, tools::digits<T>())) : tools::epsilon<T>();
0674 
0675    for(unsigned k = 1;; ++k)
0676    {
0677       k_fact *= k;
0678       tk_fact *= (2 * k) * (2 * k - 1);
0679       term = k_fact * k_fact / (tk_fact * (2 * k + 1) * (2 * k + 1));
0680       sum += term;
0681       if(term < lim)
0682       {
0683          break;
0684       }
0685    }
0686    return boost::math::constants::pi<T, boost::math::policies::policy<> >()
0687       * log(2 + boost::math::constants::root_three<T, boost::math::policies::policy<> >())
0688        / 8
0689       + 3 * sum / 8;
0690 }
0691 
0692 namespace khinchin_detail{
0693 
0694 template <class T>
0695 T zeta_polynomial_series(T s, T sc, int digits)
0696 {
0697    BOOST_MATH_STD_USING
0698    
0699    
0700    
0701    
0702    
0703    
0704    
0705    BOOST_MATH_STD_USING
0706    int n = (digits * 19) / 53;
0707    T sum = 0;
0708    T two_n = ldexp(T(1), n);
0709    int ej_sign = 1;
0710    for(int j = 0; j < n; ++j)
0711    {
0712       sum += ej_sign * -two_n / pow(T(j + 1), s);
0713       ej_sign = -ej_sign;
0714    }
0715    T ej_sum = 1;
0716    T ej_term = 1;
0717    for(int j = n; j <= 2 * n - 1; ++j)
0718    {
0719       sum += ej_sign * (ej_sum - two_n) / pow(T(j + 1), s);
0720       ej_sign = -ej_sign;
0721       ej_term *= 2 * n - j;
0722       ej_term /= j - n + 1;
0723       ej_sum += ej_term;
0724    }
0725    return -sum / (two_n * (1 - pow(T(2), sc)));
0726 }
0727 
0728 template <class T>
0729 T khinchin(int digits)
0730 {
0731    BOOST_MATH_STD_USING
0732    T sum = 0;
0733    T term;
0734    T lim = ldexp(T(1), 1-digits);
0735    T factor = 0;
0736    unsigned last_k = 1;
0737    T num = 1;
0738    for(unsigned n = 1;; ++n)
0739    {
0740       for(unsigned k = last_k; k <= 2 * n - 1; ++k)
0741       {
0742          factor += num / k;
0743          num = -num;
0744       }
0745       last_k = 2 * n;
0746       term = (zeta_polynomial_series(T(2 * n), T(1 - T(2 * n)), digits) - 1) * factor / n;
0747       sum += term;
0748       if(term < lim)
0749          break;
0750    }
0751    return exp(sum / boost::math::constants::ln_two<T, boost::math::policies::policy<> >());
0752 }
0753 
0754 }
0755 
0756 template <class T>
0757 template<int N>
0758 inline T constant_khinchin<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0759 {
0760    int n = N ? (std::min)(N, tools::digits<T>()) : tools::digits<T>();
0761    return khinchin_detail::khinchin<T>(n);
0762 }
0763 
0764 template <class T>
0765 template<int N>
0766 inline T constant_extreme_value_skewness<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0767 {  
0768    BOOST_MATH_STD_USING
0769    T ev(12 * sqrt(static_cast<T>(6)) * zeta_three<T, policies::policy<policies::digits2<N> > >()
0770     / pi_cubed<T, policies::policy<policies::digits2<N> > >() );
0771 
0772 
0773 
0774 
0775 
0776 
0777 
0778 
0779 
0780 
0781 
0782 
0783 
0784 
0785   return ev;
0786 }
0787 
0788 namespace detail{
0789 
0790 
0791 
0792 
0793 
0794 
0795 
0796 
0797 
0798 
0799 
0800 
0801 
0802 
0803 
0804 template <class T>
0805 T zeta_series_derivative_2(unsigned digits)
0806 {
0807    
0808    BOOST_MATH_STD_USING
0809    int n = digits * 301 * 13 / 10000;
0810    T d = pow(3 + sqrt(T(8)), n);
0811    d = (d + 1 / d) / 2;
0812    T b = -1;
0813    T c = -d;
0814    T s = 0;
0815    for(int k = 0; k < n; ++k)
0816    {
0817       T a = -log(T(k+1)) / ((k+1) * (k+1));
0818       c = b - c;
0819       s = s + c * a;
0820       b = (k + n) * (k - n) * b / ((k + T(0.5f)) * (k + 1));
0821    }
0822    return s / d;
0823 }
0824 
0825 template <class T>
0826 T zeta_series_2(unsigned digits)
0827 {
0828    
0829    BOOST_MATH_STD_USING
0830    int n = digits * 301 * 13 / 10000;
0831    T d = pow(3 + sqrt(T(8)), n);
0832    d = (d + 1 / d) / 2;
0833    T b = -1;
0834    T c = -d;
0835    T s = 0;
0836    for(int k = 0; k < n; ++k)
0837    {
0838       T a = T(1) / ((k + 1) * (k + 1));
0839       c = b - c;
0840       s = s + c * a;
0841       b = (k + n) * (k - n) * b / ((k + T(0.5f)) * (k + 1));
0842    }
0843    return s / d;
0844 }
0845 
0846 template <class T>
0847 inline T zeta_series_lead_2()
0848 {
0849    
0850    return 2;
0851 }
0852 
0853 template <class T>
0854 inline T zeta_series_derivative_lead_2()
0855 {
0856    
0857    return -2 * boost::math::constants::ln_two<T>();
0858 }
0859 
0860 template <class T>
0861 inline T zeta_derivative_2(unsigned n)
0862 {
0863    
0864    return zeta_series_derivative_2<T>(n) * zeta_series_lead_2<T>()
0865       + zeta_series_derivative_lead_2<T>() * zeta_series_2<T>(n);
0866 }
0867 
0868 }  
0869 
0870 template <class T>
0871 template<int N>
0872 inline T constant_glaisher<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0873 {
0874 
0875    BOOST_MATH_STD_USING
0876    typedef policies::policy<policies::digits2<N> > forwarding_policy;
0877    int n = N ? (std::min)(N, tools::digits<T>()) : tools::digits<T>();
0878    T v = detail::zeta_derivative_2<T>(n);
0879    v *= 6;
0880    v /= boost::math::constants::pi<T, forwarding_policy>() * boost::math::constants::pi<T, forwarding_policy>();
0881    v -= boost::math::constants::euler<T, forwarding_policy>();
0882    v -= log(2 * boost::math::constants::pi<T, forwarding_policy>());
0883    v /= -12;
0884    return exp(v);
0885 
0886    
0887 
0888 
0889 
0890 
0891 
0892 
0893 
0894 
0895 
0896 
0897 
0898 
0899 
0900 
0901 
0902 
0903 
0904 
0905 
0906 
0907 
0908 }
0909 
0910 template <class T>
0911 template<int N>
0912 inline T constant_rayleigh_skewness<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0913 {  
0914    
0915 
0916    BOOST_MATH_STD_USING
0917    T rs(2 * root_pi<T, policies::policy<policies::digits2<N> > >()
0918       * pi_minus_three<T, policies::policy<policies::digits2<N> > >()
0919       / pow(four_minus_pi<T, policies::policy<policies::digits2<N> > >(), static_cast<T>(3./2))
0920       );
0921    
0922 
0923    
0924    
0925    
0926    
0927    
0928    
0929    
0930    
0931    
0932    
0933    
0934    return rs;
0935 }
0936 
0937 template <class T>
0938 template<int N>
0939 inline T constant_rayleigh_kurtosis_excess<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0940 { 
0941     
0942    BOOST_MATH_STD_USING
0943    return - (((static_cast<T>(6) * pi<T, policies::policy<policies::digits2<N> > >()
0944         * pi<T, policies::policy<policies::digits2<N> > >())
0945    - (static_cast<T>(24) * pi<T, policies::policy<policies::digits2<N> > >()) + static_cast<T>(16) )
0946    /
0947    ((pi<T, policies::policy<policies::digits2<N> > >() - static_cast<T>(4))
0948    * (pi<T, policies::policy<policies::digits2<N> > >() - static_cast<T>(4)))
0949    );
0950 }
0951 
0952 template <class T>
0953 template<int N>
0954 inline T constant_rayleigh_kurtosis<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0955 { 
0956   
0957    BOOST_MATH_STD_USING
0958    return static_cast<T>(3) - (((static_cast<T>(6) * pi<T, policies::policy<policies::digits2<N> > >()
0959         * pi<T, policies::policy<policies::digits2<N> > >())
0960    - (static_cast<T>(24) * pi<T, policies::policy<policies::digits2<N> > >()) + static_cast<T>(16) )
0961    /
0962    ((pi<T, policies::policy<policies::digits2<N> > >() - static_cast<T>(4))
0963    * (pi<T, policies::policy<policies::digits2<N> > >() - static_cast<T>(4)))
0964    );
0965 }
0966 
0967 template <class T>
0968 template<int N>
0969 inline T constant_log2_e<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0970 {
0971    return 1 / boost::math::constants::ln_two<T>();
0972 }
0973 
0974 template <class T>
0975 template<int N>
0976 inline T constant_quarter_pi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0977 {
0978    return boost::math::constants::pi<T>() / 4;
0979 }
0980 
0981 template <class T>
0982 template<int N>
0983 inline T constant_one_div_pi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0984 {
0985    return 1 / boost::math::constants::pi<T>();
0986 }
0987 
0988 template <class T>
0989 template<int N>
0990 inline T constant_two_div_root_pi<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0991 {
0992    return 2 * boost::math::constants::one_div_root_pi<T>();
0993 }
0994 
0995 #if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1900)
0996 template <class T>
0997 template<int N>
0998 inline T constant_first_feigenbaum<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
0999 {
1000    
1001    
1002    
1003    
1004 
1005    static_assert(N < 3.321*1018, "\nThe first Feigenbaum constant cannot be computed at runtime; it is too expensive. It is known to 1018 decimal digits; you must request less than that.");
1006    T alpha{"4.6692016091029906718532038204662016172581855774757686327456513430041343302113147371386897440239480138171659848551898151344086271420279325223124429888908908599449354632367134115324817142199474556443658237932020095610583305754586176522220703854106467494942849814533917262005687556659523398756038256372256480040951071283890611844702775854285419801113440175002428585382498335715522052236087250291678860362674527213399057131606875345083433934446103706309452019115876972432273589838903794946257251289097948986768334611626889116563123474460575179539122045562472807095202198199094558581946136877445617396074115614074243754435499204869180982648652368438702799649017397793425134723808737136211601860128186102056381818354097598477964173900328936171432159878240789776614391395764037760537119096932066998361984288981837003229412030210655743295550388845849737034727532121925706958414074661841981961006129640161487712944415901405467941800198133253378592493365883070459999938375411726563553016862529032210862320550634510679399023341675"};
1007    return alpha;
1008 }
1009 
1010 template <class T>
1011 template<int N>
1012 inline T constant_plastic<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
1013 {
1014    using std::sqrt;
1015    return (cbrt(9-sqrt(T(69))) + cbrt(9+sqrt(T(69))))/cbrt(T(18));
1016 }
1017 
1018 
1019 template <class T>
1020 template<int N>
1021 inline T constant_gauss<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
1022 {
1023    using std::sqrt;
1024    T a = sqrt(T(2));
1025    T g = 1;
1026    const T scale = sqrt(std::numeric_limits<T>::epsilon())/512;
1027    while (a-g > scale*g)
1028    {
1029       T anp1 = (a + g)/2;
1030       g = sqrt(a*g);
1031       a = anp1;
1032    }
1033 
1034    return 2/(a + g);
1035 }
1036 
1037 template <class T>
1038 template<int N>
1039 inline T constant_dottie<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
1040 {
1041   
1042   using std::cos;
1043   using std::abs;
1044   using std::sin;
1045   T x{".739085133215160641655312087673873404013411758900757464965680635773284654883547594599376106931766531849801246"};
1046   T residual = cos(x) - x;
1047   do {
1048     x += residual/(sin(x)+1);
1049     residual = cos(x) - x;
1050   } while(abs(residual) > std::numeric_limits<T>::epsilon());
1051   return x;
1052 }
1053 
1054 
1055 template <class T>
1056 template<int N>
1057 inline T constant_reciprocal_fibonacci<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
1058 {
1059   
1060   
1061   
1062   T x0 = 1;
1063   T x1 = 1;
1064   T sum = 2;
1065   T diff = 1;
1066   while (diff > std::numeric_limits<T>::epsilon()) {
1067     T tmp = x1 + x0;
1068     diff = 1/tmp;
1069     sum += diff;
1070     x0 = x1;
1071     x1 = tmp;
1072   }
1073   return sum;
1074 }
1075 
1076 template <class T>
1077 template<int N>
1078 inline T constant_laplace_limit<T>::compute(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC((std::integral_constant<int, N>)))
1079 {
1080   
1081   
1082   
1083   
1084   using std::abs;
1085   using std::exp;
1086   using std::sqrt;
1087   T x{"0.66274341934918158097474209710925290705623354911502241752039253499097185308651127724965480259895818168"};
1088   T tmp = sqrt(1+x*x);
1089   T etmp = exp(tmp);
1090   T residual = x*exp(tmp) - 1 - tmp;
1091   T df = etmp -x/tmp + etmp*x*x/tmp;
1092   do {
1093     x -= residual/df;
1094     tmp = sqrt(1+x*x);
1095     etmp = exp(tmp);
1096     residual = x*exp(tmp) - 1 - tmp;
1097     df = etmp -x/tmp + etmp*x*x/tmp;    
1098   } while(abs(residual) > 2*std::numeric_limits<T>::epsilon());
1099   return x;
1100 }
1101 
1102 #endif
1103 
1104 }
1105 }
1106 }
1107 } 
1108 
1109 #endif