Follow-up Comment #1, bug #66850 (group gsl): Though the solution is exact and performant (it circumvents the use of series or continued fraction calculations), it has the same limitations: numerous test cases fail regardless of whether the patch is installed. The following test cases can be added tp specfunc/test_hyperg.c:
TEST_SF(s, gsl_sf_hyperg_2F1_e, (1, 4, 3, -1/2.0, &r), 16/27.0, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_2F1_e, (1, 40, 39, -1/2.0, &r), 232/351.0, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_2F1_e, (1, 400, 399, -1/2.0, &r), 2392/3591.0, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_2F1_e, (10, 40, 39, -1/2.0, &r), 0.0158593478717443560201269, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_2F1_e, (20, 14, 13, -1/3.0, &r), 0.00195151503934399583018743074, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_2F1_e, (2, 14, 13, -1/3.0, &r), 225/416.0, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_2F1_e, (2, 14, 13, -1/9.0, &r), 1296/1625.0, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_2F1_e, (2, 2, 1, -1/9.0, &r), 81/125.0, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_2F1_e, (2, 2, 1, -1/10.0, &r), 900/1331.0, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_2F1_e, (4, 2, 1, -1, &r), -1/16.0, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_2F1_e, (8, 2, 1, -1, &r), -3/256.0, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_2F1_e, (10, 2, 1, -1, &r), -1/256.0, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_2F1_e, (-1, 2, 1, -1, &r), 3, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_2F1_e, (-1, 5, 4, -1, &r), 9/4.0, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_2F1_e, (-1, 15, 14, 10, &r), -68/7.0, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_2F1_e, (-1, 3, 2, 1, &r), -0.5, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_2F1_e, (-1, 3, 2, 10, &r), -14, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_2F1_e, (-1, 3, 2, 100, &r), -149, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_2F1_e, (-1, 3, 2, 1000, &r), -1499, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_2F1_e, (-1, 3, 2, 10000, &r), -14999, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_2F1_e, (3, 1, 2, -1, &r), 3/8.0, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_2F1_e, (4, 1, 3, -1, &r), 5/12.0, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_2F1_e, (14, 1, 13, -1, &r), 25/52.0, TEST_TOL0, GSL_SUCCESS); TEST_SF(s, gsl_sf_hyperg_2F1_e, (140, 1, 139, -1, &r), 277/556.0, TEST_TOL0, GSL_SUCCESS); /* the following test cases fail */ // TEST_SF(s, gsl_sf_hyperg_2F1_e, (1, 1, 0, 0, &r), undefined, TEST_TOL0, GSL_SUCCESS); /* undefined, hence needs special handling */ // TEST_SF(s, gsl_sf_hyperg_2F1_e, (100, 2, 1, -1/2.0, &r), -7.9528826459414479705549e-17, TEST_TOL0, GSL_SUCCESS); /* accuracy */ // TEST_SF(s, gsl_sf_hyperg_2F1_e, (100, 3, 2, -1/2.0, &r), -3.8534586016417325218152e-17, TEST_TOL0, GSL_SUCCESS); /* accuracy */ // TEST_SF(s, gsl_sf_hyperg_2F1_e, (20, 40, 39, -1/2.0, &r), 0.0002493220513051845892, TEST_TOL0, GSL_SUCCESS); /* accuracy */ // TEST_SF(s, gsl_sf_hyperg_2F1_e, (20, 14, 13, -1/2.0, &r), 0.00014650883427211877925283, TEST_TOL0, GSL_SUCCESS); /* accuracy */ // TEST_SF(s, gsl_sf_hyperg_2F1_e, (8, 2, 1, -2, &r), -13/19683.0, TEST_TOL0, GSL_SUCCESS); /* a too large */ // TEST_SF(s, gsl_sf_hyperg_2F1_e, (3, 2, 1, -12, &r), -23/28561.0, TEST_TOL0, GSL_SUCCESS); /* x too large (abs) */ // TEST_SF(s, gsl_sf_hyperg_2F1_e, (-1, 4, 3, -1, &r), 7/3.0, TEST_TOL0, GSL_SUCCESS); /* accuracy */ // TEST_SF(s, gsl_sf_hyperg_2F1_e, (-1, 15, 14, -1, &r), 29/14.0, TEST_TOL0, GSL_SUCCESS); /* accuracy */ // TEST_SF(s, gsl_sf_hyperg_2F1_e, (2, 15, 14, 10, &r), 53/5103.0, TEST_TOL0, GSL_SUCCESS); /* x too large */ // TEST_SF(s, gsl_sf_hyperg_2F1_e, (3, 15, 14, 10, &r), -16/15309.0, TEST_TOL0, GSL_SUCCESS); /* x too large */ // TEST_SF(s, gsl_sf_hyperg_2F1_e, (-3, 15, 14, 10, &r), -6318/7.0, TEST_TOL0, GSL_SUCCESS); /* x too large */ // TEST_SF(s, gsl_sf_hyperg_2F1_e, (-3, 5, 4, 5, &r), -124, TEST_TOL0, GSL_SUCCESS); /* x too large */ // TEST_SF(s, gsl_sf_hyperg_2F1_e, (-1, 4, 3, 10000, &r), -39997/3.0, TEST_TOL0, GSL_SUCCESS); /* x too large */ // TEST_SF(s, gsl_sf_hyperg_2F1_e, (-2, 4, 3, 1000, &r), -1664001, TEST_TOL0, GSL_SUCCESS); /* x too large */ // TEST_SF(s, gsl_sf_hyperg_2F1_e, (-3, 4, 3, 1000, &r), -1995003999, TEST_TOL0, GSL_SUCCESS); /* x too large */ // TEST_SF(s, gsl_sf_hyperg_2F1_e, (-3, 3, 2, 1000, &r), -2494004499, TEST_TOL0, GSL_SUCCESS); /* x too large */ // TEST_SF(s, gsl_sf_hyperg_2F1_e, (-3, 2, 1, 1000, &r), -3991005999, TEST_TOL0, GSL_SUCCESS); /* x too large */ // TEST_SF(s, gsl_sf_hyperg_2F1_e, (-8, 2, 1, 10, &r), 425684241, TEST_TOL0, GSL_SUCCESS); /* x too large? */ // TEST_SF(s, gsl_sf_hyperg_2F1_e, (-10, -10, -11, 100, &r), 7391185002367640001, TEST_TOL0, GSL_SUCCESS); /* x too large? */ // TEST_SF(s, gsl_sf_hyperg_2F1_e, (-10, -10, -11, 10, &r), -387420489/11.0, TEST_TOL0, GSL_SUCCESS); /* x too large? */ // TEST_SF(s, gsl_sf_hyperg_2F1_e, (14, 1, 13, -1/2, &r), 76/117.0, TEST_TOL0, GSL_SUCCESS); // TEST_SF(s, gsl_sf_hyperg_2F1_e, (14, 1, 13, -2, &r), 37/117.0, TEST_TOL0, GSL_SUCCESS); // TEST_SF(s, gsl_sf_hyperg_2F1_e, (140, 1, 139, -2, &r), 415/1251.0, TEST_TOL0, GSL_SUCCESS); // TEST_SF(s, gsl_sf_hyperg_2F1_e, (140, 1, 139, 1/2, &r), 280/139.0, TEST_TOL0, GSL_SUCCESS); // TEST_SF(s, gsl_sf_hyperg_2F1_e, (140, 1, 139, 2, &r), -137/139.0, TEST_TOL0, GSL_SUCCESS); // TEST_SF(s, gsl_sf_hyperg_2F1_e, (11, 10, 10, -3, &r), 2.384185791015625e-07, TEST_TOL0, GSL_SUCCESS); Hence further development needed and almost certainly the use of the pow-function needs to be reviewed. _______________________________________________________ Reply to this item at: <https://savannah.gnu.org/bugs/?66850> _______________________________________________ Message sent via Savannah https://savannah.gnu.org/
signature.asc
Description: PGP signature