1#ifndef STAN_MATH_OPENCL_KERNELS_DEVICE_FUNCTIONS_DIGAMMA_HPP
2#define STAN_MATH_OPENCL_KERNELS_DEVICE_FUNCTIONS_DIGAMMA_HPP
10namespace opencl_kernels {
12static constexpr const char* digamma_device_function
14 "#ifndef STAN_MATH_OPENCL_KERNELS_DEVICE_FUNCTIONS_DIGAMMA\n"
15 "#define STAN_MATH_OPENCL_KERNELS_DEVICE_FUNCTIONS_DIGAMMA\n" STRINGIFY(
29 double remainder = x -
floor(x);
30 if (remainder > 0.5) {
36 result = M_PI /
tan(M_PI * remainder);
45 = {0.083333333333333333333333333333333333333333333333333,
46 -0.0083333333333333333333333333333333333333333333333333,
47 0.003968253968253968253968253968253968253968253968254,
48 -0.0041666666666666666666666666666666666666666666666667,
49 0.0075757575757575757575757575757575757575757575757576,
50 -0.021092796092796092796092796092796092796092796092796,
51 0.083333333333333333333333333333333333333333333333333,
52 -0.44325980392156862745098039215686274509803921568627};
55 result += 1 / (2 * x);
56 double z = 1 / (x * x);
58 for (
int i = 6; i >= 0; i--) {
73 const float Y = 0.99558162689208984F;
75 const double root1 = (double)1569415565 / 1073741824uL;
77 = (double)381566830 / 1073741824uL / 1073741824uL;
79 = 0.9016312093258695918615325266959189453125e-19;
82 = {0.25479851061131551, -0.32555031186804491,
83 -0.65031853770896507, -0.28919126444774784,
84 -0.045251321448739056, -0.0020713321167745952};
85 const double Q[7] = {1.0,
90 0.0021284987017821144,
91 -0.55789841321675513e-6};
92 double g = x - root1 - root2 - root3;
94 for (
int i = 4; i >= 0; i--) {
95 tmp = tmp * (x - 1) + P[i];
98 for (
int i = 5; i >= 0; i--) {
99 tmp2 = tmp2 * (x - 1) + Q[i];
103 double r = tmp / tmp2;
104 result += g * Y + g * r;
double digamma(double x)
Calculates the digamma function - derivative of logarithm of gamma.
fvar< T > log(const fvar< T > &x)
fvar< T > tan(const fvar< T > &x)
fvar< T > floor(const fvar< T > &x)
The lgamma implementation in stan-math is based on either the reentrant safe lgamma_r implementation ...