summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Gough <bjg@gnu.org>2010-02-25 15:38:48 +0000
committerBrian Gough <bjg@gnu.org>2010-02-25 15:38:48 +0000
commitc7e9e51a933ea55a72e6121ad1730d07adc7bb20 (patch)
treecbd0c00533143063480db9d7ad2a60b14c7f4f1c
parent87c4d916076889709158ff189db1ec0d80211e78 (diff)
downloadgsl-c7e9e51a933ea55a72e6121ad1730d07adc7bb20.tar.gz
fix for bug #27859: gsl_sf_hyperg_U not implemented for x<0
The confluent hypergeometric function gsl_sf_hyperg_U (a,b,x) has been extended to support x < 0 for cases not involving singularities in 1F1(a,b,x). Points with singularities would require taking limits, which is more complicated.
-rw-r--r--NEWS4
-rw-r--r--specfunc/ChangeLog4
-rw-r--r--specfunc/hyperg_U.c144
-rw-r--r--specfunc/test_hyperg.c142
4 files changed, 292 insertions, 2 deletions
diff --git a/NEWS b/NEWS
index bfd0128..1ea6f24 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,7 @@
+** The confluent hypergeometric function gsl_sf_hyperg_U (a,b,x) has
+ been extended to support x < 0 for cases not involving
+ singularities in 1F1(a,b,x). [bug #27859]
+
** The F-distribution gsl_ran_fdist_pdf now avoids unnecessary
underflow and overflow and handles cases where n > 248. [bug
#28500]
diff --git a/specfunc/ChangeLog b/specfunc/ChangeLog
index 3212d88..4f62fdc 100644
--- a/specfunc/ChangeLog
+++ b/specfunc/ChangeLog
@@ -1,3 +1,7 @@
+2010-02-25 Brian Gough <bjg@network-theory.co.uk>
+
+ * hyperg_U.c (hyperg_U_negx): handle the case where x<0
+
2010-01-23 Brian Gough <bjg@network-theory.co.uk>
* hyperg_1F1.c (gsl_sf_hyperg_1F1_e): use Kummer transformation
diff --git a/specfunc/hyperg_U.c b/specfunc/hyperg_U.c
index dca6c50..3960adb 100644
--- a/specfunc/hyperg_U.c
+++ b/specfunc/hyperg_U.c
@@ -1479,6 +1479,142 @@ hyperg_U_int_origin (const int a, const int b, gsl_sf_result_e10 * result)
return hyperg_U_origin (a, b, result);
}
+/* Calculate U(a,b,x) for x < 0
+
+ Abramowitz and Stegun formula 13.1.3
+
+ U(a,b,x) = (gamma(1-b)/gamma(1+a-b)) M(a,b,x)
+ - z^(1-b) (gamma(1-b)/gamma(a)) M(1+a-b,2-b,x)
+
+ can be transformed into
+
+ U(a,b,x) = poch(1+a-b,-a) M(a,b,x)
+ + z^(1-b) poch(a,-(1+a-b)) M(1+a-b,2-b,x)
+
+ using the reflection formula 6.1.17 and the definition of
+ Poch(a,b)=gamma(a+b)/gamma(a). Our poch function already handles
+ the special cases of ratios of gamma functions with negative
+ integer argument.
+
+ Note that U(a,b,x) is complex in general for x<0 due to the term
+ x^(1-b), but is real when
+
+ 1) b is an integer
+
+ 4) a is zero or a negative integer so x^(1-b)/gamma(a) is zero.
+
+ For integer b U(a,b,x) is defined as the limit beta->b U(a,beta,x).
+ This makes the situation slightly more complicated.
+
+*/
+
+static int
+hyperg_U_negx (const double a, const double b, const double x, gsl_sf_result_e10 * result)
+{
+ gsl_sf_result r1, r2;
+ int stat_1, stat_2, status;
+ int a_int = (a == floor(a));
+ int b_int = (b == floor(b));
+
+ double T1 = 0, T1_err = 0, T2 = 0, T2_err = 0;
+
+ /* Compute the first term poch(1+a-b) M(a,b,x) */
+
+ if (b_int && b <= 0 && !(a_int && a <= 0 && a >= b))
+ {
+ /* Need to handle first term as
+
+ lim_{beta->b} poch(1+a-beta,-a) M(a,beta,x)
+
+ due to pole in M(a,b,x) for b == 0 or -ve integer
+
+ We skip this case when a is zero or a negative integer and
+ a>=b because the hypergeometric series terminates before any
+ singular terms
+ */
+
+ /* FIXME: TO BE IMPLEMENTED ! */
+ result->val = GSL_NAN; result->err = GSL_NAN;
+ GSL_ERROR("limit case integer b <= 0 unimplemented", GSL_EUNIMPL);
+ }
+ else
+ {
+ stat_1 = gsl_sf_poch_e(1+a-b,-a,&r1);
+ status = stat_1;
+
+ if (r1.val != 0.0)
+ {
+ gsl_sf_result Mr1;
+ int stat_Mr1 = gsl_sf_hyperg_1F1_e (a, b, x, &Mr1);
+ status = GSL_ERROR_SELECT_2(status, stat_Mr1);
+
+ T1 = Mr1.val * r1.val;
+ T1_err = 2.0 * GSL_DBL_EPSILON * fabs(T1)
+ + fabs(Mr1.err * r1.val) + fabs(Mr1.val * r1.err) ;
+ }
+ }
+
+
+ /* Compute the second term z^(1-b) poch(a,-(1+a-b)) M(1+a-b,2-b,x) */
+
+ if (b_int && b >= 2 && !(a_int && a <= (b - 2)))
+ {
+ /* Need to handle second term as a limit due to pole in
+ M(1+a-b,2-b,x).
+
+ We skip this case when a is integer and a <= b-2 because the
+ hypergeometric series terminates before any singular terms
+ */
+
+ /* FIXME: TO BE IMPLEMENTED ! */
+ result->val = GSL_NAN; result->err = GSL_NAN;
+ GSL_ERROR("limit case integer b >= 2 unimplemented", GSL_EUNIMPL);
+ }
+ else
+ {
+ if (a_int && a <= 0 && (b >= 1))
+ {
+ r2.val = 0;
+ r2.err = 0;
+ }
+ else
+ {
+ stat_2 = gsl_sf_poch_e(a,-(1+a-b),&r2);
+ status = GSL_ERROR_SELECT_2(status, stat_2);
+ }
+
+ if (r2.val != 0.0)
+ {
+ gsl_sf_result Mr2;
+ int stat_Mr2 = gsl_sf_hyperg_1F1_e (1+a-b, 2-b, x, &Mr2);
+ T2 = Mr2.val * r2.val;
+ T2_err = 2.0 * GSL_DBL_EPSILON * fabs(T2)
+ + fabs(Mr2.err * r2.val) + fabs(Mr2.val * r2.err);
+ status = GSL_ERROR_SELECT_2(status, stat_Mr2);
+
+ if (T2 != 0.0)
+ {
+ double x1mb = pow(x, 1-b);
+ T2 = x1mb * T2;
+ T2_err = fabs(x1mb) * T2_err;
+ }
+ }
+ }
+
+ result->val = (T1 + T2);
+ result->err = 2.0 * GSL_DBL_EPSILON * fabs(result->val) + (T1_err + T2_err);
+ result->e10 = 0;
+
+ return status;
+}
+
+static int
+hyperg_U_int_negx (const int a, const int b, const double x, gsl_sf_result_e10 * result)
+{
+ return hyperg_U_negx (a, b, x, result);
+}
+
+
/*-*-*-*-*-*-*-*-*-*-*-* Functions with Error Codes *-*-*-*-*-*-*-*-*-*-*-*/
@@ -1488,11 +1624,13 @@ gsl_sf_hyperg_U_int_e10_e(const int a, const int b, const double x,
{
/* CHECK_POINTER(result) */
- if(x <= 0.0 || (x == 0.0 && b >= 1)) {
+ if(x == 0.0 && b >= 1) {
DOMAIN_ERROR_E10(result);
}
else if (x == 0.0) {
return hyperg_U_int_origin (a, b, result);
+ } else if (x < 0.0) {
+ return hyperg_U_int_negx (a, b, x, result);
}
else {
if(b >= 1) {
@@ -1531,7 +1669,7 @@ gsl_sf_hyperg_U_e10_e(const double a, const double b, const double x,
/* CHECK_POINTER(result) */
- if(x < 0.0 || (x == 0.0 && b >= 1)) {
+ if(x == 0.0 && b >= 1) {
DOMAIN_ERROR_E10(result);
}
else if(a == 0.0) {
@@ -1541,6 +1679,8 @@ gsl_sf_hyperg_U_e10_e(const double a, const double b, const double x,
return GSL_SUCCESS;
} else if (x == 0.0) {
return hyperg_U_origin (a, b, result);
+ } else if (x < 0.0) {
+ return hyperg_U_negx (a, b, x, result);
}
else if(a_integer && b_integer) {
return gsl_sf_hyperg_U_int_e10_e(rinta, rintb, x, result);
diff --git a/specfunc/test_hyperg.c b/specfunc/test_hyperg.c
index e914e55..2595d3a 100644
--- a/specfunc/test_hyperg.c
+++ b/specfunc/test_hyperg.c
@@ -292,6 +292,20 @@ int test_hyperg(void)
TEST_SF(s, gsl_sf_hyperg_1F1_e, (-1.5, 1.5, 100., &r), 1.0893724312430935129254e37, TEST_TOL4, GSL_SUCCESS);
TEST_SF(s, gsl_sf_hyperg_1F1_e, (-1.5, 1.5, 709., &r), 8.7396804160264899999692120e298, TEST_TOL4, GSL_SUCCESS);
TEST_SF(s, gsl_sf_hyperg_1F1_e, (-1.5, 1.5, 710., &r), 2.36563187217417898169834615e299, TEST_TOL4, GSL_SUCCESS);
+
+ /* Bug report from Weibin Li <weibinli@mpipks-dresden.mpg.de> */
+
+#ifdef FIXME
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (-37.8, 2.01, 103.58, &r), -6.21927211009e17, TEST_TOL1, GSL_SUCCESS);
+#endif
+
+ /* Testing BJG */
+
+#ifdef COMPARISON_WITH_MATHEMATICA
+ /* Mathematica uses a different convention for M(-m,-n,x) */
+ TEST_SF(s, gsl_sf_hyperg_1F1_int_e, (-1, -1, 0.1, &r), 1.1, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_1F1_e, (-1, -1, 0.1, &r), 1.1, TEST_TOL0, GSL_SUCCESS);
+#endif
/* U for integer parameters */
@@ -441,6 +455,134 @@ int test_hyperg(void)
TEST_SF(s, gsl_sf_hyperg_U_e, (-2.0, 0.5, 0.0, &r), 0.75, TEST_TOL2, GSL_SUCCESS);
TEST_SF(s, gsl_sf_hyperg_U_e, (-2.0, 0.5, 1e-20, &r), 0.75, TEST_TOL2, GSL_SUCCESS);
+ /* U(a,b,x) for x<0 [bug #27859] */
+
+ /* Tests for b >= 0 */
+
+ TEST_SF(s, gsl_sf_hyperg_U_e, ( 0, 0, -0.1, &r), 1, TEST_TOL0, GSL_SUCCESS);
+#ifdef FIXME /* unimplemented case */
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-1, 0, -0.1, &r), -0.1, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-2, 0, -0.1, &r), 0.21, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-3, 0, -0.1, &r), -0.661, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-4, 0, -0.1, &r), 2.7721, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-5, 0, -0.1, &r), -14.52201, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-6, 0, -0.1, &r), 91.230301, TEST_TOL0, GSL_SUCCESS);
+#endif
+
+ TEST_SF(s, gsl_sf_hyperg_U_e, ( 0, 1, -0.1, &r), 1.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-1, 1, -0.1, &r), -1.1, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-2, 1, -0.1, &r), 2.41, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-3, 1, -0.1, &r), -7.891, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-4, 1, -0.1, &r), 34.3361, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-5, 1, -0.1, &r), -186.20251, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-6, 1, -0.1, &r), 1208.445361, TEST_TOL0, GSL_SUCCESS);
+
+#ifdef FIXME /* unimplemented case */
+ TEST_SF(s, gsl_sf_hyperg_U_e, ( 1, 2, -0.1, &r), -10.0, TEST_TOL0, GSL_SUCCESS);
+#endif
+ TEST_SF(s, gsl_sf_hyperg_U_e, ( 0, 2, -0.1, &r), 1.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-1, 2, -0.1, &r), -2.1, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-2, 2, -0.1, &r), 6.61, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-3, 2, -0.1, &r), -27.721, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-4, 2, -0.1, &r), 145.2201, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-5, 2, -0.1, &r), -912.30301, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-6, 2, -0.1, &r), 6682.263421, TEST_TOL0, GSL_SUCCESS);
+
+#ifdef FIXME /* unimplemented case */
+ TEST_SF(s, gsl_sf_hyperg_U_e, ( 2, 3, -0.1, &r), 100.0, TEST_TOL0, GSL_SUCCESS);
+#endif
+ TEST_SF(s, gsl_sf_hyperg_U_e, ( 1, 3, -0.1, &r), 90.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, ( 0, 3, -0.1, &r), 1.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-1, 3, -0.1, &r), -3.10, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-2, 3, -0.1, &r), 12.81, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-3, 3, -0.1, &r), -66.151, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-4, 3, -0.1, &r), 409.8241, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-5, 3, -0.1, &r), -2961.42351, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-6, 3, -0.1, &r), 24450.804481, TEST_TOL0, GSL_SUCCESS);
+
+#ifdef FIXME /* unimplemented case */
+ TEST_SF(s, gsl_sf_hyperg_U_e, ( 3, 4, -0.1, &r), -1000.0, TEST_TOL0, GSL_SUCCESS);
+#endif
+ TEST_SF(s, gsl_sf_hyperg_U_e, ( 2, 4, -0.1, &r), -1900.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, ( 1, 4, -0.1, &r), -1810.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, ( 0, 4, -0.1, &r), 1.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-1, 4, -0.1, &r), -4.10, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-2, 4, -0.1, &r), 21.01, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-3, 4, -0.1, &r), -129.181, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-4, 4, -0.1, &r), 926.5481, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-5, 4, -0.1, &r), -7594.16401, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-6, 4, -0.1, &r), 70015.788541, TEST_TOL0, GSL_SUCCESS);
+
+ /* Tests for b < 0 */
+
+ TEST_SF(s, gsl_sf_hyperg_U_e, ( 0, -1, -0.1, &r), 1.0, TEST_TOL0, GSL_SUCCESS);
+#ifdef FIXME /* unimplemented case */
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-1, -1, -0.1, &r), 0.9, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-2, -1, -0.1, &r), 0.01, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-3, -1, -0.1, &r), -0.031, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-4, -1, -0.1, &r), 0.1281, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-5, -1, -0.1, &r), -0.66151, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-6, -1, -0.1, &r), 4.098241, TEST_TOL0, GSL_SUCCESS);
+#endif
+
+ TEST_SF(s, gsl_sf_hyperg_U_e, ( 0, -2, -0.1, &r), 1.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-1, -2, -0.1, &r), 1.9, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-2, -2, -0.1, &r), 1.81, TEST_TOL0, GSL_SUCCESS);
+#ifdef FIXME /* unimplemented case */
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-3, -2, -0.1, &r), -0.001, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-4, -2, -0.1, &r), 0.0041, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-5, -2, -0.1, &r), -0.02101, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-6, -2, -0.1, &r), 0.129181, TEST_TOL0, GSL_SUCCESS);
+#endif
+
+ TEST_SF(s, gsl_sf_hyperg_U_e, ( 0, -3, -0.1, &r), 1.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-1, -3, -0.1, &r), 2.9, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-2, -3, -0.1, &r), 5.61, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-3, -3, -0.1, &r), 5.429, TEST_TOL0, GSL_SUCCESS);
+#ifdef FIXME /* unimplemented case */
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-4, -3, -0.1, &r), 0.0001, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-5, -3, -0.1, &r), -0.00051, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-6, -3, -0.1, &r), 0.003121, TEST_TOL0, GSL_SUCCESS);
+#endif
+
+ TEST_SF(s, gsl_sf_hyperg_U_e, ( 0, -4, -0.1, &r), 1.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-1, -4, -0.1, &r), 3.9, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-2, -4, -0.1, &r), 11.41, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-3, -4, -0.1, &r), 22.259, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-4, -4, -0.1, &r), 21.7161, TEST_TOL0, GSL_SUCCESS);
+#ifdef FIXME /* unimplemented case */
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-5, -4, -0.1, &r), -1e-5, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-6, -4, -0.1, &r), 0.000061, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-7, -4, -0.1, &r), -0.0004341, TEST_TOL0, GSL_SUCCESS);
+#endif
+
+ /* Tests for integer a */
+
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-3, 0.5, -0.5, &r), -9.5, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-8, 0.5, -0.5, &r), 180495.0625, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-8, 1.5, -0.5, &r), 827341.0625, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-8, 1.5, -10, &r), 7.162987810253906e9, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (3, 6, -0.5, &r), -296.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (3, 7, -0.5, &r), 2824, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (5, 12, -1.7, &r), -153.262676210016018065768591104, TEST_TOL0, GSL_SUCCESS);
+
+ /* A few random tests */
+
+ TEST_SF(s, gsl_sf_hyperg_U_e, (0, 0, -0.5, &r), 1, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (0, 1, -0.5, &r), 1, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (0, 1, -0.001, &r), 1, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-1, 0.99, -0.1, &r), -1.09, TEST_TOL0, GSL_SUCCESS);
+
+#ifdef FIXME /* unimplemented case */
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-1, 0, -0.5, &r), -0.5, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-2, 0, -0.5, &r), 1.25, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_e, (-7, 0, -0.1, &r), -668.2263421, TEST_TOL0, GSL_SUCCESS);
+#endif
+
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (3, 6, -0.5, &r), -296.0, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (3, 7, -0.5, &r), 2824, TEST_TOL0, GSL_SUCCESS);
+ TEST_SF(s, gsl_sf_hyperg_U_int_e, (5, 12, -1.7, &r), -153.262676210016018065768591104, TEST_TOL0, GSL_SUCCESS);
+
/* 2F1 */
TEST_SF(s, gsl_sf_hyperg_2F1_e, (1, 1, 1, 0.5, &r), 2.0, TEST_TOL0, GSL_SUCCESS);