В этом примере мы рассмотрим полиномиальную оценку, это не только важный случай использования, но это тот, который номер
работает особенно хорошо, потому что шаблоны экспрессии полностью устраняют все temporaries из полиномиальной схемы .
Следующий код оценивает sin(x)
как многочленное, точное по крайней мере до 64 десятичных мест:
using boost::multiprecision::cpp_dec_float;
typedef boost::multiprecision::number<cpp_dec_float<64> > mp_type;
mp_type mysin(const mp_type& x)
{
static const std::array<mp_type, 32U> coefs =
{{
mp_type("+1.5707963267948966192313216916397514420985846996875529104874722961539082031431044993140174126711"),
mp_type("-0.64596409750624625365575656389794573337969351178927307696134454382929989411386887578263960484"),
mp_type("+0.07969262624616704512050554949047802252091164235106119545663865720995702920146198554317279"),
mp_type("-0.0046817541353186881006854639339534378594950280185010575749538605102665157913157426229824"),
mp_type("+0.00016044118478735982187266087016347332970280754062061156858775174056686380286868007443"),
mp_type("-3.598843235212085340458540018208389404888495232432127661083907575106196374913134E-6"),
mp_type("+5.692172921967926811775255303592184372902829756054598109818158853197797542565E-8"),
mp_type("-6.688035109811467232478226335783138689956270985704278659373558497256423498E-10"),
mp_type("+6.066935731106195667101445665327140070166203261129845646380005577490472E-12"),
mp_type("-4.377065467313742277184271313776319094862897030084226361576452003432E-14"),
mp_type("+2.571422892860473866153865950420487369167895373255729246889168337E-16"),
mp_type("-1.253899540535457665340073300390626396596970180355253776711660E-18"),
mp_type("+5.15645517658028233395375998562329055050964428219501277474E-21"),
mp_type("-1.812399312848887477410034071087545686586497030654642705E-23"),
mp_type("+5.50728578652238583570585513920522536675023562254864E-26"),
mp_type("-1.461148710664467988723468673933026649943084902958E-28"),
mp_type("+3.41405297003316172502972039913417222912445427E-31"),
mp_type("-7.07885550810745570069916712806856538290251E-34"),
mp_type("+1.31128947968267628970845439024155655665E-36"),
mp_type("-2.18318293181145698535113946654065918E-39"),
mp_type("+3.28462680978498856345937578502923E-42"),
mp_type("-4.48753699028101089490067137298E-45"),
mp_type("+5.59219884208696457859353716E-48"),
mp_type("-6.38214503973500471720565E-51"),
mp_type("+6.69528558381794452556E-54"),
mp_type("-6.47841373182350206E-57"),
mp_type("+5.800016389666445E-60"),
mp_type("-4.818507347289E-63"),
mp_type("+3.724683686E-66"),
mp_type("-2.6856479E-69"),
mp_type("+1.81046E-72"),
mp_type("-1.133E-75"),
}};
const mp_type v = x * 2 / boost::math::constants::pi<mp_type>();
const mp_type x2 = (v * v);
const mp_type sum = ((((((((((((((((((((((((((((((( + coefs[31U]
* x2 + coefs[30U])
* x2 + coefs[29U])
* x2 + coefs[28U])
* x2 + coefs[27U])
* x2 + coefs[26U])
* x2 + coefs[25U])
* x2 + coefs[24U])
* x2 + coefs[23U])
* x2 + coefs[22U])
* x2 + coefs[21U])
* x2 + coefs[20U])
* x2 + coefs[19U])
* x2 + coefs[18U])
* x2 + coefs[17U])
* x2 + coefs[16U])
* x2 + coefs[15U])
* x2 + coefs[14U])
* x2 + coefs[13U])
* x2 + coefs[12U])
* x2 + coefs[11U])
* x2 + coefs[10U])
* x2 + coefs[9U])
* x2 + coefs[8U])
* x2 + coefs[7U])
* x2 + coefs[6U])
* x2 + coefs[5U])
* x2 + coefs[4U])
* x2 + coefs[3U])
* x2 + coefs[2U])
* x2 + coefs[1U])
* x2 + coefs[0U])
* v;
return sum;
}
Называя такую функцию:
mp_type pid4 = boost::math::constants::pi<mp_type>() / 4;
std::cout << std::setprecision(std::numeric_limits< ::mp_type>::digits10) << std::scientific;
std::cout << mysin(pid4) << std::endl;
Вырабатывает ожидаемый результат:
7.0710678118654752440084436210484903928483593768847403658833986900e-01