26#if defined (HAVE_CONFIG_H)
65 =
Complex (numeric_limits<double>::Inf (),
66 numeric_limits<double>::Inf ());
69 =
Complex (numeric_limits<double>::NaN (),
70 numeric_limits<double>::NaN ());
99 numeric_limits<float>::Inf ());
103 numeric_limits<float>::NaN ());
133 double zr = z.real ();
134 double zi = z.imag ();
140 F77_FUNC (
zairy, ZAIRY) (zr, zi, id, sc, ar, ai, nz, t_ierr);
144 if (zi == 0.0 && (! scaled || zr >= 0.0))
147 return bessel_return_value (
Complex (ar, ai),
ierr);
163 retval(i, j) =
airy (z(i, j), deriv, scaled,
ierr(i, j));
179 retval(i) =
airy (z(i), deriv, scaled,
ierr(i));
199 float ar = a.real ();
200 float ai = a.imag ();
202 if (z.imag () == 0.0 && (! scaled || z.real () >= 0.0))
221 retval(i, j) =
airy (z(i, j), deriv, scaled,
ierr(i, j));
237 retval(i) =
airy (z(i), deriv, scaled,
ierr(i));
272 double zr = z.real ();
273 double zi = z.imag ();
275 F77_FUNC (zbesj, ZBESJ) (zr, zi, alpha, kode, 1, &yr, &yi, nz, t_ierr);
279 if (zi == 0.0 && zr >= 0.0)
282 retval = bessel_return_value (
Complex (yr, yi),
ierr);
284 else if (octave::math::is_integer (alpha))
289 if ((
static_cast<long> (alpha)) & 1)
291 retval = bessel_return_value (tmp,
ierr);
301 tmp -= sin (M_PI * alpha) *
zbesy (z, alpha, kode,
ierr);
303 retval = bessel_return_value (tmp,
ierr);
306 retval =
Complex (numeric_limits<double>::NaN (),
307 numeric_limits<double>::NaN ());
327 double zr = z.real ();
328 double zi = z.imag ();
332 if (zr == 0.0 && zi == 0.0)
334 yr = -numeric_limits<double>::Inf ();
339 F77_FUNC (zbesy, ZBESY) (zr, zi, alpha, kode, 1, &yr, &yi, nz,
344 if (zi == 0.0 && zr >= 0.0)
348 return bessel_return_value (
Complex (yr, yi),
ierr);
350 else if (octave::math::is_integer (alpha - 0.5))
355 if ((
static_cast<long> (alpha - 0.5)) & 1)
357 retval = bessel_return_value (tmp,
ierr);
367 tmp += sin (M_PI * alpha) *
zbesj (z, alpha, kode,
ierr);
369 retval = bessel_return_value (tmp,
ierr);
372 retval =
Complex (numeric_limits<double>::NaN (),
373 numeric_limits<double>::NaN ());
391 double zr = z.real ();
392 double zi = z.imag ();
394 F77_FUNC (zbesi, ZBESI) (zr, zi, alpha, kode, 1, &yr, &yi, nz, t_ierr);
398 if (zi == 0.0 && zr >= 0.0)
401 retval = bessel_return_value (
Complex (yr, yi),
ierr);
403 else if (octave::math::is_integer (alpha))
408 retval = bessel_return_value (tmp,
ierr);
418 Complex tmp2 = (2.0 / M_PI) * sin (M_PI * alpha)
424 tmp2 *= exp (-z - std::abs (z.real ()));
429 retval = bessel_return_value (tmp,
ierr);
432 retval =
Complex (numeric_limits<double>::NaN (),
433 numeric_limits<double>::NaN ());
451 double zr = z.real ();
452 double zi = z.imag ();
456 if (zr == 0.0 && zi == 0.0)
458 yr = numeric_limits<double>::Inf ();
463 F77_FUNC (zbesk, ZBESK) (zr, zi, alpha, kode, 1, &yr, &yi, nz,
468 if (zi == 0.0 && zr >= 0.0)
472 retval = bessel_return_value (
Complex (yr, yi),
ierr);
478 retval = bessel_return_value (tmp,
ierr);
496 double zr = z.real ();
497 double zi = z.imag ();
499 F77_FUNC (
zbesh, ZBESH) (zr, zi, alpha, kode, 1, 1, &yr, &yi, nz,
504 retval = bessel_return_value (
Complex (yr, yi),
ierr);
512 Complex tmp = exp (M_PI * alpha * eye) * zbesh1 (z, alpha, kode,
ierr);
514 retval = bessel_return_value (tmp,
ierr);
532 double zr = z.real ();
533 double zi = z.imag ();
535 F77_FUNC (
zbesh, ZBESH) (zr, zi, alpha, kode, 2, 1, &yr, &yi, nz,
540 retval = bessel_return_value (
Complex (yr, yi),
ierr);
548 Complex tmp = exp (-M_PI * alpha * eye) * zbesh2 (z, alpha, kode,
ierr);
550 retval = bessel_return_value (tmp,
ierr);
559do_bessel (
dptr f,
const char *,
double alpha,
const Complex&
x,
564 retval =
f (
x, alpha, (scaled ? 2 : 1),
ierr);
582 retval(i, j) =
f (
x(i, j), alpha, (scaled ? 2 : 1),
ierr(i, j));
600 retval(i, j) =
f (
x, alpha(i, j), (scaled ? 2 : 1),
ierr(i, j));
606do_bessel (
dptr f,
const char *fn,
const Matrix& alpha,
617 if (x_nr != alpha_nr || x_nc != alpha_nc)
618 (*current_liboctave_error_handler)
619 (
"%s: the sizes of alpha and x must conform", fn);
630 retval(i, j) =
f (
x(i, j), alpha(i, j), (scaled ? 2 : 1),
ierr(i, j));
646 retval(i) =
f (
x(i), alpha, (scaled ? 2 : 1),
ierr(i));
662 retval(i) =
f (
x, alpha(i), (scaled ? 2 : 1),
ierr(i));
674 if (dv != alpha.
dims ())
675 (*current_liboctave_error_handler)
676 (
"%s: the sizes of alpha and x must conform", fn);
684 retval(i) =
f (
x(i), alpha(i), (scaled ? 2 : 1),
ierr(i));
703 retval(i, j) =
f (
x(i), alpha(j), (scaled ? 2 : 1),
ierr(i, j));
708#define SS_BESSEL(name, fcn) \
710 name (double alpha, const Complex& x, bool scaled, octave_idx_type& ierr) \
712 return do_bessel (fcn, #name, alpha, x, scaled, ierr); \
715#define SM_BESSEL(name, fcn) \
717 name (double alpha, const ComplexMatrix& x, bool scaled, \
718 Array<octave_idx_type>& ierr) \
720 return do_bessel (fcn, #name, alpha, x, scaled, ierr); \
723#define MS_BESSEL(name, fcn) \
725 name (const Matrix& alpha, const Complex& x, bool scaled, \
726 Array<octave_idx_type>& ierr) \
728 return do_bessel (fcn, #name, alpha, x, scaled, ierr); \
731#define MM_BESSEL(name, fcn) \
733 name (const Matrix& alpha, const ComplexMatrix& x, bool scaled, \
734 Array<octave_idx_type>& ierr) \
736 return do_bessel (fcn, #name, alpha, x, scaled, ierr); \
739#define SN_BESSEL(name, fcn) \
741 name (double alpha, const ComplexNDArray& x, bool scaled, \
742 Array<octave_idx_type>& ierr) \
744 return do_bessel (fcn, #name, alpha, x, scaled, ierr); \
747#define NS_BESSEL(name, fcn) \
749 name (const NDArray& alpha, const Complex& x, bool scaled, \
750 Array<octave_idx_type>& ierr) \
752 return do_bessel (fcn, #name, alpha, x, scaled, ierr); \
755#define NN_BESSEL(name, fcn) \
757 name (const NDArray& alpha, const ComplexNDArray& x, bool scaled, \
758 Array<octave_idx_type>& ierr) \
760 return do_bessel (fcn, #name, alpha, x, scaled, ierr); \
763#define RC_BESSEL(name, fcn) \
765 name (const RowVector& alpha, const ComplexColumnVector& x, bool scaled, \
766 Array<octave_idx_type>& ierr) \
768 return do_bessel (fcn, #name, alpha, x, scaled, ierr); \
771#define ALL_BESSEL(name, fcn) \
772 SS_BESSEL (name, fcn) \
773 SM_BESSEL (name, fcn) \
774 MS_BESSEL (name, fcn) \
775 MM_BESSEL (name, fcn) \
776 SN_BESSEL (name, fcn) \
777 NS_BESSEL (name, fcn) \
778 NN_BESSEL (name, fcn) \
779 RC_BESSEL (name, fcn)
832 if (z.imag () == 0.0 && z.real () >= 0.0)
835 retval = bessel_return_value (y,
ierr);
837 else if (octave::math::is_integer (alpha))
842 if ((
static_cast<long> (alpha)) & 1)
844 retval = bessel_return_value (tmp,
ierr);
850 FloatComplex tmp = cosf (
static_cast<float> (M_PI) * alpha)
855 tmp -= sinf (
static_cast<float> (M_PI) * alpha)
858 retval = bessel_return_value (tmp,
ierr);
862 numeric_limits<float>::NaN ());
883 if (z.real () == 0.0 && z.imag () == 0.0)
895 if (z.imag () == 0.0 && z.real () >= 0.0)
899 return bessel_return_value (y,
ierr);
901 else if (octave::math::is_integer (alpha - 0.5))
906 if ((
static_cast<long> (alpha - 0.5)) & 1)
908 retval = bessel_return_value (tmp,
ierr);
914 FloatComplex tmp = cosf (
static_cast<float> (M_PI) * alpha)
919 tmp += sinf (
static_cast<float> (M_PI) * alpha)
922 retval = bessel_return_value (tmp,
ierr);
926 numeric_limits<float>::NaN ());
948 if (z.imag () == 0.0 && z.real () >= 0.0)
951 retval = bessel_return_value (y,
ierr);
962 * sinf (
static_cast<float> (M_PI) * alpha)
963 * cbesk (z, alpha, kode,
ierr);
968 tmp2 *= exp (-z - std::abs (z.real ()));
973 retval = bessel_return_value (tmp,
ierr);
977 numeric_limits<float>::NaN ());
996 if (z.real () == 0.0 && z.imag () == 0.0)
1007 if (z.imag () == 0.0 && z.real () >= 0.0)
1011 retval = bessel_return_value (y,
ierr);
1017 retval = bessel_return_value (tmp,
ierr);
1039 retval = bessel_return_value (y,
ierr);
1047 FloatComplex tmp = exp (
static_cast<float> (M_PI) * alpha * eye)
1048 * cbesh1 (z, alpha, kode,
ierr);
1050 retval = bessel_return_value (tmp,
ierr);
1072 retval = bessel_return_value (y,
ierr);
1080 FloatComplex tmp = exp (-
static_cast<float> (M_PI) * alpha * eye)
1081 * cbesh2 (z, alpha, kode,
ierr);
1083 retval = bessel_return_value (tmp,
ierr);
1098 retval =
f (
x, alpha, (scaled ? 2 : 1),
ierr);
1116 retval(i, j) =
f (
x(i, j), alpha, (scaled ? 2 : 1),
ierr(i, j));
1135 retval(i, j) =
f (
x, alpha(i, j), (scaled ? 2 : 1),
ierr(i, j));
1153 if (x_nr != alpha_nr || x_nc != alpha_nc)
1154 (*current_liboctave_error_handler)
1155 (
"%s: the sizes of alpha and x must conform", fn);
1166 retval(i, j) =
f (
x(i, j), alpha(i, j), (scaled ? 2 : 1),
ierr(i, j));
1182 retval(i) =
f (
x(i), alpha, (scaled ? 2 : 1),
ierr(i));
1198 retval(i) =
f (
x, alpha(i), (scaled ? 2 : 1),
ierr(i));
1211 if (dv != alpha.
dims ())
1212 (*current_liboctave_error_handler)
1213 (
"%s: the sizes of alpha and x must conform", fn);
1221 retval(i) =
f (
x(i), alpha(i), (scaled ? 2 : 1),
ierr(i));
1240 retval(i, j) =
f (
x(i), alpha(j), (scaled ? 2 : 1),
ierr(i, j));
1245#define SS_BESSEL(name, fcn) \
1247 name (float alpha, const FloatComplex& x, bool scaled, \
1248 octave_idx_type& ierr) \
1250 return do_bessel (fcn, #name, alpha, x, scaled, ierr); \
1253#define SM_BESSEL(name, fcn) \
1254 FloatComplexMatrix \
1255 name (float alpha, const FloatComplexMatrix& x, bool scaled, \
1256 Array<octave_idx_type>& ierr) \
1258 return do_bessel (fcn, #name, alpha, x, scaled, ierr); \
1261#define MS_BESSEL(name, fcn) \
1262 FloatComplexMatrix \
1263 name (const FloatMatrix& alpha, const FloatComplex& x, bool scaled, \
1264 Array<octave_idx_type>& ierr) \
1266 return do_bessel (fcn, #name, alpha, x, scaled, ierr); \
1269#define MM_BESSEL(name, fcn) \
1270 FloatComplexMatrix \
1271 name (const FloatMatrix& alpha, const FloatComplexMatrix& x, \
1272 bool scaled, Array<octave_idx_type>& ierr) \
1274 return do_bessel (fcn, #name, alpha, x, scaled, ierr); \
1277#define SN_BESSEL(name, fcn) \
1278 FloatComplexNDArray \
1279 name (float alpha, const FloatComplexNDArray& x, bool scaled, \
1280 Array<octave_idx_type>& ierr) \
1282 return do_bessel (fcn, #name, alpha, x, scaled, ierr); \
1285#define NS_BESSEL(name, fcn) \
1286 FloatComplexNDArray \
1287 name (const FloatNDArray& alpha, const FloatComplex& x, \
1288 bool scaled, Array<octave_idx_type>& ierr) \
1290 return do_bessel (fcn, #name, alpha, x, scaled, ierr); \
1293#define NN_BESSEL(name, fcn) \
1294 FloatComplexNDArray \
1295 name (const FloatNDArray& alpha, const FloatComplexNDArray& x, \
1296 bool scaled, Array<octave_idx_type>& ierr) \
1298 return do_bessel (fcn, #name, alpha, x, scaled, ierr); \
1301#define RC_BESSEL(name, fcn) \
1302 FloatComplexMatrix \
1303 name (const FloatRowVector& alpha, \
1304 const FloatComplexColumnVector& x, bool scaled, \
1305 Array<octave_idx_type>& ierr) \
1307 return do_bessel (fcn, #name, alpha, x, scaled, ierr); \
1310#define ALL_BESSEL(name, fcn) \
1311 SS_BESSEL (name, fcn) \
1312 SM_BESSEL (name, fcn) \
1313 MS_BESSEL (name, fcn) \
1314 MM_BESSEL (name, fcn) \
1315 SN_BESSEL (name, fcn) \
1316 NS_BESSEL (name, fcn) \
1317 NN_BESSEL (name, fcn) \
1318 RC_BESSEL (name, fcn)
1343 double zr = z.real ();
1344 double zi = z.imag ();
1348 F77_INT sc = (scaled ? 2 : 1);
1354 if (zi == 0.0 && (! scaled || zr >= 0.0))
1357 return bessel_return_value (
Complex (ar, ai),
ierr);
1373 retval(i, j) =
biry (z(i, j), deriv, scaled,
ierr(i, j));
1389 retval(i) =
biry (z(i), deriv, scaled,
ierr(i));
1402 F77_INT sc = (scaled ? 2 : 1);
1409 float ar = a.real ();
1410 float ai = a.imag ();
1412 if (z.imag () == 0.0 && (! scaled || z.real () >= 0.0))
1431 retval(i, j) =
biry (z(i, j), deriv, scaled,
ierr(i, j));
1447 retval(i) =
biry (z(i), deriv, scaled,
ierr(i));
1474ellipj (
double u,
double m,
double& sn,
double& cn,
double& dn,
double& err)
1476 static const int Nmax = 16;
1477 double m1, t=0, si_u, co_u, se_u, ta_u, b, c[Nmax], a[Nmax], phi;
1482 (*current_liboctave_warning_with_id_handler)
1483 (
"Octave:ellipj-invalid-m",
1484 "ellipj: invalid M value, required value 0 <= M <= 1");
1491 double sqrt_eps = std::sqrt (std::numeric_limits<double>::epsilon ());
1497 t = 0.25*m*(u - si_u*co_u);
1498 sn = si_u - t * co_u;
1499 cn = co_u + t * si_u;
1500 dn = 1 - 0.5*m*si_u*si_u;
1502 else if ((1 - m) < sqrt_eps)
1510 sn = ta_u + 0.25*m1*(si_u*co_u - u)*se_u*se_u;
1511 cn = se_u - 0.25*m1*(si_u*co_u - u)*ta_u*se_u;
1512 dn = se_u + 0.25*m1*(si_u*co_u + u)*ta_u*se_u;
1519 b = std::sqrt (1 - m);
1520 c[0] = std::sqrt (m);
1521 for (n = 1; n < Nmax; ++n)
1523 a[n] = (a[n - 1] + b)/2;
1524 c[n] = (a[n - 1] - b)/2;
1525 b = std::sqrt (a[n - 1]*b);
1526 if (c[n]/a[n] < std::numeric_limits<double>::epsilon ())
break;
1534 for (ii = 1; n > 0; ii *= 2, --n) {}
1536 for (n = Nn; n > 0; --n)
1538 phi = (std::asin ((c[n]/a[n])* sin (phi)) + phi)/2;
1542 dn = std::sqrt (1 - m*sn*sn);
1550 double m1 = 1 - m, ss1, cc1, dd1;
1552 ellipj (u.imag (), m1, ss1, cc1, dd1, err);
1563 double ss, cc, dd, ddd;
1565 ellipj (u.real (), m, ss, cc, dd, err);
1566 ddd = cc1*cc1 + m*ss*ss*ss1*ss1;
1567 sn =
Complex (ss*dd1/ddd, cc*dd*ss1*cc1/ddd);
1568 cn =
Complex (cc*cc1/ddd, -ss*dd*ss1*dd1/ddd);
1569 dn =
Complex (dd*cc1*dd1/ddd, -m*ss*cc*ss1/ddd);
1609do_erfcinv (
double x,
bool refine)
1612 static const double a[] =
1614 -2.806989788730439e+01, 1.562324844726888e+02,
1615 -1.951109208597547e+02, 9.783370457507161e+01,
1616 -2.168328665628878e+01, 1.772453852905383e+00
1618 static const double b[] =
1620 -5.447609879822406e+01, 1.615858368580409e+02,
1621 -1.556989798598866e+02, 6.680131188771972e+01,
1622 -1.328068155288572e+01
1624 static const double c[] =
1626 -5.504751339936943e-03, -2.279687217114118e-01,
1627 -1.697592457770869e+00, -1.802933168781950e+00,
1628 3.093354679843505e+00, 2.077595676404383e+00
1630 static const double d[] =
1632 7.784695709041462e-03, 3.224671290700398e-01,
1633 2.445134137142996e+00, 3.754408661907416e+00
1636 static const double spi2 = 8.862269254527579e-01;
1637 static const double pbreak_lo = 0.04850;
1638 static const double pbreak_hi = 1.95150;
1642 if (
x >= pbreak_lo &&
x <= pbreak_hi)
1645 const double q = 0.5*(1-
x), r = q*q;
1646 const double yn = (((((a[0]*r + a[1])*r + a[2])*r + a[3])*r + a[4])*r + a[5])*q;
1647 const double yd = ((((b[0]*r + b[1])*r + b[2])*r + b[3])*r + b[4])*r + 1.0;
1650 else if (
x > 0.0 &&
x < 2.0)
1653 const double q = (
x < 1
1654 ? std::sqrt (-2*std::log (0.5*
x))
1655 : std::sqrt (-2*std::log (0.5*(2-
x))));
1657 const double yn = ((((c[0]*q + c[1])*q + c[2])*q + c[3])*q + c[4])*q + c[5];
1659 const double yd = (((
d[0]*q +
d[1])*q +
d[2])*q +
d[3])*q + 1.0;
1667 return numeric_limits<double>::Inf ();
1669 return -numeric_limits<double>::Inf ();
1671 return numeric_limits<double>::NaN ();
1676 double u = (
erf (y) - (1-
x)) * spi2 * exp (y*y);
1686 return do_erfcinv (
x,
true);
1692 return do_erfcinv (
x,
false);
1746do_erfinv (
double x,
bool refine)
1749 static const double a[] =
1751 -2.806989788730439e+01, 1.562324844726888e+02,
1752 -1.951109208597547e+02, 9.783370457507161e+01,
1753 -2.168328665628878e+01, 1.772453852905383e+00
1755 static const double b[] =
1757 -5.447609879822406e+01, 1.615858368580409e+02,
1758 -1.556989798598866e+02, 6.680131188771972e+01,
1759 -1.328068155288572e+01
1761 static const double c[] =
1763 -5.504751339936943e-03, -2.279687217114118e-01,
1764 -1.697592457770869e+00, -1.802933168781950e+00,
1765 3.093354679843505e+00, 2.077595676404383e+00
1767 static const double d[] =
1769 7.784695709041462e-03, 3.224671290700398e-01,
1770 2.445134137142996e+00, 3.754408661907416e+00
1773 static const double spi2 = 8.862269254527579e-01;
1774 static const double pbreak = 0.95150;
1775 double ax = fabs (
x), y;
1781 const double q = 0.5 *
x, r = q*q;
1782 const double yn = (((((a[0]*r + a[1])*r + a[2])*r + a[3])*r + a[4])*r + a[5])*q;
1783 const double yd = ((((b[0]*r + b[1])*r + b[2])*r + b[3])*r + b[4])*r + 1.0;
1789 const double q = std::sqrt (-2*std::log (0.5*(1-ax)));
1790 const double yn = ((((c[0]*q + c[1])*q + c[2])*q + c[3])*q + c[4])*q + c[5];
1791 const double yd = (((
d[0]*q +
d[1])*q +
d[2])*q +
d[3])*q + 1.0;
1792 y = yn / yd * math::signum (-
x);
1795 return numeric_limits<double>::Inf () * math::signum (
x);
1797 return numeric_limits<double>::NaN ();
1802 double u = (
erf (y) -
x) * spi2 * exp (y*y);
1812 return do_erfinv (
x,
true);
1818 return do_erfinv (
x,
false);
1826 if (std::abs (
x) < 1)
1828 double im =
x.imag ();
1829 double u =
expm1 (
x.real ());
1830 double v = sin (im/2);
1832 retval =
Complex (u*v + u + v, (u+1) * sin (im));
1835 retval = std::exp (
x) -
Complex (1);
1845 if (std::abs (
x) < 1)
1847 float im =
x.imag ();
1848 float u =
expm1 (
x.real ());
1849 float v = sin (im/2);
1868 result = (math::negative_sign (
x)
1869 ? -numeric_limits<double>::Inf ()
1870 : numeric_limits<double>::Inf ());
1871 else if ((
x < 0 && math::is_integer (
x))
1873 result = numeric_limits<double>::Inf ();
1874 else if (math::isnan (
x))
1875 result = numeric_limits<double>::NaN ();
1877 result = std::tgamma (
x);
1891 result = (math::negative_sign (
x)
1892 ? -numeric_limits<float>::Inf ()
1893 : numeric_limits<float>::Inf ());
1894 else if ((
x < 0 && math::is_integer (
x))
1896 result = numeric_limits<float>::Inf ();
1897 else if (math::isnan (
x))
1898 result = numeric_limits<float>::NaN ();
1900 result = std::tgammaf (
x);
1910 double r =
x.real (), i =
x.imag ();
1912 if (fabs (r) < 0.5 && fabs (i) < 0.5)
1914 double u = 2*r + r*r + i*i;
1919 retval = std::log (
Complex (1) +
x);
1929 float r =
x.real (), i =
x.imag ();
1931 if (fabs (r) < 0.5 && fabs (i) < 0.5)
1933 float u = 2*r + r*r + i*i;
1943static const double pi = 3.14159265358979323846;
1945template <
typename T>
1954xlog (
const double&
x)
1956 return std::log (
x);
1961xlog (
const float&
x)
1963 return std::log (
x);
1966template <
typename T>
1968lanczos_approximation_psi (
const T zc)
1974 static const T dg_coeff[10] =
1976 -0.83333333333333333e-1, 0.83333333333333333e-2,
1977 -0.39682539682539683e-2, 0.41666666666666667e-2,
1978 -0.75757575757575758e-2, 0.21092796092796093e-1,
1979 -0.83333333333333333e-1, 0.4432598039215686,
1980 -0.3053954330270122e+1, 0.125318899521531e+2
1983 T overz2 = T (1.0) / (zc * zc);
1988 p += dg_coeff[k] * overz2k;
1989 p += xlog (zc) - T (0.5) / zc;
1993template <
typename T>
1997 static const double euler_mascheroni
1998 = 0.577215664901532860606512090082402431042;
2000 const bool is_int = (std::floor (z) == z);
2007 p = -numeric_limits<T>::Inf ();
2010 p =
psi (1 - z) - (pi / tan (pi * z));
2015 p = - euler_mascheroni;
2019 else if (z - std::floor (z) == 0.5)
2023 p += 1.0 / (2 * k - 1);
2025 p = - euler_mascheroni - 2 * std::log (2) + 2 * (p);
2035 const signed char n = 10 - z;
2036 for (
signed char k = n - 1; k >= 0; k--)
2040 p += lanczos_approximation_psi (zc);
2052template <
typename T>
2058 typedef typename std::complex<T>::value_type P;
2063 std::complex<T> dgam (0.0, 0.0);
2065 dgam = std::complex<T> (
psi (z_r), 0.0);
2067 dgam =
psi (P (1.0) - z)- (P (pi) / tan (P (pi) * z));
2071 std::complex<T> z_m = z;
2074 unsigned char n = 8 - z_ra;
2075 z_m = z + std::complex<T> (n, 0.0);
2080 std::complex<T> z_p = z + P (n - 1);
2081 for (
unsigned char k = n; k > 0; k--, z_p -= 1.0)
2082 dgam -= P (1.0) / z_p;
2092 dgam += lanczos_approximation_psi (z_m);
2103template <
typename T>
2112 F77_INT n = to_f77_int (n_arg);
2124 F77_INT n = to_f77_int (n_arg);
2131template <
typename T>
2137 fortran_psifn<T> (z, n, ans,
ierr);
2146 ans = ans / (std::pow (-1.0, n + 1) /
gamma (
double (n+1)));
2151 ans = - numeric_limits<T>::Inf ();
2153 ans = numeric_limits<T>::NaN ();
2168#if defined (HAVE_LGAMMA_R)
2170 result = lgamma_r (
x, &sgngam);
2172 result = std::lgamma (
x);
2173 int sgngam = signgam;
2176 if (sgngam < 0 && std::isfinite (result))
2177 return Complex (result, M_PI);
2187#if defined (HAVE_LGAMMAF_R)
2189 result = lgammaf_r (
x, &sgngam);
2191 result = std::lgammaf (
x);
2192 int sgngam = signgam;
2195 if (sgngam < 0 && std::isfinite (result))
2205 ?
Complex (std::log (-(1.0 +
x)), M_PI)
2217OCTAVE_END_NAMESPACE(math)
2218OCTAVE_END_NAMESPACE(octave)
subroutine cairy(z, id, kode, ai, nz, ierr)
subroutine cbesh(z, fnu, kode, m, n, cy, nz, ierr)
subroutine cbesi(z, fnu, kode, n, cy, nz, ierr)
subroutine cbesj(z, fnu, kode, n, cy, nz, ierr)
subroutine cbesk(z, fnu, kode, n, cy, nz, ierr)
subroutine cbesy(z, fnu, kode, n, cy, nz, cwrk, ierr)
subroutine cbiry(z, id, kode, bi, ierr)
N Dimensional Array with copy-on-write semantics.
const dim_vector & dims() const
Return a const-reference so that dims ()(i) works efficiently.
octave_idx_type rows() const
void resize(const dim_vector &dv, const T &rfv)
Size of the specified dimension.
octave_idx_type cols() const
octave_idx_type numel() const
Number of elements in the array.
void resize(octave_idx_type nr, octave_idx_type nc, const Complex &rfv=Complex(0))
void resize(octave_idx_type nr, octave_idx_type nc, const FloatComplex &rfv=FloatComplex(0))
Vector representing the dimensions (size) of an Array.
octave_idx_type numel(int n=0) const
Number of elements that a matrix with this dimensions would have.
OCTAVE_BEGIN_NAMESPACE(octave) static octave_value daspk_fcn
subroutine dpsifn(x, n, kode, m, ans, nz, ierr)
#define F77_CONST_CMPLX_ARG(x)
#define F77_XFCN(f, F, args)
octave_f77_int_type F77_INT
double lo_ieee_nan_value()
std::complex< double > Dawson(std::complex< double > z, double relerr=0)
std::complex< double > w(std::complex< double > z, double relerr=0)
std::complex< double > erfi(std::complex< double > z, double relerr=0)
std::complex< double > erfc(std::complex< double > z, double relerr=0)
std::complex< double > erfcx(std::complex< double > z, double relerr=0)
std::complex< double > erf(std::complex< double > z, double relerr=0)
std::complex< double > Complex
std::complex< float > FloatComplex
Complex(* dptr)(const Complex &, double, int, octave_idx_type &)
void fortran_psifn< float >(float z, octave_idx_type n_arg, float &ans, octave_idx_type &ierr)
Complex besselj(double alpha, const Complex &x, bool scaled, octave_idx_type &ierr)
Complex besselh2(double alpha, const Complex &x, bool scaled, octave_idx_type &ierr)
Complex erf(const Complex &x)
void fortran_psifn< double >(double z, octave_idx_type n_arg, double &ans, octave_idx_type &ierr)
Complex rc_log1p(double x)
Complex bessely(double alpha, const Complex &x, bool scaled, octave_idx_type &ierr)
Complex besselk(double alpha, const Complex &x, bool scaled, octave_idx_type &ierr)
Complex besselh1(double alpha, const Complex &x, bool scaled, octave_idx_type &ierr)
Complex rc_lgamma(double x)
#define ALL_BESSEL(name, fcn)
FloatComplex(* fptr)(const FloatComplex &, float, int, octave_idx_type &)
Complex airy(const Complex &z, bool deriv, bool scaled, octave_idx_type &ierr)
Complex expm1(const Complex &x)
void ellipj(double u, double m, double &sn, double &cn, double &dn, double &err)
Complex besseli(double alpha, const Complex &x, bool scaled, octave_idx_type &ierr)
Complex biry(const Complex &z, bool deriv, bool scaled, octave_idx_type &ierr)
Complex log1p(const Complex &x)
Complex erfc(const Complex &x)
subroutine psifn(x, n, kode, m, ans, nz, ierr)
F77_RET_T const F77_DBLE const F77_DBLE F77_DBLE * d
F77_RET_T const F77_DBLE const F77_DBLE F77_DBLE const F77_INT F77_INT & ierr
F77_RET_T const F77_DBLE * x
F77_RET_T const F77_DBLE const F77_DBLE * f
F77_RET_T F77_FUNC(xerbla, XERBLA)(F77_CONST_CHAR_ARG_DEF(s_arg
subroutine zairy(zr, zi, id, kode, air, aii, nz, ierr)
subroutine zbesh(zr, zi, fnu, kode, m, n, cyr, cyi, nz, ierr)
subroutine zbesi(zr, zi, fnu, kode, n, cyr, cyi, nz, ierr)
subroutine zbesj(zr, zi, fnu, kode, n, cyr, cyi, nz, ierr)
subroutine zbesk(zr, zi, fnu, kode, n, cyr, cyi, nz, ierr)
subroutine zbesy(zr, zi, fnu, kode, n, cyr, cyi, nz, cwrkr, cwrki, ierr)
subroutine zbiry(zr, zi, id, kode, bir, bii, ierr)