File indexing completed on 2025-01-18 09:39:34
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