| | 300 | |
| | 301 | // digamma |
| | 302 | // copied from C. Bonds' source |
| | 303 | #include <math.h> |
| | 304 | #define el 0.5772156649015329 |
| | 305 | |
| | 306 | double psi(double x) { |
| | 307 | double s,ps,xa,x2; |
| | 308 | int n,k; |
| | 309 | static double a[] = { |
| | 310 | -0.8333333333333e-01, |
| | 311 | 0.83333333333333333e-02, |
| | 312 | -0.39682539682539683e-02, |
| | 313 | 0.41666666666666667e-02, |
| | 314 | -0.75757575757575758e-02, |
| | 315 | 0.21092796092796093e-01, |
| | 316 | -0.83333333333333333e-01, |
| | 317 | 0.4432598039215686}; |
| | 318 | |
| | 319 | xa = fabs(x); |
| | 320 | s = 0.0; |
| | 321 | if ((x == (int)x) && (x <= 0.0)) { |
| | 322 | ps = 1e308; |
| | 323 | return ps; |
| | 324 | } |
| | 325 | if (xa == (int)xa) { |
| | 326 | n = xa; |
| | 327 | for (k=1;k<n;k++) { |
| | 328 | s += 1.0/k; |
| | 329 | } |
| | 330 | ps = s-el; |
| | 331 | } |
| | 332 | else if ((xa+0.5) == ((int)(xa+0.5))) { |
| | 333 | n = xa-0.5; |
| | 334 | for (k=1;k<=n;k++) { |
| | 335 | s += 1.0/(2.0*k-1.0); |
| | 336 | } |
| | 337 | ps = 2.0*s-el-1.386294361119891; |
| | 338 | } |
| | 339 | else { |
| | 340 | if (xa < 10.0) { |
| | 341 | n = 10-(int)xa; |
| | 342 | for (k=0;k<n;k++) { |
| | 343 | s += 1.0/(xa+k); |
| | 344 | } |
| | 345 | xa += n; |
| | 346 | } |
| | 347 | x2 = 1.0/(xa*xa); |
| | 348 | ps = log(xa)-0.5/xa+x2*(((((((a[7]*x2+a[6])*x2+a[5])*x2+ |
| | 349 | a[4])*x2+a[3])*x2+a[2])*x2+a[1])*x2+a[0]); |
| | 350 | ps -= s; |
| | 351 | } |
| | 352 | if (x < 0.0) |
| | 353 | ps = ps - M_PI*std::cos(M_PI*x)/std::sin(M_PI*x)-1.0/x; |
| | 354 | return ps; |