2
0
mirror of https://github.com/boostorg/math.git synced 2026-01-24 18:12:09 +00:00

1F1: Correct use of precision changing in pFq.

Correct test values which were effected by the above issue.
This commit is contained in:
jzmaddock
2019-04-21 19:03:54 +01:00
parent 70809e3c06
commit 350d9a3cd1
2 changed files with 19 additions and 18 deletions

View File

@@ -75,7 +75,7 @@ namespace boost {
};
template <class Seq, class Real, class Policy>
Real hypergeometric_pFq_precision(const Seq& aj, const Seq& bj, const Real& z, unsigned digits10, double timeout, const Policy& pol)
Real hypergeometric_pFq_precision(const Seq& aj, const Seq& bj, Real z, unsigned digits10, double timeout, const Policy& pol)
{
unsigned current_precision = digits10 + 5;
@@ -98,10 +98,11 @@ namespace boost {
ai->precision(current_precision);
for (auto bi = bb.begin(); bi != bb.end(); ++bi)
bi->precision(current_precision);
z.precision(current_precision);
try
{
int scale = 0;
std::pair<Real, Real> rp = boost::math::detail::hypergeometric_pFq_checked_series_impl(aj, bj, z, pol, boost::math::detail::timed_iteration_terminator(boost::math::policies::get_max_series_iterations<Policy>(), timeout), scale);
std::pair<Real, Real> rp = boost::math::detail::hypergeometric_pFq_checked_series_impl(aa, bb, z, pol, boost::math::detail::timed_iteration_terminator(boost::math::policies::get_max_series_iterations<Policy>(), timeout), scale);
rp.first *= exp(Real(scale));
rp.second *= exp(Real(scale));

View File

@@ -269,22 +269,22 @@ void test_spots6(T, const char* type_name)
{ { std::ldexp((double)10485037389193216, -40), std::ldexp((double)-10840488483391544, -35), std::ldexp((double)17577061875712000, -45), SC_(2.8030884395368690164859926372380406504460219e-07) } },
//
// Negative a and b worst cases:
{ { std::ldexp((double)-9281686323200000, -44), std::ldexp((double)-14062138056704000, -44), std::ldexp((double)13563284652032000, -44), SC_(2.83381029611748905436564183928049453625733389e+265) } },
{ { std::ldexp((double)-17049048150016000, -44), std::ldexp((double)-16971363917824000, -45), std::ldexp((double)11759598960640000, -49), SC_(4636596575297708282.15391199523219256661832333) }},
{ { std::ldexp((double)-14233964060672000, -45), std::ldexp((double)-12648356216832000, -47), std::ldexp((double)9597206757376000, -46), SC_(-1.29952965544474451915331906705211320124261355e+104) }},
{ { std::ldexp((double)-16705334214656000, -45), std::ldexp((double)-15447756718080000, -46), std::ldexp((double)16395884134400000, -47), SC_(5.40680141346616359293013198457674276017117348e+113) }},
{ { std::ldexp((double)-13991530405888000, -45), std::ldexp((double)-10196587347968000, -46), std::ldexp((double)13331347734528000, -46), SC_(1.28612752976615347819085089716937824474111365e+138) }},
{ { std::ldexp((double)-15134950760448000, -45), std::ldexp((double)-14587193786368000, -48), std::ldexp((double)17022855921664000, -46), SC_(-8.81689040877580073465185463207591010592963947e+115) }},
{ { std::ldexp((double)-14854672039936000, -45), std::ldexp((double)-10436558200832000, -45), std::ldexp((double)11370918969344000, -47), SC_(8.85535247272534117445528460568920680343270651e+54) } },
{ { std::ldexp((double)-16711069286400000, -46), std::ldexp((double)-14809815056384000, -46), std::ldexp((double)10469312954368000, -47), SC_(50343352353398198766339890377962553344.0) } },
{ { std::ldexp((double)-15026786402304000, -45), std::ldexp((double)-16687356968960000, -46), std::ldexp((double)14895621603328000, -47), SC_(2.85329560424602656900599696665580727040444839e+95) } },
{ { std::ldexp((double)-15519073435648000, -45), std::ldexp((double)-14162009718784000, -45), std::ldexp((double)9997818855424000, -48), SC_(95767987018108517.7639995774279100260173436254) } },
{ { std::ldexp((double)-15317481275392000, -46), std::ldexp((double)-16531865931776000, -44), std::ldexp((double)17586268880896000, -45), SC_(1.47012480470837240834700634331053708005164679e+104) }},
{ { std::ldexp((double)-11335669673984000, -44), std::ldexp((double)-13146047094784000, -44), std::ldexp((double)13671437864960000, -44), SC_(-2.18876072849870893180776779453843962111085257e+288) }},
{ { std::ldexp((double)-16877985234944000, -46), std::ldexp((double)-14384006086656000, -46), std::ldexp((double)9074349342720000, -47), SC_(15376193613462463541358751744655360.0) }},
{ { std::ldexp((double)-9751199809536000, -45), std::ldexp((double)-17654191685632000, -47), std::ldexp((double)10587451850752000, -47), SC_(-1.9601415510439595625538337964298353914980331e+68) }},
{ { std::ldexp((double)-15233620754432000, -45), std::ldexp((double)-12708283072512000, -46), std::ldexp((double)10255461007360000, -46), SC_(-5.43441063616790758618595678580168066778261756e+125) }},
{ { std::ldexp((double)-11241354149888000, -45), std::ldexp((double)-9580579905536000, -45), std::ldexp((double)12224976846848000, -47), SC_(1.20468565484700674058707264904280026536015299e+46) }},
{ { std::ldexp((double)-9281686323200000, -44), std::ldexp((double)-14062138056704000, -44), std::ldexp((double)13563284652032000, -44), SC_(2.8338102961174890442403751063892055396228341374378e+265) } },
{ { std::ldexp((double)-17049048150016000, -44), std::ldexp((double)-16971363917824000, -45), std::ldexp((double)11759598960640000, -49), SC_(4636596575297708282.1539119952275597833292408543916) }},
{ { std::ldexp((double)-14233964060672000, -45), std::ldexp((double)-12648356216832000, -47), std::ldexp((double)9597206757376000, -46), SC_(-1.2995296554447445191533190670521132012426135496934e+104) }},
{ { std::ldexp((double)-16705334214656000, -45), std::ldexp((double)-15447756718080000, -46), std::ldexp((double)16395884134400000, -47), SC_(5.4068014134661635929301319845768046995946557071618e+113) }},
{ { std::ldexp((double)-13991530405888000, -45), std::ldexp((double)-10196587347968000, -46), std::ldexp((double)13331347734528000, -46), SC_(1.2861275297661534781908508971693782447411136476694e+138) }},
{ { std::ldexp((double)-15134950760448000, -45), std::ldexp((double)-14587193786368000, -48), std::ldexp((double)17022855921664000, -46), SC_(-8.8168904087758007346518546320759101059296394741359e+115) }},
{ { std::ldexp((double)-14854672039936000, -45), std::ldexp((double)-10436558200832000, -45), std::ldexp((double)11370918969344000, -47), SC_(8.8553524727253411744552846056891456360191660433059e+54) } },
{ { std::ldexp((double)-16711069286400000, -46), std::ldexp((double)-14809815056384000, -46), std::ldexp((double)10469312954368000, -47), SC_(50343352353398198766339890377687038177.388095267191) } },
{ { std::ldexp((double)-15026786402304000, -45), std::ldexp((double)-16687356968960000, -46), std::ldexp((double)14895621603328000, -47), SC_(2.8532956042460265690059969666558072704044483623242e+95) } },
{ { std::ldexp((double)-15519073435648000, -45), std::ldexp((double)-14162009718784000, -45), std::ldexp((double)9997818855424000, -48), SC_(95767987018108517.763999577428194082282035178055037) } },
{ { std::ldexp((double)-15317481275392000, -46), std::ldexp((double)-16531865931776000, -44), std::ldexp((double)17586268880896000, -45), SC_(1.4701248047083724279783071194324315286789986738882e+104) }},
{ { std::ldexp((double)-11335669673984000, -44), std::ldexp((double)-13146047094784000, -44), std::ldexp((double)13671437864960000, -44), SC_(-2.1887607284987089539904337941443591993019781369247e+288) }},
{ { std::ldexp((double)-16877985234944000, -46), std::ldexp((double)-14384006086656000, -46), std::ldexp((double)9074349342720000, -47), SC_(15376193613462463541358751744530105.412429016705833) }},
{ { std::ldexp((double)-9751199809536000, -45), std::ldexp((double)-17654191685632000, -47), std::ldexp((double)10587451850752000, -47), SC_(-1.9601415510439595625538337964298353914980331018955e+68) }},
{ { std::ldexp((double)-15233620754432000, -45), std::ldexp((double)-12708283072512000, -46), std::ldexp((double)10255461007360000, -46), SC_(-5.4344106361679075861859567858016187271235441673635e+125) }},
{ { std::ldexp((double)-11241354149888000, -45), std::ldexp((double)-9580579905536000, -45), std::ldexp((double)12224976846848000, -47), SC_(12046856548470067405870726490464935201150430438.035) }},
} };
static const boost::array<boost::array<T, 4>, 2> hypergeometric_1F1_big_bugs = { {
#if DBL_MAX_EXP == LDBL_MAX_EXP