在boost中定义多精度pi:多精度

Define multiprecision pi in boost:multiprecision

本文关键字:精度 pi 定义 boost      更新时间:2023-10-16

我需要boost::multiprecision中任意(但固定)精度的pi(3.1415…)。

boost::math::constants中的常数只定义为固定数量的数字,正如这个答案中所指出的,所以我需要自己计算。

因为我经常使用这个数字,而且数字非常多,所以我希望在运行时只计算一次。什么是一种简单而快速的方法呢?

我想用

typedef number<cpp_dec_float<PRECISION> > mpfloat;  // PRECISION is compile time.
const int PI = atan(mpfloat(1))*4;

但我不确定这是一个常见的习语。

在c++14中,您可以使用模板变量(http://en.cppreference.com/w/cpp/language/variable_template)。

请注意,通过包括,您已经可以拥有您想要的内容

#include <boost/multiprecision/detail/default_ops.hpp>

该报头最终包括定义template <class T> const T& get_constant_pi()constants.hpp

这已经是模板变量的c++03习惯用法了(因为它存储了一个函数本地静态结果值)。

calc_pi具有硬编码的前1100位数字,如果需要,则通过优化的公式计算其余数字。

50和5000位数字的演示:

在Coliru(c++14)上直播

#include <boost/multiprecision/cpp_dec_float.hpp>
#include <boost/multiprecision/detail/default_ops.hpp>
#include <boost/multiprecision/number.hpp>
#include <iostream>
namespace {
namespace bmp = boost::multiprecision;
template <int N> bmp::number<bmp::cpp_dec_float<N> > const my_const_pi 
= bmp::default_ops::get_constant_pi<bmp::cpp_dec_float<N> >();
}
int main() {
std::cout << std::setprecision(50)   << my_const_pi<50>   << "n";
std::cout << std::setprecision(5000) << my_const_pi<5000> << "n";
}

打印

3.14159265358979323846264338327950288419716939937513.14159265358979323846264338327950288419716939993751058209749445923307816406286208998862803482534217079824086513282306647093860955058223172535940812848111745028410270193852110555964462294895493038196442881097566593344612847568423378316527120190914564856692346034861045432664821339360726024914127372458700660631558817488152092096225409171536436789259036001133053054846652138414695194151160943305727036575959195309218611738193261179310511854807446237996274956735188572489122793818301194912987336244065664308602139463952247371907021798609437027705392171762931767523846748184676694051320056812714526356082778577134278960917363717872146844090122495343014654958537105079227968925892354201995611212902196086403441815981362977477130996051870721134999999837804995105973173281609631859502445945534690830242522308253344685035261931188171010003137838752865875332838142061717766914730359825342875546873115956286388237875937519577818577805321712268066130019278766111959092164201989380952572010654858632788659361538182796823030195203530185296899579577362259941389149217752834791315155748572424541506959508295168617278558890750983817546374649393192504009277016711390098488240128583616035637076601047101819429555961989467678374944825537977472684710404753466200466842590694912933136770289891521047521620569660240580381501935112533824300355876402474964732639141992726042699227967823547863600934172164121992458631503028618297455570674983850549458858692699569092721079750930295532116534498720259602364806654991198818347977535663074265442527862551817574672890977777279380008164706001614524919217321721477235014144197356854816136115735255213347574184668438523323907394143334547762416862518983569485562099219218427255025425688767179049460165346680498486272327917860843879679766814541009538837886360950680064225105117392984848960841284886269456042419652850222106611863067442786220391919494504712371378696095637191728746776457396241389086583264599581339047802759009946576407895126946839835259570958222620522489407726719478268482601476990902640136394437455305068203496251749399651414209190659250937221696461515709858387410597885959775498930161753928468138268683868942774155955925245953959431049972524680845987273644695848653836736222626099124608051243884390451244136549762780715691435997700129616089441694865854840635342222582848848158456028506016842739452267467678892521385225499546667278239864565961163548862305774980355936345681743241125150760694794510965960940252288797108931456691368672287489405601015033086179286809208874760917824985899009714909675985261365549781893129784821682998487226588045756401427047755513237964145152374623436454285844479526867821011413547357395231134271661021359695362314429524849371871101457654403590279934403742007310578539062193874478084784896833214457138687519435064302184531910484810053706146806749192781911979399520614196634287544406437451237181921799983910159195618146751426997489409071864942319615679452080951465502252316038819301420937621378559566389377870830390697920773672218256259966150142150306844773456492026054146659252014974428507325186660021324340881907104866331734649651450353953905796268561005508106658796998163574736384052571459102897064140110971206280390397595156771577004203378699360072330558763176359421873125147120532928191826186125867321579198414848821647060957527069572209175617171672098169091528017350671274858322287183520935396572512108357915136988209149144421006751033467110314126711136865851639831501970165151168517143765761835155650884909985998238734552833163550764791853589322618548963213293308985706420467525907091548141654985946163718027099819943099244889575712828905923260972997120844335773265489382391193259746366730583604142813883032038249037589825243744170213276561809377344403070746921120191302033038019762110110044929321516084244485966983889522868478323552658213144958572624338930368642624341073226978028079154411010446823252716201052652272111660396665573092547110557853763466820653109652691862056476931257058635662018558100729360659876486117910453348850346611768675324441668039265797877185560845529654126654085306143444318586769751456614068007002378776591344017127494704205622305389945613140711270004078547332699390814546646458807972708266830634328587856983052358089330657574067957163775254202114955761581400250126228594130216471550979259230990796547376125517656751357517829666454779174501129961489030463994713296210734043751895735961458901938971311179042978285475032031986915140287080859904801094121472213179476477762214254854540357185306142288137585043063321751829798662237172159160769254748738886654949450114654062843366393790039769265672146385306736096571209180763832716641627488880078692560290228472104031721186082041900042296617119637792133711495950156604963186294726547364252308177036751590673502350728354056704037435136222247715891504953098444893330963408780769325993978054193414473774418426312986080998886874132604

我建议将pi的值作为一个常量放入源代码中,无论您需要多少位数。

将其定义为结构中的静态。