diff options
| author | Brian Gough <bjg@gnu.org> | 2010-02-25 15:38:48 +0000 |
|---|---|---|
| committer | Brian Gough <bjg@gnu.org> | 2010-02-25 15:38:48 +0000 |
| commit | c7e9e51a933ea55a72e6121ad1730d07adc7bb20 (patch) | |
| tree | cbd0c00533143063480db9d7ad2a60b14c7f4f1c | |
| parent | 87c4d916076889709158ff189db1ec0d80211e78 (diff) | |
| download | gsl-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-- | NEWS | 4 | ||||
| -rw-r--r-- | specfunc/ChangeLog | 4 | ||||
| -rw-r--r-- | specfunc/hyperg_U.c | 144 | ||||
| -rw-r--r-- | specfunc/test_hyperg.c | 142 |
4 files changed, 292 insertions, 2 deletions
@@ -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); |
