77 const double PI = 3.1415926535897932;
79 0.9999999999999999502e+0,
80 -2.6883926818565423430e+0,
81 2.6477222699473109692e+0,
82 -1.1538559607887416355e+0,
83 2.0886077795020607837e-1,
84 -1.0859777134152463084e-2
87 1.0000000000000000000e+0,
88 -2.9383926818565635485e+0,
89 3.2712093293018635389e+0,
90 -1.7076702173954289421e+0,
91 4.1596017228400603836e-1,
92 -3.9801343754084482956e-2,
93 8.2743668974466659035e-4
96 double y = 0, r = 0, s = 1;
100 const double l = std::log(1 - x);
102 r = -PI*PI/6 + l*(0.5*l - std::log(-x));
104 }
else if (x == -1) {
107 const double l = std::log1p(-x);
113 }
else if (x < 0.5) {
119 r = PI*PI/6 - std::log(x)*std::log1p(-x);
124 const double l = std::log(x);
126 r = PI*PI/6 - l*(std::log(y) + 0.5*l);
129 const double l = std::log(x);
131 r = PI*PI/3 - 0.5*l*l;
135 const double y2 = y*y;
136 const double y4 = y2*y2;
137 const double p = P[0] + y * P[1] + y2 * (P[2] + y * P[3]) +
138 y4 * (P[4] + y * P[5]);
139 const double q = Q[0] + y * Q[1] + y2 * (Q[2] + y * Q[3]) +
140 y4 * (Q[4] + y * Q[5] + y2 * Q[6]);
154std::complex<double>
dilog(
const std::complex<double>& z)
noexcept
156 const double PI = 3.1415926535897932;
160 const double bf[10] = {
167 - 4.0647616451442255e-11,
168 + 8.9216910204564526e-13,
169 - 1.9939295860721076e-14,
170 + 4.5189800296199182e-16
173 const double rz = std::real(z);
174 const double iz = std::imag(z);
179 return {
dilog(rz), iz };
182 return {
dilog(rz), -PI*std::log(rz) };
185 const double nz = std::norm(z);
187 if (nz < std::numeric_limits<double>::epsilon()) {
188 return z*(1.0 + 0.25*z);
191 std::complex<double> u(0.0, 0.0), rest(0.0, 0.0);
197 const auto lz = std::log(-z);
199 rest = -0.5*lz*lz - PI*PI/6;
209 rest = u*log1p(-z) + PI*PI/6;
212 const auto lz = std::log(-z);
214 rest = -0.5*lz*lz - PI*PI/6;
221 return sgn*(u + u2*(bf[0] + u*horner<1>(u2, bf))) + rest;
234 const double PI = 3.14159265358979324;
235 const double PI2 = 2*PI, PIH = PI/2, PI28 = PI*PI/8;
244 x = std::fmod(x, PI2);
248 const double p0 = 6.28125;
249 const double p1 = 0.0019353071795864769253;
256 }
else if (x == PI) {
264 1.3888888888888889e-02, -4.3286930203743071e-04,
265 3.2779814789973427e-06, -3.6001540369575084e-09
268 1.0000000000000000e+00, -3.6166589746694121e-02,
269 3.6015827281202639e-04, -8.3646182842184428e-07
271 const double y = x*x;
272 const double y2 = y*y;
273 const double p = P[0] + y * P[1] + y2 * (P[2] + y * P[3]);
274 const double q = Q[0] + y * Q[1] + y2 * (Q[2] + y * Q[3]);
276 h = x*(1 - std::log(x) + y*p/q);
279 6.4005702446195512e-01, -2.0641655351338783e-01,
280 2.4175305223497718e-02, -1.2355955287855728e-03,
281 2.5649833551291124e-05, -1.4783829128773320e-07
284 1.0000000000000000e+00, -2.5299102015666356e-01,
285 2.2148751048467057e-02, -7.8183920462457496e-04,
286 9.5432542196310670e-06, -1.8184302880448247e-08
288 const double y = PI - x;
289 const double z = y*y - PI28;
290 const double z2 = z*z;
291 const double z4 = z2*z2;
292 const double p = P[0] + z * P[1] + z2 * (P[2] + z * P[3]) +
293 z4 * (P[4] + z * P[5]);
294 const double q = Q[0] + z * Q[1] + z2 * (Q[2] + z * Q[3]) +
295 z4 * (Q[4] + z * Q[5]);