Hyperiso 1.0.3
Modular flavour-physics calculations, Wilson coefficients and statistical inference
Loading...
Searching...
No Matches
exponential_integral.cpp
Go to the documentation of this file.
1#include "special_generic.h"
2
3constexpr double epsilon = 1.e-10;
4
5double Ei1(double x) {
6 double Am1 = 1.0, A0 = 0.0, Bm1 = 0.0, B0 = 1.0;
7 double a = exp(x), b = -x + 1.0;
8 double Ap1 = b * A0 + a * Am1, Bp1 = b * B0 + a * Bm1;
9 int j = 1;
10
11 while (fabs(Ap1 * B0 - A0 * Bp1) > epsilon * fabs(A0 * Bp1)) {
12 if (fabs(Bp1) > 1.0) {
13 double Bp1_inv = 1.0 / Bp1;
14 Am1 = A0 * Bp1_inv;
15 A0 = Ap1 * Bp1_inv;
16 Bm1 = B0 * Bp1_inv;
17 B0 = 1.0;
18 } else {
19 Am1 = A0;
20 A0 = Ap1;
21 Bm1 = B0;
22 B0 = Bp1;
23 }
24 a = -j * j;
25 b += 2.0;
26 Ap1 = b * A0 + a * Am1;
27 Bp1 = b * B0 + a * Bm1;
28 j += 1;
29 }
30
31 return (-Ap1 / Bp1);
32}
33
34
35constexpr double g = 0.5772156649015328606065121;
36
37double Ei2(double x) {
38 double xn = -x;
39 double Sn = -x;
40 double Sm1 = 0.;
41 double hsum = 1.;
42 double y = 1.;
43 double factorial = 1.;
44
45 while (fabs(Sn - Sm1) > epsilon * fabs(Sm1)) {
46 Sm1 = Sn;
47 y += 1.;
48 xn *= (-x);
49 factorial *= y;
50 hsum += 1. / y;
51 Sn += hsum * xn / factorial;
52 }
53
54 return (g + log(fabs(x)) - exp(x) * Sn);
55}
56
57double Ei3(double x) {
58 constexpr double ei[] = {
59 1.915047433355013959531e2, 4.403798995348382689974e2,
60 1.037878290717089587658e3, 2.492228976241877759138e3,
61 6.071406374098611507965e3, 1.495953266639752885229e4,
62 3.719768849068903560439e4, 9.319251363396537129882e4,
63 2.349558524907683035782e5, 5.955609986708370018502e5,
64 1.516637894042516884433e6, 3.877904330597443502996e6,
65 9.950907251046844760026e6, 2.561565266405658882048e7,
66 6.612718635548492136250e7, 1.711446713003636684975e8,
67 4.439663698302712208698e8, 1.154115391849182948287e9,
68 3.005950906525548689841e9, 7.842940991898186370453e9,
69 2.049649711988081236484e10, 5.364511859231469415605e10,
70 1.405991957584069047340e11, 3.689732094072741970640e11,
71 9.694555759683939661662e11, 2.550043566357786926147e12,
72 6.714640184076497558707e12, 1.769803724411626854310e13,
73 4.669055014466159544500e13, 1.232852079912097685431e14,
74 3.257988998672263996790e14, 8.616388199965786544948e14,
75 2.280446200301902595341e15, 6.039718263611241578359e15,
76 1.600664914324504111070e16, 4.244796092136850759368e16,
77 1.126348290166966760275e17, 2.990444718632336675058e17,
78 7.943916035704453771510e17, 2.111342388647824195000e18,
79 5.614329680810343111535e18, 1.493630213112993142255e19,
80 3.975442747903744836007e19, 1.058563689713169096306e20
81 };
82
83 int k = static_cast<int>(x + 0.5);
84 double xx = static_cast<double>(k);
85 double dx = x - xx;
86 double edx = exp(dx);
87 double Sm = 1.;
88 double Sn = (edx - 1.) / xx;
89 double term = exp(100.);
90 double factorial = 1.;
91 double dxj = 1.;
92 int j = 0;
93
94 while (term > epsilon * fabs(Sn)) {
95 j++;
96 factorial *= static_cast<double>(j);
97 dxj *= (-dx);
98 Sm += (dxj / factorial);
99 term = (factorial * (edx * Sm - 1.)) / xx;
100 Sn += term;
101 }
102
103 return ei[k - 7] + Sn * exp(xx);
104}
105
106double Ei(double x) {
107 if (x < -5.) return Ei1(x);
108 if (x < 6.8) return Ei2(x);
109 if (x < 50.) return Ei3(x);
110 return Ei1(x);
111}
112
double Ei(double x)
Computes the exponential integral function Ei(x).
double Ei1(double x)
double Ei3(double x)
double Ei2(double x)
constexpr double epsilon
constexpr double g