30 const double p1 = 1.0, p2 = 3.5156229, p3 = 3.0899424,
31 p4 = 1.2067492, p5 = 0.2659732, p6 = 3.60768e-2, p7 = 4.5813e-3;
33 const double q1 = 0.39894228, q2 = 1.328592e-2, q3 = 2.25319e-3,
34 q4 = -1.57565e-3, q5 = 9.16281e-3, q6 = -2.057706e-2,
35 q7 = 2.635537e-2, q8 = -1.647633e-2, q9 = 3.92377e-3;
37 const double k1 = 3.75;
40 double y = 0, result = 0;
45 result = p1 + y * (p2 + y * (p3 + y * (p4 + y * (p5 + y * (p6 + y * p7)))));
49 result = (exp(ax) / sqrt(ax))*(q1 + y * (q2 + y * (q3 + y * (q4 + y * (q5 + y * (q6 + y * (q7 + y * (q8 + y * q9))))))));
65 const double p1 = -0.57721566, p2 = 0.42278420, p3 = 0.23069756,
66 p4 = 3.488590e-2, p5 = 2.62698e-3, p6 = 1.0750e-4, p7 = 7.4e-6;
68 const double q1 = 1.25331414, q2 = -7.832358e-2, q3 = 2.189568e-2,
69 q4 = -1.062446e-2, q5 = 5.87872e-3, q6 = -2.51540e-3, q7 = 5.3208e-4;
73 os <<
"Invalid input argument " << x <<
". Argument must be positive.";
74 throw std::invalid_argument(os.str());
77 double y = 0, result = 0;
81 result = (-log(x / 2.)*
xMath::BesselI0(x)) + (p1 + y * (p2 + y * (p3 + y * (p4 + y * (p5 + y * (p6 + y * p7))))));
85 result = (exp(-x) / sqrt(x))*(q1 + y * (q2 + y * (q3 + y * (q4 + y * (q5 + y * (q6 + y * q7))))));
101 const double p1 = 0.5, p2 = 0.87890594, p3 = 0.51498869,
102 p4 = 0.15084934, p5 = 2.658733e-2, p6 = 3.01532e-3, p7 = 3.2411e-4;
104 const double q1 = 0.39894228, q2 = -3.988024e-2, q3 = -3.62018e-3,
105 q4 = 1.63801e-3, q5 = -1.031555e-2, q6 = 2.282967e-2,
106 q7 = -2.895312e-2, q8 = 1.787654e-2, q9 = -4.20059e-3;
108 const double k1 = 3.75;
111 double y = 0, result = 0;
116 result = x * (p1 + y * (p2 + y * (p3 + y * (p4 + y * (p5 + y * (p6 + y * p7))))));
120 result = (exp(ax) / sqrt(ax))*(q1 + y * (q2 + y * (q3 + y * (q4 + y * (q5 + y * (q6 + y * (q7 + y * (q8 + y * q9))))))));
121 if (x < 0) result = -result;
137 const double p1 = 1., p2 = 0.15443144, p3 = -0.67278579,
138 p4 = -0.18156897, p5 = -1.919402e-2, p6 = -1.10404e-3, p7 = -4.686e-5;
140 const double q1 = 1.25331414, q2 = 0.23498619, q3 = -3.655620e-2,
141 q4 = 1.504268e-2, q5 = -7.80353e-3, q6 = 3.25614e-3, q7 = -6.8245e-4;
143 std::stringstream os;
144 os <<
"Invalid argument x = " << x <<
". Argument must be positive.";
145 throw std::invalid_argument(os.str());
148 double y = 0, result = 0;
152 result = (log(x / 2.)*
xMath::BesselI1(x)) + (1. / x)*(p1 + y * (p2 + y * (p3 + y * (p4 + y * (p5 + y * (p6 + y * p7))))));
156 result = (exp(-x) / sqrt(x))*(q1 + y * (q2 + y * (q3 + y * (q4 + y * (q5 + y * (q6 + y * q7))))));
169 if (x <= 0 || n < 0) {
170 std::stringstream os;
171 os <<
"Invalid input argument(s) (n,x) = (" << n <<
", " << x <<
"). Argument x must be positive.";
172 throw std::invalid_argument(os.str());
183 for (
int j = 1; j < n; j++) {
184 bkp = bkm + double(j)*tox*bk;
201 const double kBigPositive = 1.e10;
202 const double kBigNegative = 1.e-10;
207 if (x == 0)
return 0;
208 if (fabs(x) > kBigPositive)
return 0;
210 double tox = 2 / fabs(x);
211 double bip = 0, bim = 0;
214 int m = 2 * ((n + int(sqrt(
float(iacc*n)))));
215 for (
int j = m; j >= 1; j--) {
216 bim = bip + double(j)*tox*bi;
220 if (fabs(bi) > kBigPositive) {
221 result *= kBigNegative;
225 if (j == n) result = bip;
229 if ((x < 0) && (n % 2 == 1)) result = -result;
240 double xx, y, result, result1, result2;
241 const double p1 = 57568490574.0, p2 = -13362590354.0, p3 = 651619640.7;
242 const double p4 = -11214424.18, p5 = 77392.33017, p6 = -184.9052456;
243 const double p7 = 57568490411.0, p8 = 1029532985.0, p9 = 9494680.718;
244 const double p10 = 59272.64853, p11 = 267.8532712;
246 const double q1 = 0.785398164;
247 const double q2 = -0.1098628627e-2, q3 = 0.2734510407e-4;
248 const double q4 = -0.2073370639e-5, q5 = 0.2093887211e-6;
249 const double q6 = -0.1562499995e-1, q7 = 0.1430488765e-3;
250 const double q8 = -0.6911147651e-5, q9 = 0.7621095161e-6;
251 const double q10 = 0.934935152e-7, q11 = 0.636619772;
253 if ((ax = fabs(x)) < 8) {
255 result1 = p1 + y * (p2 + y * (p3 + y * (p4 + y * (p5 + y * p6))));
256 result2 = p7 + y * (p8 + y * (p9 + y * (p10 + y * (p11 + y))));
257 result = result1 / result2;
263 result1 = 1 + y * (q2 + y * (q3 + y * (q4 + y * q5)));
264 result2 = q6 + y * (q7 + y * (q8 + y * (q9 - y * q10)));
265 result = sqrt(q11 / ax)*(cos(xx)*result1 - z * sin(xx)*result2);
276 double xx, y, result, result1, result2;
277 const double p1 = 72362614232.0, p2 = -7895059235.0, p3 = 242396853.1;
278 const double p4 = -2972611.439, p5 = 15704.48260, p6 = -30.16036606;
279 const double p7 = 144725228442.0, p8 = 2300535178.0, p9 = 18583304.74;
280 const double p10 = 99447.43394, p11 = 376.9991397;
282 const double q1 = 2.356194491;
283 const double q2 = 0.183105e-2, q3 = -0.3516396496e-4;
284 const double q4 = 0.2457520174e-5, q5 = -0.240337019e-6;
285 const double q6 = 0.04687499995, q7 = -0.2002690873e-3;
286 const double q8 = 0.8449199096e-5, q9 = -0.88228987e-6;
287 const double q10 = 0.105787412e-6, q11 = 0.636619772;
289 if ((ax = fabs(x)) < 8) {
291 result1 = x * (p1 + y * (p2 + y * (p3 + y * (p4 + y * (p5 + y * p6)))));
292 result2 = p7 + y * (p8 + y * (p9 + y * (p10 + y * (p11 + y))));
293 result = result1 / result2;
299 result1 = 1 + y * (q2 + y * (q3 + y * (q4 + y * q5)));
300 result2 = q6 + y * (q7 + y * (q8 + y * (q9 + y * q10)));
301 result = sqrt(q11 / ax)*(cos(xx)*result1 - z * sin(xx)*result2);
302 if (x < 0) result = -result;
312 double z, xx, y, result, result1, result2;
313 const double p1 = -2957821389., p2 = 7062834065.0, p3 = -512359803.6;
314 const double p4 = 10879881.29, p5 = -86327.92757, p6 = 228.4622733;
315 const double p7 = 40076544269., p8 = 745249964.8, p9 = 7189466.438;
316 const double p10 = 47447.26470, p11 = 226.1030244, p12 = 0.636619772;
318 const double q1 = 0.785398164;
319 const double q2 = -0.1098628627e-2, q3 = 0.2734510407e-4;
320 const double q4 = -0.2073370639e-5, q5 = 0.2093887211e-6;
321 const double q6 = -0.1562499995e-1, q7 = 0.1430488765e-3;
322 const double q8 = -0.6911147651e-5, q9 = 0.7621095161e-6;
323 const double q10 = -0.934945152e-7, q11 = 0.636619772;
327 result1 = p1 + y * (p2 + y * (p3 + y * (p4 + y * (p5 + y * p6))));
328 result2 = p7 + y * (p8 + y * (p9 + y * (p10 + y * (p11 + y))));
335 result1 = 1 + y * (q2 + y * (q3 + y * (q4 + y * q5)));
336 result2 = q6 + y * (q7 + y * (q8 + y * (q9 + y * q10)));
337 result = sqrt(q11 / x)*(sin(xx)*result1 + z * cos(xx)*result2);
347 double z, xx, y, result, result1, result2;
348 const double p1 = -0.4900604943e13, p2 = 0.1275274390e13;
349 const double p3 = -0.5153438139e11, p4 = 0.7349264551e9;
350 const double p5 = -0.4237922726e7, p6 = 0.8511937935e4;
351 const double p7 = 0.2499580570e14, p8 = 0.4244419664e12;
352 const double p9 = 0.3733650367e10, p10 = 0.2245904002e8;
353 const double p11 = 0.1020426050e6, p12 = 0.3549632885e3;
354 const double p13 = 0.636619772;
355 const double q1 = 2.356194491;
356 const double q2 = 0.183105e-2, q3 = -0.3516396496e-4;
357 const double q4 = 0.2457520174e-5, q5 = -0.240337019e-6;
358 const double q6 = 0.04687499995, q7 = -0.2002690873e-3;
359 const double q8 = 0.8449199096e-5, q9 = -0.88228987e-6;
360 const double q10 = 0.105787412e-6, q11 = 0.636619772;
364 result1 = x * (p1 + y * (p2 + y * (p3 + y * (p4 + y * (p5 + y * p6)))));
365 result2 = p7 + y * (p8 + y * (p9 + y * (p10 + y * (p11 + y * (p12 + y)))));
366 result = (result1 / result2) + p13 * (
xMath::BesselJ1(x)*log(x) - 1 / x);
372 result1 = 1 + y * (q2 + y * (q3 + y * (q4 + y * q5)));
373 result2 = q6 + y * (q7 + y * (q8 + y * (q9 + y * q10)));
374 result = sqrt(q11 / x)*(sin(xx)*result1 + z * cos(xx)*result2);
388 const double c1[16] = { 1.00215845609911981, -1.63969292681309147,
389 1.50236939618292819, -.72485115302121872,
390 .18955327371093136, -.03067052022988,
391 .00337561447375194, -2.6965014312602e-4,
392 1.637461692612e-5, -7.8244408508e-7,
393 3.021593188e-8, -9.6326645e-10,
394 2.579337e-11, -5.8854e-13,
396 const double c2[26] = { .99283727576423943, -.00696891281138625,
397 1.8205103787037e-4, -1.063258252844e-5,
398 9.8198294287e-7, -1.2250645445e-7,
399 1.894083312e-8, -3.44358226e-9,
400 7.1119102e-10, -1.6288744e-10,
401 4.065681e-11, -1.091505e-11,
402 3.12005e-12, -9.4202e-13,
403 2.9848e-13, -9.872e-14,
404 3.394e-14, -1.208e-14,
413 double alfa, h, r, y, b0, b1, b2;
424 for (i = n1; i >= 0; --i) {
425 b0 = c1[i] + alfa * b1 - b2;
429 h = y * (b0 - h * b2);
438 for (i = n2; i >= 0; --i) {
439 b0 = c2[i] + alfa * b1 - b2;
458 const double c3[17] = { .5578891446481605, -.11188325726569816,
459 -.16337958125200939, .32256932072405902,
460 -.14581632367244242, .03292677399374035,
461 -.00460372142093573, 4.434706163314e-4,
462 -3.142099529341e-5, 1.7123719938e-6,
463 -7.416987005e-8, 2.61837671e-9,
464 -7.685839e-11, 1.9067e-12,
467 const double c4[23] = { 1.00757647293865641, .00750316051248257,
468 -7.043933264519e-5, 2.66205393382e-6,
469 -1.8841157753e-7, 1.949014958e-8,
470 -2.6126199e-9, 4.236269e-10,
471 -7.955156e-11, 1.679973e-11,
472 -3.9072e-12, 9.8543e-13,
473 -2.6636e-13, 7.645e-14,
474 -2.313e-14, 7.33e-15,
477 -4e-17, 2e-17,-1e-17 };
483 double alfa, h, r, y, b0, b1, b2;
493 i1 = (int)(-8. / log10(v));
494 for (i = 1; i <= i1; ++i) {
495 h = -h * y / ((2 * i + 1)*(2 * i + 3));
506 for (i = n3; i >= 0; --i) {
507 b0 = c3[i] + alfa * b1 - b2;
519 for (i = n4; i >= 0; --i) {
520 b0 = c4[i] + alfa * b1 - b2;
541 double a0, sl0, a1, bi0;
547 for (i = 1; i <= 60; i++) {
548 r *= (x / (2 * i + 1))*(x / (2 * i + 1));
550 if (fabs(r / s) < 1.e-12)
break;
555 km = int(5 * (x + 1.0));
556 if (x >= 50.0)km = 25;
557 for (i = 1; i <= km; i++) {
558 r *= (2 * i - 1)*(2 * i - 1) / x / x;
560 if (fabs(r / s) < 1.0e-12)
break;
562 a1 = exp(x) / sqrt(2 * pi*x);
565 for (i = 1; i <= 16; i++) {
566 r = 0.125*r*(2.0*i - 1.0)*(2.0*i - 1.0) / (i*x);
568 if (fabs(r / bi0) < 1.0e-12)
break;
572 sl0 = -2.0 / (pi*x)*s + bi0;
584 double a1, sl1, bi1, s;
590 for (i = 1; i <= 60; i++) {
591 r *= x * x / (4.0*i*i - 1.0);
593 if (fabs(r) < fabs(s)*1.e-12)
break;
600 if (x > 50.0)km = 25;
601 for (i = 1; i <= km; i++) {
602 r *= (2 * i + 3)*(2 * i + 1) / x / x;
604 if (fabs(r / s) < 1.0e-12)
break;
606 sl1 = 2.0 / pi * (-1.0 + 1.0 / (x*x) + 3.0*s / (x*x*x*x));
607 a1 = exp(x) / sqrt(2 * pi*x);
610 for (i = 1; i <= 16; i++) {
611 r = -0.125*r*(4.0 - (2.0*i - 1.0)*(2.0*i - 1.0)) / (i*x);
613 if (fabs(r / bi1) < 1.0e-12)
break;
633 const double p1 = -0.57721566, p2 = 0.42278420, p3 = 0.23069756,
634 p4 = 3.488590e-2, p5 = 2.62698e-3, p6 = 1.0750e-4, p7 = 7.4e-6;
636 const double q1 = 1.25331414, q2 = -7.832358e-2, q3 = 2.189568e-2,
637 q4 = -1.062446e-2, q5 = 5.87872e-3, q6 = -2.51540e-3, q7 = 5.3208e-4;
640 std::stringstream os;
641 os <<
"Invalid input argument " << x <<
". Argument must be positive.";
642 throw std::invalid_argument(os.str());
644 double y = 0, result = 0;
647 result = exp(x)*((-log(x / 2.)*
xMath::BesselI0(x)) + (p1 + y * (p2 + y * (p3 + y * (p4 + y * (p5 + y * (p6 + y * p7)))))));
651 result = (1. / sqrt(x))*(q1 + y * (q2 + y * (q3 + y * (q4 + y * (q5 + y * (q6 + y * q7))))));
667 const double p1 = 1., p2 = 0.15443144, p3 = -0.67278579,
668 p4 = -0.18156897, p5 = -1.919402e-2, p6 = -1.10404e-3, p7 = -4.686e-5;
670 const double q1 = 1.25331414, q2 = 0.23498619, q3 = -3.655620e-2,
671 q4 = 1.504268e-2, q5 = -7.80353e-3, q6 = 3.25614e-3, q7 = -6.8245e-4;
674 std::stringstream os;
675 os <<
"Invalid input argument " << x <<
". Argument must be positive.";
676 throw std::invalid_argument(os.str());
680 double y = 0, result = 0;
683 result = exp(x) * ((log(x / 2.)*
xMath::BesselI1(x)) + (1. / x)*(p1 + y * (p2 + y * (p3 + y * (p4 + y * (p5 + y * (p6 + y * p7)))))));
687 result = (1. / sqrt(x))*(q1 + y * (q2 + y * (q3 + y * (q4 + y * (q5 + y * (q6 + y * q7))))));
700 if (x <= 0 || n < 0) {
701 std::stringstream os;
702 os <<
"Invalid input argument(s) (n,x) = (" << n <<
", " << x <<
"). Argument x must be positive.";
703 throw std::invalid_argument(os.str());
714 for (
int j = 1; j < n; j++) {
715 bkp = bkm + double(j)*tox*bk;
730 const double p1 = 1.0, p2 = 3.5156229, p3 = 3.0899424,
731 p4 = 1.2067492, p5 = 0.2659732, p6 = 3.60768e-2, p7 = 4.5813e-3;
733 const double q1 = 0.39894228, q2 = 1.328592e-2, q3 = 2.25319e-3,
734 q4 = -1.57565e-3, q5 = 9.16281e-3, q6 = -2.057706e-2,
735 q7 = 2.635537e-2, q8 = -1.647633e-2, q9 = 3.92377e-3;
737 const double k1 = 3.75;
740 double y = 0, result = 0;
745 result = exp(-ax) * ( p1 + y * (p2 + y * (p3 + y * (p4 + y * (p5 + y * (p6 + y * p7))))) );
749 result = (1. / sqrt(ax))*(q1 + y * (q2 + y * (q3 + y * (q4 + y * (q5 + y * (q6 + y * (q7 + y * (q8 + y * q9))))))));
765 const double p1 = 0.5, p2 = 0.87890594, p3 = 0.51498869,
766 p4 = 0.15084934, p5 = 2.658733e-2, p6 = 3.01532e-3, p7 = 3.2411e-4;
768 const double q1 = 0.39894228, q2 = -3.988024e-2, q3 = -3.62018e-3,
769 q4 = 1.63801e-3, q5 = -1.031555e-2, q6 = 2.282967e-2,
770 q7 = -2.895312e-2, q8 = 1.787654e-2, q9 = -4.20059e-3;
772 const double k1 = 3.75;
775 double y = 0, result = 0;
780 result = exp(-ax) * (x * (p1 + y * (p2 + y * (p3 + y * (p4 + y * (p5 + y * (p6 + y * p7)))))));
784 result = (1. / sqrt(ax))*(q1 + y * (q2 + y * (q3 + y * (q4 + y * (q5 + y * (q6 + y * (q7 + y * (q8 + y * q9))))))));
785 if (x < 0) result = -result;
800 const double kBigPositive = 1.e10;
801 const double kBigNegative = 1.e-10;
806 if (x == 0)
return 0;
807 if (fabs(x) > kBigPositive)
return 0;
809 double tox = 2 / fabs(x);
810 double bip = 0, bim = 0;
813 int m = 2 * ((n + int(sqrt(
float(iacc*n)))));
814 for (
int j = m; j >= 1; j--) {
815 bim = bip + double(j)*tox*bi;
819 if (fabs(bi) > kBigPositive) {
820 result *= kBigNegative;
824 if (j == n) result = bip;
828 if ((x < 0) && (n % 2 == 1)) result = -result;
841 std::stringstream os;
842 os <<
"Invalid input argument " << x <<
". Argument must be positive.";
843 throw std::invalid_argument(os.str());
856 const double gamma = 0.577215664901532860606512090;
859 return 1.0 / (x*(1.0 + gamma * x));
871 bool arg_was_less_than_one = (y < 1.0);
875 if (arg_was_less_than_one)
881 n =
static_cast<int> (floor(y)) - 1;
886 static const double p[] =
888 -1.71618513886549492533811E+0,
889 2.47656508055759199108314E+1,
890 -3.79804256470945635097577E+2,
891 6.29331155312818442661052E+2,
892 8.66966202790413211295064E+2,
893 -3.14512729688483675254357E+4,
894 -3.61444134186911729807069E+4,
895 6.64561438202405440627855E+4
899 static const double q[] =
901 -3.08402300119738975254353E+1,
902 3.15350626979604161529144E+2,
903 -1.01515636749021914166146E+3,
904 -3.10777167157231109440444E+3,
905 2.25381184209801510330112E+4,
906 4.75584627752788110767815E+3,
907 -1.34659959864969306392456E+5,
908 -1.15132259675553483497211E+5
916 for (i = 0; i < 8; i++)
918 num = (num + p[i])*z;
919 den = den * z + q[i];
921 double result = num / den + 1.0;
924 if (arg_was_less_than_one)
934 for (i = 0; i < n; i++)
947 double temp = DBL_MAX;
961 std::stringstream os;
962 os <<
"Invalid input argument " << x <<
". Argument must be positive.";
963 throw std::invalid_argument(os.str());
968 return log(fabs(
Gamma(x)));
976 static const double c[8] =
987 double z = 1.0 / (x*x);
989 for (
int i = 6; i >= 0; i--)
994 double series = sum / x;
996 static const double halfLogTwoPi = 0.91893853320467274178032973640562;
997 double logGamma = (x - 0.5)*log(x) - x + halfLogTwoPi + series;
double BesselK0exp(double x)
Modified Bessel function K_0(x), divided by exponential factor.
double BesselK(int n, double x)
Integer order modified Bessel function K_n(x)
double BesselI1exp(double x)
Modified Bessel function I_1(x), divided by exponential factor.
double BesselI0(double x)
Modified Bessel function I_0(x)
double BesselY0(double x)
Bessel function Y0(x) for positive x.
constexpr double Pi()
Pi constant.
double BesselI0exp(double x)
Modified Bessel function I_0(x), divided by exponential factor.
double BesselY1(double x)
Bessel function Y1(x) for positive x.
double StruveL0(double x)
Modified Struve function of order 0.
double BesselJ0(double x)
Bessel function J0(x) for any real x.
double BesselKexp(int n, double x)
Modified Bessel function K_n(x), divided by exponential factor.
double StruveL1(double x)
Modified Struve function of order 1.
double Gamma(double x)
Computes the Gamma function.
double BesselJ1(double x)
Bessel function J1(x) for any real x.
double BesselK1exp(double x)
Modified Bessel function K_1(x), divided by exponential factor.
double BesselIexp(int n, double x)
Modified Bessel function I_n(x), divided by exponential factor.
double BesselK1(double x)
Modified Bessel function K_1(x)
double LogGamma(double x)
Computes the logarithm of the Gamma function.
double StruveH0(double x)
Struve function of order 0.
double BesselI(int n, double x)
Integer order modified Bessel function I_n(x)
double BesselI1(double x)
Modified Bessel function I_1(x)
double BesselK0(double x)
Modified Bessel function K_0(x)
double StruveH1(double x)
Struve function of order 1.
The main namespace where all classes and functions of the Thermal-FIST library reside.
Contains some extra mathematical functions used in the code.