32 const double a = std::abs(x);
35 const double z = a * a;
36 constexpr double coefficients[] = {
37 -7.98389023185534e-11, 8.6684720203723614e-10,
38 -4.7997095383377807e-9, 1.8850617466346369e-8,
39 -6.1974137503985441e-8, 1.8914247025489175e-7,
40 -5.6812797392185565e-7, 1.7247571922095787e-6,
41 -5.3522004257752879e-6, 1.7105344959469917e-5,
42 -5.6815608632124677e-5, 0.00019881353180096906,
43 -0.00074955908287299841, 0.0031746031746026004,
44 -0.016666666666666659, 0.16666666666666666
47 for (
double c : coefficients) p = p * z + c;
50 const double z = std::exp(-2.0 * a);
51 double li = 1.0 / 256.0;
52 for (
int k = 15; k >= 1; --k)
53 li = li * z + (k % 2 == 0 ? 1.0 : -1.0) / (k * k);
55 return std::copysign(0.5 * a * a - a * 0.6931471805599453
56 + 0.5 * (li + 0.8224670334241132), x);