unchecked_factorial.hpp 80 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621
  1. // Copyright John Maddock 2006.
  2. // Use, modification and distribution are subject to the
  3. // Boost Software License, Version 1.0. (See accompanying file
  4. // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  5. #ifndef BOOST_MATH_SP_UC_FACTORIALS_HPP
  6. #define BOOST_MATH_SP_UC_FACTORIALS_HPP
  7. #ifdef _MSC_VER
  8. #pragma once
  9. #endif
  10. #ifdef _MSC_VER
  11. #pragma warning(push) // Temporary until lexical cast fixed.
  12. #pragma warning(disable: 4127 4701)
  13. #endif
  14. #include <boost/math/tools/convert_from_string.hpp>
  15. #ifdef _MSC_VER
  16. #pragma warning(pop)
  17. #endif
  18. #include <cmath>
  19. #include <boost/math/special_functions/math_fwd.hpp>
  20. #include <boost/math/tools/cxx03_warn.hpp>
  21. #include <array>
  22. #include <type_traits>
  23. #if defined(__GNUC__) && defined(BOOST_MATH_USE_FLOAT128)
  24. //
  25. // This is the only way we can avoid
  26. // warning: non-standard suffix on floating constant [-Wpedantic]
  27. // when building with -Wall -pedantic. Neither __extension__
  28. // nor #pragma diagnostic ignored work :(
  29. //
  30. #pragma GCC system_header
  31. #endif
  32. namespace boost { namespace math
  33. {
  34. // Forward declarations:
  35. template <class T>
  36. struct max_factorial;
  37. //
  38. // see https://github.com/boostorg/math/issues/923
  39. // for the rationale behin using struct's for constexpr data:
  40. //
  41. template <class T, bool = true>
  42. struct unchecked_factorial_data;
  43. template <bool b>
  44. struct unchecked_factorial_data<float, b>
  45. {
  46. #ifdef BOOST_MATH_HAVE_CONSTEXPR_TABLES
  47. static constexpr std::array<float, 35> factorials = { {
  48. 1.0F,
  49. 1.0F,
  50. 2.0F,
  51. 6.0F,
  52. 24.0F,
  53. 120.0F,
  54. 720.0F,
  55. 5040.0F,
  56. 40320.0F,
  57. 362880.0F,
  58. 3628800.0F,
  59. 39916800.0F,
  60. 479001600.0F,
  61. 6227020800.0F,
  62. 87178291200.0F,
  63. 1307674368000.0F,
  64. 20922789888000.0F,
  65. 355687428096000.0F,
  66. 6402373705728000.0F,
  67. 121645100408832000.0F,
  68. 0.243290200817664e19F,
  69. 0.5109094217170944e20F,
  70. 0.112400072777760768e22F,
  71. 0.2585201673888497664e23F,
  72. 0.62044840173323943936e24F,
  73. 0.15511210043330985984e26F,
  74. 0.403291461126605635584e27F,
  75. 0.10888869450418352160768e29F,
  76. 0.304888344611713860501504e30F,
  77. 0.8841761993739701954543616e31F,
  78. 0.26525285981219105863630848e33F,
  79. 0.822283865417792281772556288e34F,
  80. 0.26313083693369353016721801216e36F,
  81. 0.868331761881188649551819440128e37F,
  82. 0.29523279903960414084761860964352e39F,
  83. }};
  84. #else
  85. static const std::array<float, 35> factorials;
  86. #endif
  87. };
  88. template<bool b>
  89. #ifdef BOOST_MATH_HAVE_CONSTEXPR_TABLES
  90. constexpr std::array<float, 35> unchecked_factorial_data<float, b>::factorials;
  91. #else
  92. const std::array<float, 35> unchecked_factorial_data<float, b>::factorials = {{
  93. 1.0F,
  94. 1.0F,
  95. 2.0F,
  96. 6.0F,
  97. 24.0F,
  98. 120.0F,
  99. 720.0F,
  100. 5040.0F,
  101. 40320.0F,
  102. 362880.0F,
  103. 3628800.0F,
  104. 39916800.0F,
  105. 479001600.0F,
  106. 6227020800.0F,
  107. 87178291200.0F,
  108. 1307674368000.0F,
  109. 20922789888000.0F,
  110. 355687428096000.0F,
  111. 6402373705728000.0F,
  112. 121645100408832000.0F,
  113. 0.243290200817664e19F,
  114. 0.5109094217170944e20F,
  115. 0.112400072777760768e22F,
  116. 0.2585201673888497664e23F,
  117. 0.62044840173323943936e24F,
  118. 0.15511210043330985984e26F,
  119. 0.403291461126605635584e27F,
  120. 0.10888869450418352160768e29F,
  121. 0.304888344611713860501504e30F,
  122. 0.8841761993739701954543616e31F,
  123. 0.26525285981219105863630848e33F,
  124. 0.822283865417792281772556288e34F,
  125. 0.26313083693369353016721801216e36F,
  126. 0.868331761881188649551819440128e37F,
  127. 0.29523279903960414084761860964352e39F,
  128. }};
  129. #endif
  130. // Definitions:
  131. template <>
  132. inline BOOST_MATH_CONSTEXPR_TABLE_FUNCTION float unchecked_factorial<float>(unsigned i BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE_SPEC(float))
  133. {
  134. return unchecked_factorial_data<float>::factorials[i];
  135. }
  136. template <>
  137. struct max_factorial<float>
  138. {
  139. static constexpr unsigned value = 34;
  140. };
  141. template <bool b>
  142. struct unchecked_factorial_data<double, b>
  143. {
  144. #ifdef BOOST_MATH_HAVE_CONSTEXPR_TABLES
  145. static constexpr std::array<double, 171> factorials = { {
  146. 1.0,
  147. 1.0,
  148. 2.0,
  149. 6.0,
  150. 24.0,
  151. 120.0,
  152. 720.0,
  153. 5040.0,
  154. 40320.0,
  155. 362880.0,
  156. 3628800.0,
  157. 39916800.0,
  158. 479001600.0,
  159. 6227020800.0,
  160. 87178291200.0,
  161. 1307674368000.0,
  162. 20922789888000.0,
  163. 355687428096000.0,
  164. 6402373705728000.0,
  165. 121645100408832000.0,
  166. 0.243290200817664e19,
  167. 0.5109094217170944e20,
  168. 0.112400072777760768e22,
  169. 0.2585201673888497664e23,
  170. 0.62044840173323943936e24,
  171. 0.15511210043330985984e26,
  172. 0.403291461126605635584e27,
  173. 0.10888869450418352160768e29,
  174. 0.304888344611713860501504e30,
  175. 0.8841761993739701954543616e31,
  176. 0.26525285981219105863630848e33,
  177. 0.822283865417792281772556288e34,
  178. 0.26313083693369353016721801216e36,
  179. 0.868331761881188649551819440128e37,
  180. 0.29523279903960414084761860964352e39,
  181. 0.103331479663861449296666513375232e41,
  182. 0.3719933267899012174679994481508352e42,
  183. 0.137637530912263450463159795815809024e44,
  184. 0.5230226174666011117600072241000742912e45,
  185. 0.203978820811974433586402817399028973568e47,
  186. 0.815915283247897734345611269596115894272e48,
  187. 0.3345252661316380710817006205344075166515e50,
  188. 0.1405006117752879898543142606244511569936e52,
  189. 0.6041526306337383563735513206851399750726e53,
  190. 0.265827157478844876804362581101461589032e55,
  191. 0.1196222208654801945619631614956577150644e57,
  192. 0.5502622159812088949850305428800254892962e58,
  193. 0.2586232415111681806429643551536119799692e60,
  194. 0.1241391559253607267086228904737337503852e62,
  195. 0.6082818640342675608722521633212953768876e63,
  196. 0.3041409320171337804361260816606476884438e65,
  197. 0.1551118753287382280224243016469303211063e67,
  198. 0.8065817517094387857166063685640376697529e68,
  199. 0.427488328406002556429801375338939964969e70,
  200. 0.2308436973392413804720927426830275810833e72,
  201. 0.1269640335365827592596510084756651695958e74,
  202. 0.7109985878048634518540456474637249497365e75,
  203. 0.4052691950487721675568060190543232213498e77,
  204. 0.2350561331282878571829474910515074683829e79,
  205. 0.1386831185456898357379390197203894063459e81,
  206. 0.8320987112741390144276341183223364380754e82,
  207. 0.507580213877224798800856812176625227226e84,
  208. 0.3146997326038793752565312235495076408801e86,
  209. 0.1982608315404440064116146708361898137545e88,
  210. 0.1268869321858841641034333893351614808029e90,
  211. 0.8247650592082470666723170306785496252186e91,
  212. 0.5443449390774430640037292402478427526443e93,
  213. 0.3647111091818868528824985909660546442717e95,
  214. 0.2480035542436830599600990418569171581047e97,
  215. 0.1711224524281413113724683388812728390923e99,
  216. 0.1197857166996989179607278372168909873646e101,
  217. 0.8504785885678623175211676442399260102886e102,
  218. 0.6123445837688608686152407038527467274078e104,
  219. 0.4470115461512684340891257138125051110077e106,
  220. 0.3307885441519386412259530282212537821457e108,
  221. 0.2480914081139539809194647711659403366093e110,
  222. 0.188549470166605025498793226086114655823e112,
  223. 0.1451830920282858696340707840863082849837e114,
  224. 0.1132428117820629783145752115873204622873e116,
  225. 0.8946182130782975286851441715398316520698e117,
  226. 0.7156945704626380229481153372318653216558e119,
  227. 0.5797126020747367985879734231578109105412e121,
  228. 0.4753643337012841748421382069894049466438e123,
  229. 0.3945523969720658651189747118012061057144e125,
  230. 0.3314240134565353266999387579130131288001e127,
  231. 0.2817104114380550276949479442260611594801e129,
  232. 0.2422709538367273238176552320344125971528e131,
  233. 0.210775729837952771721360051869938959523e133,
  234. 0.1854826422573984391147968456455462843802e135,
  235. 0.1650795516090846108121691926245361930984e137,
  236. 0.1485715964481761497309522733620825737886e139,
  237. 0.1352001527678402962551665687594951421476e141,
  238. 0.1243841405464130725547532432587355307758e143,
  239. 0.1156772507081641574759205162306240436215e145,
  240. 0.1087366156656743080273652852567866010042e147,
  241. 0.103299784882390592625997020993947270954e149,
  242. 0.9916779348709496892095714015418938011582e150,
  243. 0.9619275968248211985332842594956369871234e152,
  244. 0.942689044888324774562618574305724247381e154,
  245. 0.9332621544394415268169923885626670049072e156,
  246. 0.9332621544394415268169923885626670049072e158,
  247. 0.9425947759838359420851623124482936749562e160,
  248. 0.9614466715035126609268655586972595484554e162,
  249. 0.990290071648618040754671525458177334909e164,
  250. 0.1029901674514562762384858386476504428305e167,
  251. 0.1081396758240290900504101305800329649721e169,
  252. 0.1146280563734708354534347384148349428704e171,
  253. 0.1226520203196137939351751701038733888713e173,
  254. 0.132464181945182897449989183712183259981e175,
  255. 0.1443859583202493582204882102462797533793e177,
  256. 0.1588245541522742940425370312709077287172e179,
  257. 0.1762952551090244663872161047107075788761e181,
  258. 0.1974506857221074023536820372759924883413e183,
  259. 0.2231192748659813646596607021218715118256e185,
  260. 0.2543559733472187557120132004189335234812e187,
  261. 0.2925093693493015690688151804817735520034e189,
  262. 0.339310868445189820119825609358857320324e191,
  263. 0.396993716080872089540195962949863064779e193,
  264. 0.4684525849754290656574312362808384164393e195,
  265. 0.5574585761207605881323431711741977155627e197,
  266. 0.6689502913449127057588118054090372586753e199,
  267. 0.8094298525273443739681622845449350829971e201,
  268. 0.9875044200833601362411579871448208012564e203,
  269. 0.1214630436702532967576624324188129585545e206,
  270. 0.1506141741511140879795014161993280686076e208,
  271. 0.1882677176888926099743767702491600857595e210,
  272. 0.237217324288004688567714730513941708057e212,
  273. 0.3012660018457659544809977077527059692324e214,
  274. 0.3856204823625804217356770659234636406175e216,
  275. 0.4974504222477287440390234150412680963966e218,
  276. 0.6466855489220473672507304395536485253155e220,
  277. 0.8471580690878820510984568758152795681634e222,
  278. 0.1118248651196004307449963076076169029976e225,
  279. 0.1487270706090685728908450891181304809868e227,
  280. 0.1992942746161518876737324194182948445223e229,
  281. 0.269047270731805048359538766214698040105e231,
  282. 0.3659042881952548657689727220519893345429e233,
  283. 0.5012888748274991661034926292112253883237e235,
  284. 0.6917786472619488492228198283114910358867e237,
  285. 0.9615723196941089004197195613529725398826e239,
  286. 0.1346201247571752460587607385894161555836e242,
  287. 0.1898143759076170969428526414110767793728e244,
  288. 0.2695364137888162776588507508037290267094e246,
  289. 0.3854370717180072770521565736493325081944e248,
  290. 0.5550293832739304789551054660550388118e250,
  291. 0.80479260574719919448490292577980627711e252,
  292. 0.1174997204390910823947958271638517164581e255,
  293. 0.1727245890454638911203498659308620231933e257,
  294. 0.2556323917872865588581178015776757943262e259,
  295. 0.380892263763056972698595524350736933546e261,
  296. 0.571338395644585459047893286526105400319e263,
  297. 0.8627209774233240431623188626544191544816e265,
  298. 0.1311335885683452545606724671234717114812e268,
  299. 0.2006343905095682394778288746989117185662e270,
  300. 0.308976961384735088795856467036324046592e272,
  301. 0.4789142901463393876335775239063022722176e274,
  302. 0.7471062926282894447083809372938315446595e276,
  303. 0.1172956879426414428192158071551315525115e279,
  304. 0.1853271869493734796543609753051078529682e281,
  305. 0.2946702272495038326504339507351214862195e283,
  306. 0.4714723635992061322406943211761943779512e285,
  307. 0.7590705053947218729075178570936729485014e287,
  308. 0.1229694218739449434110178928491750176572e290,
  309. 0.2004401576545302577599591653441552787813e292,
  310. 0.3287218585534296227263330311644146572013e294,
  311. 0.5423910666131588774984495014212841843822e296,
  312. 0.9003691705778437366474261723593317460744e298,
  313. 0.1503616514864999040201201707840084015944e301,
  314. 0.2526075744973198387538018869171341146786e303,
  315. 0.4269068009004705274939251888899566538069e305,
  316. 0.7257415615307998967396728211129263114717e307,
  317. }};
  318. #else
  319. static const std::array<double, 171> factorials;
  320. #endif
  321. };
  322. template <bool b>
  323. #ifdef BOOST_MATH_HAVE_CONSTEXPR_TABLES
  324. constexpr std::array<double, 171> unchecked_factorial_data<double, b>::factorials;
  325. #else
  326. const std::array<double, 171> unchecked_factorial_data<double, b>::factorials = {{
  327. 1.0,
  328. 1.0,
  329. 2.0,
  330. 6.0,
  331. 24.0,
  332. 120.0,
  333. 720.0,
  334. 5040.0,
  335. 40320.0,
  336. 362880.0,
  337. 3628800.0,
  338. 39916800.0,
  339. 479001600.0,
  340. 6227020800.0,
  341. 87178291200.0,
  342. 1307674368000.0,
  343. 20922789888000.0,
  344. 355687428096000.0,
  345. 6402373705728000.0,
  346. 121645100408832000.0,
  347. 0.243290200817664e19,
  348. 0.5109094217170944e20,
  349. 0.112400072777760768e22,
  350. 0.2585201673888497664e23,
  351. 0.62044840173323943936e24,
  352. 0.15511210043330985984e26,
  353. 0.403291461126605635584e27,
  354. 0.10888869450418352160768e29,
  355. 0.304888344611713860501504e30,
  356. 0.8841761993739701954543616e31,
  357. 0.26525285981219105863630848e33,
  358. 0.822283865417792281772556288e34,
  359. 0.26313083693369353016721801216e36,
  360. 0.868331761881188649551819440128e37,
  361. 0.29523279903960414084761860964352e39,
  362. 0.103331479663861449296666513375232e41,
  363. 0.3719933267899012174679994481508352e42,
  364. 0.137637530912263450463159795815809024e44,
  365. 0.5230226174666011117600072241000742912e45,
  366. 0.203978820811974433586402817399028973568e47,
  367. 0.815915283247897734345611269596115894272e48,
  368. 0.3345252661316380710817006205344075166515e50,
  369. 0.1405006117752879898543142606244511569936e52,
  370. 0.6041526306337383563735513206851399750726e53,
  371. 0.265827157478844876804362581101461589032e55,
  372. 0.1196222208654801945619631614956577150644e57,
  373. 0.5502622159812088949850305428800254892962e58,
  374. 0.2586232415111681806429643551536119799692e60,
  375. 0.1241391559253607267086228904737337503852e62,
  376. 0.6082818640342675608722521633212953768876e63,
  377. 0.3041409320171337804361260816606476884438e65,
  378. 0.1551118753287382280224243016469303211063e67,
  379. 0.8065817517094387857166063685640376697529e68,
  380. 0.427488328406002556429801375338939964969e70,
  381. 0.2308436973392413804720927426830275810833e72,
  382. 0.1269640335365827592596510084756651695958e74,
  383. 0.7109985878048634518540456474637249497365e75,
  384. 0.4052691950487721675568060190543232213498e77,
  385. 0.2350561331282878571829474910515074683829e79,
  386. 0.1386831185456898357379390197203894063459e81,
  387. 0.8320987112741390144276341183223364380754e82,
  388. 0.507580213877224798800856812176625227226e84,
  389. 0.3146997326038793752565312235495076408801e86,
  390. 0.1982608315404440064116146708361898137545e88,
  391. 0.1268869321858841641034333893351614808029e90,
  392. 0.8247650592082470666723170306785496252186e91,
  393. 0.5443449390774430640037292402478427526443e93,
  394. 0.3647111091818868528824985909660546442717e95,
  395. 0.2480035542436830599600990418569171581047e97,
  396. 0.1711224524281413113724683388812728390923e99,
  397. 0.1197857166996989179607278372168909873646e101,
  398. 0.8504785885678623175211676442399260102886e102,
  399. 0.6123445837688608686152407038527467274078e104,
  400. 0.4470115461512684340891257138125051110077e106,
  401. 0.3307885441519386412259530282212537821457e108,
  402. 0.2480914081139539809194647711659403366093e110,
  403. 0.188549470166605025498793226086114655823e112,
  404. 0.1451830920282858696340707840863082849837e114,
  405. 0.1132428117820629783145752115873204622873e116,
  406. 0.8946182130782975286851441715398316520698e117,
  407. 0.7156945704626380229481153372318653216558e119,
  408. 0.5797126020747367985879734231578109105412e121,
  409. 0.4753643337012841748421382069894049466438e123,
  410. 0.3945523969720658651189747118012061057144e125,
  411. 0.3314240134565353266999387579130131288001e127,
  412. 0.2817104114380550276949479442260611594801e129,
  413. 0.2422709538367273238176552320344125971528e131,
  414. 0.210775729837952771721360051869938959523e133,
  415. 0.1854826422573984391147968456455462843802e135,
  416. 0.1650795516090846108121691926245361930984e137,
  417. 0.1485715964481761497309522733620825737886e139,
  418. 0.1352001527678402962551665687594951421476e141,
  419. 0.1243841405464130725547532432587355307758e143,
  420. 0.1156772507081641574759205162306240436215e145,
  421. 0.1087366156656743080273652852567866010042e147,
  422. 0.103299784882390592625997020993947270954e149,
  423. 0.9916779348709496892095714015418938011582e150,
  424. 0.9619275968248211985332842594956369871234e152,
  425. 0.942689044888324774562618574305724247381e154,
  426. 0.9332621544394415268169923885626670049072e156,
  427. 0.9332621544394415268169923885626670049072e158,
  428. 0.9425947759838359420851623124482936749562e160,
  429. 0.9614466715035126609268655586972595484554e162,
  430. 0.990290071648618040754671525458177334909e164,
  431. 0.1029901674514562762384858386476504428305e167,
  432. 0.1081396758240290900504101305800329649721e169,
  433. 0.1146280563734708354534347384148349428704e171,
  434. 0.1226520203196137939351751701038733888713e173,
  435. 0.132464181945182897449989183712183259981e175,
  436. 0.1443859583202493582204882102462797533793e177,
  437. 0.1588245541522742940425370312709077287172e179,
  438. 0.1762952551090244663872161047107075788761e181,
  439. 0.1974506857221074023536820372759924883413e183,
  440. 0.2231192748659813646596607021218715118256e185,
  441. 0.2543559733472187557120132004189335234812e187,
  442. 0.2925093693493015690688151804817735520034e189,
  443. 0.339310868445189820119825609358857320324e191,
  444. 0.396993716080872089540195962949863064779e193,
  445. 0.4684525849754290656574312362808384164393e195,
  446. 0.5574585761207605881323431711741977155627e197,
  447. 0.6689502913449127057588118054090372586753e199,
  448. 0.8094298525273443739681622845449350829971e201,
  449. 0.9875044200833601362411579871448208012564e203,
  450. 0.1214630436702532967576624324188129585545e206,
  451. 0.1506141741511140879795014161993280686076e208,
  452. 0.1882677176888926099743767702491600857595e210,
  453. 0.237217324288004688567714730513941708057e212,
  454. 0.3012660018457659544809977077527059692324e214,
  455. 0.3856204823625804217356770659234636406175e216,
  456. 0.4974504222477287440390234150412680963966e218,
  457. 0.6466855489220473672507304395536485253155e220,
  458. 0.8471580690878820510984568758152795681634e222,
  459. 0.1118248651196004307449963076076169029976e225,
  460. 0.1487270706090685728908450891181304809868e227,
  461. 0.1992942746161518876737324194182948445223e229,
  462. 0.269047270731805048359538766214698040105e231,
  463. 0.3659042881952548657689727220519893345429e233,
  464. 0.5012888748274991661034926292112253883237e235,
  465. 0.6917786472619488492228198283114910358867e237,
  466. 0.9615723196941089004197195613529725398826e239,
  467. 0.1346201247571752460587607385894161555836e242,
  468. 0.1898143759076170969428526414110767793728e244,
  469. 0.2695364137888162776588507508037290267094e246,
  470. 0.3854370717180072770521565736493325081944e248,
  471. 0.5550293832739304789551054660550388118e250,
  472. 0.80479260574719919448490292577980627711e252,
  473. 0.1174997204390910823947958271638517164581e255,
  474. 0.1727245890454638911203498659308620231933e257,
  475. 0.2556323917872865588581178015776757943262e259,
  476. 0.380892263763056972698595524350736933546e261,
  477. 0.571338395644585459047893286526105400319e263,
  478. 0.8627209774233240431623188626544191544816e265,
  479. 0.1311335885683452545606724671234717114812e268,
  480. 0.2006343905095682394778288746989117185662e270,
  481. 0.308976961384735088795856467036324046592e272,
  482. 0.4789142901463393876335775239063022722176e274,
  483. 0.7471062926282894447083809372938315446595e276,
  484. 0.1172956879426414428192158071551315525115e279,
  485. 0.1853271869493734796543609753051078529682e281,
  486. 0.2946702272495038326504339507351214862195e283,
  487. 0.4714723635992061322406943211761943779512e285,
  488. 0.7590705053947218729075178570936729485014e287,
  489. 0.1229694218739449434110178928491750176572e290,
  490. 0.2004401576545302577599591653441552787813e292,
  491. 0.3287218585534296227263330311644146572013e294,
  492. 0.5423910666131588774984495014212841843822e296,
  493. 0.9003691705778437366474261723593317460744e298,
  494. 0.1503616514864999040201201707840084015944e301,
  495. 0.2526075744973198387538018869171341146786e303,
  496. 0.4269068009004705274939251888899566538069e305,
  497. 0.7257415615307998967396728211129263114717e307,
  498. }};
  499. #endif
  500. template <>
  501. inline BOOST_MATH_CONSTEXPR_TABLE_FUNCTION double unchecked_factorial<double>(unsigned i BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE_SPEC(double))
  502. {
  503. return unchecked_factorial_data<double>::factorials[i];
  504. }
  505. template <>
  506. struct max_factorial<double>
  507. {
  508. static constexpr unsigned value = 170;
  509. };
  510. template <bool b>
  511. struct unchecked_factorial_data<long double, b>
  512. {
  513. #ifdef BOOST_MATH_HAVE_CONSTEXPR_TABLES
  514. static constexpr std::array<long double, 171> factorials = { {
  515. 1L,
  516. 1L,
  517. 2L,
  518. 6L,
  519. 24L,
  520. 120L,
  521. 720L,
  522. 5040L,
  523. 40320L,
  524. 362880.0L,
  525. 3628800.0L,
  526. 39916800.0L,
  527. 479001600.0L,
  528. 6227020800.0L,
  529. 87178291200.0L,
  530. 1307674368000.0L,
  531. 20922789888000.0L,
  532. 355687428096000.0L,
  533. 6402373705728000.0L,
  534. 121645100408832000.0L,
  535. 0.243290200817664e19L,
  536. 0.5109094217170944e20L,
  537. 0.112400072777760768e22L,
  538. 0.2585201673888497664e23L,
  539. 0.62044840173323943936e24L,
  540. 0.15511210043330985984e26L,
  541. 0.403291461126605635584e27L,
  542. 0.10888869450418352160768e29L,
  543. 0.304888344611713860501504e30L,
  544. 0.8841761993739701954543616e31L,
  545. 0.26525285981219105863630848e33L,
  546. 0.822283865417792281772556288e34L,
  547. 0.26313083693369353016721801216e36L,
  548. 0.868331761881188649551819440128e37L,
  549. 0.29523279903960414084761860964352e39L,
  550. 0.103331479663861449296666513375232e41L,
  551. 0.3719933267899012174679994481508352e42L,
  552. 0.137637530912263450463159795815809024e44L,
  553. 0.5230226174666011117600072241000742912e45L,
  554. 0.203978820811974433586402817399028973568e47L,
  555. 0.815915283247897734345611269596115894272e48L,
  556. 0.3345252661316380710817006205344075166515e50L,
  557. 0.1405006117752879898543142606244511569936e52L,
  558. 0.6041526306337383563735513206851399750726e53L,
  559. 0.265827157478844876804362581101461589032e55L,
  560. 0.1196222208654801945619631614956577150644e57L,
  561. 0.5502622159812088949850305428800254892962e58L,
  562. 0.2586232415111681806429643551536119799692e60L,
  563. 0.1241391559253607267086228904737337503852e62L,
  564. 0.6082818640342675608722521633212953768876e63L,
  565. 0.3041409320171337804361260816606476884438e65L,
  566. 0.1551118753287382280224243016469303211063e67L,
  567. 0.8065817517094387857166063685640376697529e68L,
  568. 0.427488328406002556429801375338939964969e70L,
  569. 0.2308436973392413804720927426830275810833e72L,
  570. 0.1269640335365827592596510084756651695958e74L,
  571. 0.7109985878048634518540456474637249497365e75L,
  572. 0.4052691950487721675568060190543232213498e77L,
  573. 0.2350561331282878571829474910515074683829e79L,
  574. 0.1386831185456898357379390197203894063459e81L,
  575. 0.8320987112741390144276341183223364380754e82L,
  576. 0.507580213877224798800856812176625227226e84L,
  577. 0.3146997326038793752565312235495076408801e86L,
  578. 0.1982608315404440064116146708361898137545e88L,
  579. 0.1268869321858841641034333893351614808029e90L,
  580. 0.8247650592082470666723170306785496252186e91L,
  581. 0.5443449390774430640037292402478427526443e93L,
  582. 0.3647111091818868528824985909660546442717e95L,
  583. 0.2480035542436830599600990418569171581047e97L,
  584. 0.1711224524281413113724683388812728390923e99L,
  585. 0.1197857166996989179607278372168909873646e101L,
  586. 0.8504785885678623175211676442399260102886e102L,
  587. 0.6123445837688608686152407038527467274078e104L,
  588. 0.4470115461512684340891257138125051110077e106L,
  589. 0.3307885441519386412259530282212537821457e108L,
  590. 0.2480914081139539809194647711659403366093e110L,
  591. 0.188549470166605025498793226086114655823e112L,
  592. 0.1451830920282858696340707840863082849837e114L,
  593. 0.1132428117820629783145752115873204622873e116L,
  594. 0.8946182130782975286851441715398316520698e117L,
  595. 0.7156945704626380229481153372318653216558e119L,
  596. 0.5797126020747367985879734231578109105412e121L,
  597. 0.4753643337012841748421382069894049466438e123L,
  598. 0.3945523969720658651189747118012061057144e125L,
  599. 0.3314240134565353266999387579130131288001e127L,
  600. 0.2817104114380550276949479442260611594801e129L,
  601. 0.2422709538367273238176552320344125971528e131L,
  602. 0.210775729837952771721360051869938959523e133L,
  603. 0.1854826422573984391147968456455462843802e135L,
  604. 0.1650795516090846108121691926245361930984e137L,
  605. 0.1485715964481761497309522733620825737886e139L,
  606. 0.1352001527678402962551665687594951421476e141L,
  607. 0.1243841405464130725547532432587355307758e143L,
  608. 0.1156772507081641574759205162306240436215e145L,
  609. 0.1087366156656743080273652852567866010042e147L,
  610. 0.103299784882390592625997020993947270954e149L,
  611. 0.9916779348709496892095714015418938011582e150L,
  612. 0.9619275968248211985332842594956369871234e152L,
  613. 0.942689044888324774562618574305724247381e154L,
  614. 0.9332621544394415268169923885626670049072e156L,
  615. 0.9332621544394415268169923885626670049072e158L,
  616. 0.9425947759838359420851623124482936749562e160L,
  617. 0.9614466715035126609268655586972595484554e162L,
  618. 0.990290071648618040754671525458177334909e164L,
  619. 0.1029901674514562762384858386476504428305e167L,
  620. 0.1081396758240290900504101305800329649721e169L,
  621. 0.1146280563734708354534347384148349428704e171L,
  622. 0.1226520203196137939351751701038733888713e173L,
  623. 0.132464181945182897449989183712183259981e175L,
  624. 0.1443859583202493582204882102462797533793e177L,
  625. 0.1588245541522742940425370312709077287172e179L,
  626. 0.1762952551090244663872161047107075788761e181L,
  627. 0.1974506857221074023536820372759924883413e183L,
  628. 0.2231192748659813646596607021218715118256e185L,
  629. 0.2543559733472187557120132004189335234812e187L,
  630. 0.2925093693493015690688151804817735520034e189L,
  631. 0.339310868445189820119825609358857320324e191L,
  632. 0.396993716080872089540195962949863064779e193L,
  633. 0.4684525849754290656574312362808384164393e195L,
  634. 0.5574585761207605881323431711741977155627e197L,
  635. 0.6689502913449127057588118054090372586753e199L,
  636. 0.8094298525273443739681622845449350829971e201L,
  637. 0.9875044200833601362411579871448208012564e203L,
  638. 0.1214630436702532967576624324188129585545e206L,
  639. 0.1506141741511140879795014161993280686076e208L,
  640. 0.1882677176888926099743767702491600857595e210L,
  641. 0.237217324288004688567714730513941708057e212L,
  642. 0.3012660018457659544809977077527059692324e214L,
  643. 0.3856204823625804217356770659234636406175e216L,
  644. 0.4974504222477287440390234150412680963966e218L,
  645. 0.6466855489220473672507304395536485253155e220L,
  646. 0.8471580690878820510984568758152795681634e222L,
  647. 0.1118248651196004307449963076076169029976e225L,
  648. 0.1487270706090685728908450891181304809868e227L,
  649. 0.1992942746161518876737324194182948445223e229L,
  650. 0.269047270731805048359538766214698040105e231L,
  651. 0.3659042881952548657689727220519893345429e233L,
  652. 0.5012888748274991661034926292112253883237e235L,
  653. 0.6917786472619488492228198283114910358867e237L,
  654. 0.9615723196941089004197195613529725398826e239L,
  655. 0.1346201247571752460587607385894161555836e242L,
  656. 0.1898143759076170969428526414110767793728e244L,
  657. 0.2695364137888162776588507508037290267094e246L,
  658. 0.3854370717180072770521565736493325081944e248L,
  659. 0.5550293832739304789551054660550388118e250L,
  660. 0.80479260574719919448490292577980627711e252L,
  661. 0.1174997204390910823947958271638517164581e255L,
  662. 0.1727245890454638911203498659308620231933e257L,
  663. 0.2556323917872865588581178015776757943262e259L,
  664. 0.380892263763056972698595524350736933546e261L,
  665. 0.571338395644585459047893286526105400319e263L,
  666. 0.8627209774233240431623188626544191544816e265L,
  667. 0.1311335885683452545606724671234717114812e268L,
  668. 0.2006343905095682394778288746989117185662e270L,
  669. 0.308976961384735088795856467036324046592e272L,
  670. 0.4789142901463393876335775239063022722176e274L,
  671. 0.7471062926282894447083809372938315446595e276L,
  672. 0.1172956879426414428192158071551315525115e279L,
  673. 0.1853271869493734796543609753051078529682e281L,
  674. 0.2946702272495038326504339507351214862195e283L,
  675. 0.4714723635992061322406943211761943779512e285L,
  676. 0.7590705053947218729075178570936729485014e287L,
  677. 0.1229694218739449434110178928491750176572e290L,
  678. 0.2004401576545302577599591653441552787813e292L,
  679. 0.3287218585534296227263330311644146572013e294L,
  680. 0.5423910666131588774984495014212841843822e296L,
  681. 0.9003691705778437366474261723593317460744e298L,
  682. 0.1503616514864999040201201707840084015944e301L,
  683. 0.2526075744973198387538018869171341146786e303L,
  684. 0.4269068009004705274939251888899566538069e305L,
  685. 0.7257415615307998967396728211129263114717e307L,
  686. }};
  687. #else
  688. static const std::array<long double, 171> factorials;
  689. #endif
  690. };
  691. template <bool b>
  692. #ifdef BOOST_MATH_HAVE_CONSTEXPR_TABLES
  693. constexpr std::array<long double, 171> unchecked_factorial_data<long double, b>::factorials;
  694. #else
  695. const std::array<long double, 171> unchecked_factorial_data<long double, b>::factorials = {{
  696. 1L,
  697. 1L,
  698. 2L,
  699. 6L,
  700. 24L,
  701. 120L,
  702. 720L,
  703. 5040L,
  704. 40320L,
  705. 362880.0L,
  706. 3628800.0L,
  707. 39916800.0L,
  708. 479001600.0L,
  709. 6227020800.0L,
  710. 87178291200.0L,
  711. 1307674368000.0L,
  712. 20922789888000.0L,
  713. 355687428096000.0L,
  714. 6402373705728000.0L,
  715. 121645100408832000.0L,
  716. 0.243290200817664e19L,
  717. 0.5109094217170944e20L,
  718. 0.112400072777760768e22L,
  719. 0.2585201673888497664e23L,
  720. 0.62044840173323943936e24L,
  721. 0.15511210043330985984e26L,
  722. 0.403291461126605635584e27L,
  723. 0.10888869450418352160768e29L,
  724. 0.304888344611713860501504e30L,
  725. 0.8841761993739701954543616e31L,
  726. 0.26525285981219105863630848e33L,
  727. 0.822283865417792281772556288e34L,
  728. 0.26313083693369353016721801216e36L,
  729. 0.868331761881188649551819440128e37L,
  730. 0.29523279903960414084761860964352e39L,
  731. 0.103331479663861449296666513375232e41L,
  732. 0.3719933267899012174679994481508352e42L,
  733. 0.137637530912263450463159795815809024e44L,
  734. 0.5230226174666011117600072241000742912e45L,
  735. 0.203978820811974433586402817399028973568e47L,
  736. 0.815915283247897734345611269596115894272e48L,
  737. 0.3345252661316380710817006205344075166515e50L,
  738. 0.1405006117752879898543142606244511569936e52L,
  739. 0.6041526306337383563735513206851399750726e53L,
  740. 0.265827157478844876804362581101461589032e55L,
  741. 0.1196222208654801945619631614956577150644e57L,
  742. 0.5502622159812088949850305428800254892962e58L,
  743. 0.2586232415111681806429643551536119799692e60L,
  744. 0.1241391559253607267086228904737337503852e62L,
  745. 0.6082818640342675608722521633212953768876e63L,
  746. 0.3041409320171337804361260816606476884438e65L,
  747. 0.1551118753287382280224243016469303211063e67L,
  748. 0.8065817517094387857166063685640376697529e68L,
  749. 0.427488328406002556429801375338939964969e70L,
  750. 0.2308436973392413804720927426830275810833e72L,
  751. 0.1269640335365827592596510084756651695958e74L,
  752. 0.7109985878048634518540456474637249497365e75L,
  753. 0.4052691950487721675568060190543232213498e77L,
  754. 0.2350561331282878571829474910515074683829e79L,
  755. 0.1386831185456898357379390197203894063459e81L,
  756. 0.8320987112741390144276341183223364380754e82L,
  757. 0.507580213877224798800856812176625227226e84L,
  758. 0.3146997326038793752565312235495076408801e86L,
  759. 0.1982608315404440064116146708361898137545e88L,
  760. 0.1268869321858841641034333893351614808029e90L,
  761. 0.8247650592082470666723170306785496252186e91L,
  762. 0.5443449390774430640037292402478427526443e93L,
  763. 0.3647111091818868528824985909660546442717e95L,
  764. 0.2480035542436830599600990418569171581047e97L,
  765. 0.1711224524281413113724683388812728390923e99L,
  766. 0.1197857166996989179607278372168909873646e101L,
  767. 0.8504785885678623175211676442399260102886e102L,
  768. 0.6123445837688608686152407038527467274078e104L,
  769. 0.4470115461512684340891257138125051110077e106L,
  770. 0.3307885441519386412259530282212537821457e108L,
  771. 0.2480914081139539809194647711659403366093e110L,
  772. 0.188549470166605025498793226086114655823e112L,
  773. 0.1451830920282858696340707840863082849837e114L,
  774. 0.1132428117820629783145752115873204622873e116L,
  775. 0.8946182130782975286851441715398316520698e117L,
  776. 0.7156945704626380229481153372318653216558e119L,
  777. 0.5797126020747367985879734231578109105412e121L,
  778. 0.4753643337012841748421382069894049466438e123L,
  779. 0.3945523969720658651189747118012061057144e125L,
  780. 0.3314240134565353266999387579130131288001e127L,
  781. 0.2817104114380550276949479442260611594801e129L,
  782. 0.2422709538367273238176552320344125971528e131L,
  783. 0.210775729837952771721360051869938959523e133L,
  784. 0.1854826422573984391147968456455462843802e135L,
  785. 0.1650795516090846108121691926245361930984e137L,
  786. 0.1485715964481761497309522733620825737886e139L,
  787. 0.1352001527678402962551665687594951421476e141L,
  788. 0.1243841405464130725547532432587355307758e143L,
  789. 0.1156772507081641574759205162306240436215e145L,
  790. 0.1087366156656743080273652852567866010042e147L,
  791. 0.103299784882390592625997020993947270954e149L,
  792. 0.9916779348709496892095714015418938011582e150L,
  793. 0.9619275968248211985332842594956369871234e152L,
  794. 0.942689044888324774562618574305724247381e154L,
  795. 0.9332621544394415268169923885626670049072e156L,
  796. 0.9332621544394415268169923885626670049072e158L,
  797. 0.9425947759838359420851623124482936749562e160L,
  798. 0.9614466715035126609268655586972595484554e162L,
  799. 0.990290071648618040754671525458177334909e164L,
  800. 0.1029901674514562762384858386476504428305e167L,
  801. 0.1081396758240290900504101305800329649721e169L,
  802. 0.1146280563734708354534347384148349428704e171L,
  803. 0.1226520203196137939351751701038733888713e173L,
  804. 0.132464181945182897449989183712183259981e175L,
  805. 0.1443859583202493582204882102462797533793e177L,
  806. 0.1588245541522742940425370312709077287172e179L,
  807. 0.1762952551090244663872161047107075788761e181L,
  808. 0.1974506857221074023536820372759924883413e183L,
  809. 0.2231192748659813646596607021218715118256e185L,
  810. 0.2543559733472187557120132004189335234812e187L,
  811. 0.2925093693493015690688151804817735520034e189L,
  812. 0.339310868445189820119825609358857320324e191L,
  813. 0.396993716080872089540195962949863064779e193L,
  814. 0.4684525849754290656574312362808384164393e195L,
  815. 0.5574585761207605881323431711741977155627e197L,
  816. 0.6689502913449127057588118054090372586753e199L,
  817. 0.8094298525273443739681622845449350829971e201L,
  818. 0.9875044200833601362411579871448208012564e203L,
  819. 0.1214630436702532967576624324188129585545e206L,
  820. 0.1506141741511140879795014161993280686076e208L,
  821. 0.1882677176888926099743767702491600857595e210L,
  822. 0.237217324288004688567714730513941708057e212L,
  823. 0.3012660018457659544809977077527059692324e214L,
  824. 0.3856204823625804217356770659234636406175e216L,
  825. 0.4974504222477287440390234150412680963966e218L,
  826. 0.6466855489220473672507304395536485253155e220L,
  827. 0.8471580690878820510984568758152795681634e222L,
  828. 0.1118248651196004307449963076076169029976e225L,
  829. 0.1487270706090685728908450891181304809868e227L,
  830. 0.1992942746161518876737324194182948445223e229L,
  831. 0.269047270731805048359538766214698040105e231L,
  832. 0.3659042881952548657689727220519893345429e233L,
  833. 0.5012888748274991661034926292112253883237e235L,
  834. 0.6917786472619488492228198283114910358867e237L,
  835. 0.9615723196941089004197195613529725398826e239L,
  836. 0.1346201247571752460587607385894161555836e242L,
  837. 0.1898143759076170969428526414110767793728e244L,
  838. 0.2695364137888162776588507508037290267094e246L,
  839. 0.3854370717180072770521565736493325081944e248L,
  840. 0.5550293832739304789551054660550388118e250L,
  841. 0.80479260574719919448490292577980627711e252L,
  842. 0.1174997204390910823947958271638517164581e255L,
  843. 0.1727245890454638911203498659308620231933e257L,
  844. 0.2556323917872865588581178015776757943262e259L,
  845. 0.380892263763056972698595524350736933546e261L,
  846. 0.571338395644585459047893286526105400319e263L,
  847. 0.8627209774233240431623188626544191544816e265L,
  848. 0.1311335885683452545606724671234717114812e268L,
  849. 0.2006343905095682394778288746989117185662e270L,
  850. 0.308976961384735088795856467036324046592e272L,
  851. 0.4789142901463393876335775239063022722176e274L,
  852. 0.7471062926282894447083809372938315446595e276L,
  853. 0.1172956879426414428192158071551315525115e279L,
  854. 0.1853271869493734796543609753051078529682e281L,
  855. 0.2946702272495038326504339507351214862195e283L,
  856. 0.4714723635992061322406943211761943779512e285L,
  857. 0.7590705053947218729075178570936729485014e287L,
  858. 0.1229694218739449434110178928491750176572e290L,
  859. 0.2004401576545302577599591653441552787813e292L,
  860. 0.3287218585534296227263330311644146572013e294L,
  861. 0.5423910666131588774984495014212841843822e296L,
  862. 0.9003691705778437366474261723593317460744e298L,
  863. 0.1503616514864999040201201707840084015944e301L,
  864. 0.2526075744973198387538018869171341146786e303L,
  865. 0.4269068009004705274939251888899566538069e305L,
  866. 0.7257415615307998967396728211129263114717e307L,
  867. }};
  868. #endif
  869. template <>
  870. inline BOOST_MATH_CONSTEXPR_TABLE_FUNCTION long double unchecked_factorial<long double>(unsigned i BOOST_MATH_APPEND_EXPLICIT_TEMPLATE_TYPE_SPEC(long double))
  871. {
  872. return unchecked_factorial_data<long double>::factorials[i];
  873. }
  874. template <>
  875. struct max_factorial<long double>
  876. {
  877. static constexpr unsigned value = 170;
  878. };
  879. #ifdef BOOST_MATH_USE_FLOAT128
  880. template <bool b>
  881. struct unchecked_factorial_data<BOOST_MATH_FLOAT128_TYPE, b>
  882. {
  883. #ifdef BOOST_MATH_HAVE_CONSTEXPR_TABLES
  884. static constexpr std::array<BOOST_MATH_FLOAT128_TYPE, 171> factorials = { {
  885. 1,
  886. 1,
  887. 2,
  888. 6,
  889. 24,
  890. 120,
  891. 720,
  892. 5040,
  893. 40320,
  894. 362880.0Q,
  895. 3628800.0Q,
  896. 39916800.0Q,
  897. 479001600.0Q,
  898. 6227020800.0Q,
  899. 87178291200.0Q,
  900. 1307674368000.0Q,
  901. 20922789888000.0Q,
  902. 355687428096000.0Q,
  903. 6402373705728000.0Q,
  904. 121645100408832000.0Q,
  905. 0.243290200817664e19Q,
  906. 0.5109094217170944e20Q,
  907. 0.112400072777760768e22Q,
  908. 0.2585201673888497664e23Q,
  909. 0.62044840173323943936e24Q,
  910. 0.15511210043330985984e26Q,
  911. 0.403291461126605635584e27Q,
  912. 0.10888869450418352160768e29Q,
  913. 0.304888344611713860501504e30Q,
  914. 0.8841761993739701954543616e31Q,
  915. 0.26525285981219105863630848e33Q,
  916. 0.822283865417792281772556288e34Q,
  917. 0.26313083693369353016721801216e36Q,
  918. 0.868331761881188649551819440128e37Q,
  919. 0.29523279903960414084761860964352e39Q,
  920. 0.103331479663861449296666513375232e41Q,
  921. 0.3719933267899012174679994481508352e42Q,
  922. 0.137637530912263450463159795815809024e44Q,
  923. 0.5230226174666011117600072241000742912e45Q,
  924. 0.203978820811974433586402817399028973568e47Q,
  925. 0.815915283247897734345611269596115894272e48Q,
  926. 0.3345252661316380710817006205344075166515e50Q,
  927. 0.1405006117752879898543142606244511569936e52Q,
  928. 0.6041526306337383563735513206851399750726e53Q,
  929. 0.265827157478844876804362581101461589032e55Q,
  930. 0.1196222208654801945619631614956577150644e57Q,
  931. 0.5502622159812088949850305428800254892962e58Q,
  932. 0.2586232415111681806429643551536119799692e60Q,
  933. 0.1241391559253607267086228904737337503852e62Q,
  934. 0.6082818640342675608722521633212953768876e63Q,
  935. 0.3041409320171337804361260816606476884438e65Q,
  936. 0.1551118753287382280224243016469303211063e67Q,
  937. 0.8065817517094387857166063685640376697529e68Q,
  938. 0.427488328406002556429801375338939964969e70Q,
  939. 0.2308436973392413804720927426830275810833e72Q,
  940. 0.1269640335365827592596510084756651695958e74Q,
  941. 0.7109985878048634518540456474637249497365e75Q,
  942. 0.4052691950487721675568060190543232213498e77Q,
  943. 0.2350561331282878571829474910515074683829e79Q,
  944. 0.1386831185456898357379390197203894063459e81Q,
  945. 0.8320987112741390144276341183223364380754e82Q,
  946. 0.507580213877224798800856812176625227226e84Q,
  947. 0.3146997326038793752565312235495076408801e86Q,
  948. 0.1982608315404440064116146708361898137545e88Q,
  949. 0.1268869321858841641034333893351614808029e90Q,
  950. 0.8247650592082470666723170306785496252186e91Q,
  951. 0.5443449390774430640037292402478427526443e93Q,
  952. 0.3647111091818868528824985909660546442717e95Q,
  953. 0.2480035542436830599600990418569171581047e97Q,
  954. 0.1711224524281413113724683388812728390923e99Q,
  955. 0.1197857166996989179607278372168909873646e101Q,
  956. 0.8504785885678623175211676442399260102886e102Q,
  957. 0.6123445837688608686152407038527467274078e104Q,
  958. 0.4470115461512684340891257138125051110077e106Q,
  959. 0.3307885441519386412259530282212537821457e108Q,
  960. 0.2480914081139539809194647711659403366093e110Q,
  961. 0.188549470166605025498793226086114655823e112Q,
  962. 0.1451830920282858696340707840863082849837e114Q,
  963. 0.1132428117820629783145752115873204622873e116Q,
  964. 0.8946182130782975286851441715398316520698e117Q,
  965. 0.7156945704626380229481153372318653216558e119Q,
  966. 0.5797126020747367985879734231578109105412e121Q,
  967. 0.4753643337012841748421382069894049466438e123Q,
  968. 0.3945523969720658651189747118012061057144e125Q,
  969. 0.3314240134565353266999387579130131288001e127Q,
  970. 0.2817104114380550276949479442260611594801e129Q,
  971. 0.2422709538367273238176552320344125971528e131Q,
  972. 0.210775729837952771721360051869938959523e133Q,
  973. 0.1854826422573984391147968456455462843802e135Q,
  974. 0.1650795516090846108121691926245361930984e137Q,
  975. 0.1485715964481761497309522733620825737886e139Q,
  976. 0.1352001527678402962551665687594951421476e141Q,
  977. 0.1243841405464130725547532432587355307758e143Q,
  978. 0.1156772507081641574759205162306240436215e145Q,
  979. 0.1087366156656743080273652852567866010042e147Q,
  980. 0.103299784882390592625997020993947270954e149Q,
  981. 0.9916779348709496892095714015418938011582e150Q,
  982. 0.9619275968248211985332842594956369871234e152Q,
  983. 0.942689044888324774562618574305724247381e154Q,
  984. 0.9332621544394415268169923885626670049072e156Q,
  985. 0.9332621544394415268169923885626670049072e158Q,
  986. 0.9425947759838359420851623124482936749562e160Q,
  987. 0.9614466715035126609268655586972595484554e162Q,
  988. 0.990290071648618040754671525458177334909e164Q,
  989. 0.1029901674514562762384858386476504428305e167Q,
  990. 0.1081396758240290900504101305800329649721e169Q,
  991. 0.1146280563734708354534347384148349428704e171Q,
  992. 0.1226520203196137939351751701038733888713e173Q,
  993. 0.132464181945182897449989183712183259981e175Q,
  994. 0.1443859583202493582204882102462797533793e177Q,
  995. 0.1588245541522742940425370312709077287172e179Q,
  996. 0.1762952551090244663872161047107075788761e181Q,
  997. 0.1974506857221074023536820372759924883413e183Q,
  998. 0.2231192748659813646596607021218715118256e185Q,
  999. 0.2543559733472187557120132004189335234812e187Q,
  1000. 0.2925093693493015690688151804817735520034e189Q,
  1001. 0.339310868445189820119825609358857320324e191Q,
  1002. 0.396993716080872089540195962949863064779e193Q,
  1003. 0.4684525849754290656574312362808384164393e195Q,
  1004. 0.5574585761207605881323431711741977155627e197Q,
  1005. 0.6689502913449127057588118054090372586753e199Q,
  1006. 0.8094298525273443739681622845449350829971e201Q,
  1007. 0.9875044200833601362411579871448208012564e203Q,
  1008. 0.1214630436702532967576624324188129585545e206Q,
  1009. 0.1506141741511140879795014161993280686076e208Q,
  1010. 0.1882677176888926099743767702491600857595e210Q,
  1011. 0.237217324288004688567714730513941708057e212Q,
  1012. 0.3012660018457659544809977077527059692324e214Q,
  1013. 0.3856204823625804217356770659234636406175e216Q,
  1014. 0.4974504222477287440390234150412680963966e218Q,
  1015. 0.6466855489220473672507304395536485253155e220Q,
  1016. 0.8471580690878820510984568758152795681634e222Q,
  1017. 0.1118248651196004307449963076076169029976e225Q,
  1018. 0.1487270706090685728908450891181304809868e227Q,
  1019. 0.1992942746161518876737324194182948445223e229Q,
  1020. 0.269047270731805048359538766214698040105e231Q,
  1021. 0.3659042881952548657689727220519893345429e233Q,
  1022. 0.5012888748274991661034926292112253883237e235Q,
  1023. 0.6917786472619488492228198283114910358867e237Q,
  1024. 0.9615723196941089004197195613529725398826e239Q,
  1025. 0.1346201247571752460587607385894161555836e242Q,
  1026. 0.1898143759076170969428526414110767793728e244Q,
  1027. 0.2695364137888162776588507508037290267094e246Q,
  1028. 0.3854370717180072770521565736493325081944e248Q,
  1029. 0.5550293832739304789551054660550388118e250Q,
  1030. 0.80479260574719919448490292577980627711e252Q,
  1031. 0.1174997204390910823947958271638517164581e255Q,
  1032. 0.1727245890454638911203498659308620231933e257Q,
  1033. 0.2556323917872865588581178015776757943262e259Q,
  1034. 0.380892263763056972698595524350736933546e261Q,
  1035. 0.571338395644585459047893286526105400319e263Q,
  1036. 0.8627209774233240431623188626544191544816e265Q,
  1037. 0.1311335885683452545606724671234717114812e268Q,
  1038. 0.2006343905095682394778288746989117185662e270Q,
  1039. 0.308976961384735088795856467036324046592e272Q,
  1040. 0.4789142901463393876335775239063022722176e274Q,
  1041. 0.7471062926282894447083809372938315446595e276Q,
  1042. 0.1172956879426414428192158071551315525115e279Q,
  1043. 0.1853271869493734796543609753051078529682e281Q,
  1044. 0.2946702272495038326504339507351214862195e283Q,
  1045. 0.4714723635992061322406943211761943779512e285Q,
  1046. 0.7590705053947218729075178570936729485014e287Q,
  1047. 0.1229694218739449434110178928491750176572e290Q,
  1048. 0.2004401576545302577599591653441552787813e292Q,
  1049. 0.3287218585534296227263330311644146572013e294Q,
  1050. 0.5423910666131588774984495014212841843822e296Q,
  1051. 0.9003691705778437366474261723593317460744e298Q,
  1052. 0.1503616514864999040201201707840084015944e301Q,
  1053. 0.2526075744973198387538018869171341146786e303Q,
  1054. 0.4269068009004705274939251888899566538069e305Q,
  1055. 0.7257415615307998967396728211129263114717e307Q,
  1056. } };
  1057. #else
  1058. static const std::array<BOOST_MATH_FLOAT128_TYPE, 171> factorials;
  1059. #endif
  1060. };
  1061. template <bool b>
  1062. #ifdef BOOST_MATH_HAVE_CONSTEXPR_TABLES
  1063. constexpr std::array<BOOST_MATH_FLOAT128_TYPE, 171> unchecked_factorial_data<BOOST_MATH_FLOAT128_TYPE, b>::factorials;
  1064. #else
  1065. const std::array<BOOST_MATH_FLOAT128_TYPE, 171> unchecked_factorial_data<BOOST_MATH_FLOAT128_TYPE, b>::factorials = { {
  1066. 1,
  1067. 1,
  1068. 2,
  1069. 6,
  1070. 24,
  1071. 120,
  1072. 720,
  1073. 5040,
  1074. 40320,
  1075. 362880.0Q,
  1076. 3628800.0Q,
  1077. 39916800.0Q,
  1078. 479001600.0Q,
  1079. 6227020800.0Q,
  1080. 87178291200.0Q,
  1081. 1307674368000.0Q,
  1082. 20922789888000.0Q,
  1083. 355687428096000.0Q,
  1084. 6402373705728000.0Q,
  1085. 121645100408832000.0Q,
  1086. 0.243290200817664e19Q,
  1087. 0.5109094217170944e20Q,
  1088. 0.112400072777760768e22Q,
  1089. 0.2585201673888497664e23Q,
  1090. 0.62044840173323943936e24Q,
  1091. 0.15511210043330985984e26Q,
  1092. 0.403291461126605635584e27Q,
  1093. 0.10888869450418352160768e29Q,
  1094. 0.304888344611713860501504e30Q,
  1095. 0.8841761993739701954543616e31Q,
  1096. 0.26525285981219105863630848e33Q,
  1097. 0.822283865417792281772556288e34Q,
  1098. 0.26313083693369353016721801216e36Q,
  1099. 0.868331761881188649551819440128e37Q,
  1100. 0.29523279903960414084761860964352e39Q,
  1101. 0.103331479663861449296666513375232e41Q,
  1102. 0.3719933267899012174679994481508352e42Q,
  1103. 0.137637530912263450463159795815809024e44Q,
  1104. 0.5230226174666011117600072241000742912e45Q,
  1105. 0.203978820811974433586402817399028973568e47Q,
  1106. 0.815915283247897734345611269596115894272e48Q,
  1107. 0.3345252661316380710817006205344075166515e50Q,
  1108. 0.1405006117752879898543142606244511569936e52Q,
  1109. 0.6041526306337383563735513206851399750726e53Q,
  1110. 0.265827157478844876804362581101461589032e55Q,
  1111. 0.1196222208654801945619631614956577150644e57Q,
  1112. 0.5502622159812088949850305428800254892962e58Q,
  1113. 0.2586232415111681806429643551536119799692e60Q,
  1114. 0.1241391559253607267086228904737337503852e62Q,
  1115. 0.6082818640342675608722521633212953768876e63Q,
  1116. 0.3041409320171337804361260816606476884438e65Q,
  1117. 0.1551118753287382280224243016469303211063e67Q,
  1118. 0.8065817517094387857166063685640376697529e68Q,
  1119. 0.427488328406002556429801375338939964969e70Q,
  1120. 0.2308436973392413804720927426830275810833e72Q,
  1121. 0.1269640335365827592596510084756651695958e74Q,
  1122. 0.7109985878048634518540456474637249497365e75Q,
  1123. 0.4052691950487721675568060190543232213498e77Q,
  1124. 0.2350561331282878571829474910515074683829e79Q,
  1125. 0.1386831185456898357379390197203894063459e81Q,
  1126. 0.8320987112741390144276341183223364380754e82Q,
  1127. 0.507580213877224798800856812176625227226e84Q,
  1128. 0.3146997326038793752565312235495076408801e86Q,
  1129. 0.1982608315404440064116146708361898137545e88Q,
  1130. 0.1268869321858841641034333893351614808029e90Q,
  1131. 0.8247650592082470666723170306785496252186e91Q,
  1132. 0.5443449390774430640037292402478427526443e93Q,
  1133. 0.3647111091818868528824985909660546442717e95Q,
  1134. 0.2480035542436830599600990418569171581047e97Q,
  1135. 0.1711224524281413113724683388812728390923e99Q,
  1136. 0.1197857166996989179607278372168909873646e101Q,
  1137. 0.8504785885678623175211676442399260102886e102Q,
  1138. 0.6123445837688608686152407038527467274078e104Q,
  1139. 0.4470115461512684340891257138125051110077e106Q,
  1140. 0.3307885441519386412259530282212537821457e108Q,
  1141. 0.2480914081139539809194647711659403366093e110Q,
  1142. 0.188549470166605025498793226086114655823e112Q,
  1143. 0.1451830920282858696340707840863082849837e114Q,
  1144. 0.1132428117820629783145752115873204622873e116Q,
  1145. 0.8946182130782975286851441715398316520698e117Q,
  1146. 0.7156945704626380229481153372318653216558e119Q,
  1147. 0.5797126020747367985879734231578109105412e121Q,
  1148. 0.4753643337012841748421382069894049466438e123Q,
  1149. 0.3945523969720658651189747118012061057144e125Q,
  1150. 0.3314240134565353266999387579130131288001e127Q,
  1151. 0.2817104114380550276949479442260611594801e129Q,
  1152. 0.2422709538367273238176552320344125971528e131Q,
  1153. 0.210775729837952771721360051869938959523e133Q,
  1154. 0.1854826422573984391147968456455462843802e135Q,
  1155. 0.1650795516090846108121691926245361930984e137Q,
  1156. 0.1485715964481761497309522733620825737886e139Q,
  1157. 0.1352001527678402962551665687594951421476e141Q,
  1158. 0.1243841405464130725547532432587355307758e143Q,
  1159. 0.1156772507081641574759205162306240436215e145Q,
  1160. 0.1087366156656743080273652852567866010042e147Q,
  1161. 0.103299784882390592625997020993947270954e149Q,
  1162. 0.9916779348709496892095714015418938011582e150Q,
  1163. 0.9619275968248211985332842594956369871234e152Q,
  1164. 0.942689044888324774562618574305724247381e154Q,
  1165. 0.9332621544394415268169923885626670049072e156Q,
  1166. 0.9332621544394415268169923885626670049072e158Q,
  1167. 0.9425947759838359420851623124482936749562e160Q,
  1168. 0.9614466715035126609268655586972595484554e162Q,
  1169. 0.990290071648618040754671525458177334909e164Q,
  1170. 0.1029901674514562762384858386476504428305e167Q,
  1171. 0.1081396758240290900504101305800329649721e169Q,
  1172. 0.1146280563734708354534347384148349428704e171Q,
  1173. 0.1226520203196137939351751701038733888713e173Q,
  1174. 0.132464181945182897449989183712183259981e175Q,
  1175. 0.1443859583202493582204882102462797533793e177Q,
  1176. 0.1588245541522742940425370312709077287172e179Q,
  1177. 0.1762952551090244663872161047107075788761e181Q,
  1178. 0.1974506857221074023536820372759924883413e183Q,
  1179. 0.2231192748659813646596607021218715118256e185Q,
  1180. 0.2543559733472187557120132004189335234812e187Q,
  1181. 0.2925093693493015690688151804817735520034e189Q,
  1182. 0.339310868445189820119825609358857320324e191Q,
  1183. 0.396993716080872089540195962949863064779e193Q,
  1184. 0.4684525849754290656574312362808384164393e195Q,
  1185. 0.5574585761207605881323431711741977155627e197Q,
  1186. 0.6689502913449127057588118054090372586753e199Q,
  1187. 0.8094298525273443739681622845449350829971e201Q,
  1188. 0.9875044200833601362411579871448208012564e203Q,
  1189. 0.1214630436702532967576624324188129585545e206Q,
  1190. 0.1506141741511140879795014161993280686076e208Q,
  1191. 0.1882677176888926099743767702491600857595e210Q,
  1192. 0.237217324288004688567714730513941708057e212Q,
  1193. 0.3012660018457659544809977077527059692324e214Q,
  1194. 0.3856204823625804217356770659234636406175e216Q,
  1195. 0.4974504222477287440390234150412680963966e218Q,
  1196. 0.6466855489220473672507304395536485253155e220Q,
  1197. 0.8471580690878820510984568758152795681634e222Q,
  1198. 0.1118248651196004307449963076076169029976e225Q,
  1199. 0.1487270706090685728908450891181304809868e227Q,
  1200. 0.1992942746161518876737324194182948445223e229Q,
  1201. 0.269047270731805048359538766214698040105e231Q,
  1202. 0.3659042881952548657689727220519893345429e233Q,
  1203. 0.5012888748274991661034926292112253883237e235Q,
  1204. 0.6917786472619488492228198283114910358867e237Q,
  1205. 0.9615723196941089004197195613529725398826e239Q,
  1206. 0.1346201247571752460587607385894161555836e242Q,
  1207. 0.1898143759076170969428526414110767793728e244Q,
  1208. 0.2695364137888162776588507508037290267094e246Q,
  1209. 0.3854370717180072770521565736493325081944e248Q,
  1210. 0.5550293832739304789551054660550388118e250Q,
  1211. 0.80479260574719919448490292577980627711e252Q,
  1212. 0.1174997204390910823947958271638517164581e255Q,
  1213. 0.1727245890454638911203498659308620231933e257Q,
  1214. 0.2556323917872865588581178015776757943262e259Q,
  1215. 0.380892263763056972698595524350736933546e261Q,
  1216. 0.571338395644585459047893286526105400319e263Q,
  1217. 0.8627209774233240431623188626544191544816e265Q,
  1218. 0.1311335885683452545606724671234717114812e268Q,
  1219. 0.2006343905095682394778288746989117185662e270Q,
  1220. 0.308976961384735088795856467036324046592e272Q,
  1221. 0.4789142901463393876335775239063022722176e274Q,
  1222. 0.7471062926282894447083809372938315446595e276Q,
  1223. 0.1172956879426414428192158071551315525115e279Q,
  1224. 0.1853271869493734796543609753051078529682e281Q,
  1225. 0.2946702272495038326504339507351214862195e283Q,
  1226. 0.4714723635992061322406943211761943779512e285Q,
  1227. 0.7590705053947218729075178570936729485014e287Q,
  1228. 0.1229694218739449434110178928491750176572e290Q,
  1229. 0.2004401576545302577599591653441552787813e292Q,
  1230. 0.3287218585534296227263330311644146572013e294Q,
  1231. 0.5423910666131588774984495014212841843822e296Q,
  1232. 0.9003691705778437366474261723593317460744e298Q,
  1233. 0.1503616514864999040201201707840084015944e301Q,
  1234. 0.2526075744973198387538018869171341146786e303Q,
  1235. 0.4269068009004705274939251888899566538069e305Q,
  1236. 0.7257415615307998967396728211129263114717e307Q,
  1237. } };
  1238. #endif
  1239. template <>
  1240. inline BOOST_MATH_CONSTEXPR_TABLE_FUNCTION BOOST_MATH_FLOAT128_TYPE unchecked_factorial<BOOST_MATH_FLOAT128_TYPE>(unsigned i)
  1241. {
  1242. return unchecked_factorial_data<BOOST_MATH_FLOAT128_TYPE>::factorials[i];
  1243. }
  1244. template <>
  1245. struct max_factorial<BOOST_MATH_FLOAT128_TYPE>
  1246. {
  1247. static constexpr unsigned value = 170;
  1248. };
  1249. #endif
  1250. template <class T>
  1251. struct unchecked_factorial_initializer
  1252. {
  1253. struct init
  1254. {
  1255. init()
  1256. {
  1257. boost::math::unchecked_factorial<T>(3);
  1258. }
  1259. void force_instantiate()const {}
  1260. };
  1261. static const init initializer;
  1262. static void force_instantiate()
  1263. {
  1264. initializer.force_instantiate();
  1265. }
  1266. };
  1267. template <class T>
  1268. const typename unchecked_factorial_initializer<T>::init unchecked_factorial_initializer<T>::initializer;
  1269. template <class T, int N>
  1270. inline T unchecked_factorial_imp(unsigned i, const std::integral_constant<int, N>&)
  1271. {
  1272. //
  1273. // If you're foolish enough to instantiate factorial
  1274. // on an integer type then you end up here. But this code is
  1275. // only intended for (fixed precision) multiprecision types.
  1276. //
  1277. // Note, factorial<unsigned int>(n) is not implemented
  1278. // because it would overflow integral type T for too small n
  1279. // to be useful. Use instead a floating-point type,
  1280. // and convert to an unsigned type if essential, for example:
  1281. // unsigned int nfac = static_cast<unsigned int>(factorial<double>(n));
  1282. // See factorial documentation for more detail.
  1283. //
  1284. static_assert(!std::is_integral<T>::value && !std::numeric_limits<T>::is_integer, "Type T must not be an integral type");
  1285. // We rely on C++11 thread safe initialization here:
  1286. static const std::array<T, 101> factorials = {{
  1287. T(boost::math::tools::convert_from_string<T>("1")),
  1288. T(boost::math::tools::convert_from_string<T>("1")),
  1289. T(boost::math::tools::convert_from_string<T>("2")),
  1290. T(boost::math::tools::convert_from_string<T>("6")),
  1291. T(boost::math::tools::convert_from_string<T>("24")),
  1292. T(boost::math::tools::convert_from_string<T>("120")),
  1293. T(boost::math::tools::convert_from_string<T>("720")),
  1294. T(boost::math::tools::convert_from_string<T>("5040")),
  1295. T(boost::math::tools::convert_from_string<T>("40320")),
  1296. T(boost::math::tools::convert_from_string<T>("362880")),
  1297. T(boost::math::tools::convert_from_string<T>("3628800")),
  1298. T(boost::math::tools::convert_from_string<T>("39916800")),
  1299. T(boost::math::tools::convert_from_string<T>("479001600")),
  1300. T(boost::math::tools::convert_from_string<T>("6227020800")),
  1301. T(boost::math::tools::convert_from_string<T>("87178291200")),
  1302. T(boost::math::tools::convert_from_string<T>("1307674368000")),
  1303. T(boost::math::tools::convert_from_string<T>("20922789888000")),
  1304. T(boost::math::tools::convert_from_string<T>("355687428096000")),
  1305. T(boost::math::tools::convert_from_string<T>("6402373705728000")),
  1306. T(boost::math::tools::convert_from_string<T>("121645100408832000")),
  1307. T(boost::math::tools::convert_from_string<T>("2432902008176640000")),
  1308. T(boost::math::tools::convert_from_string<T>("51090942171709440000")),
  1309. T(boost::math::tools::convert_from_string<T>("1124000727777607680000")),
  1310. T(boost::math::tools::convert_from_string<T>("25852016738884976640000")),
  1311. T(boost::math::tools::convert_from_string<T>("620448401733239439360000")),
  1312. T(boost::math::tools::convert_from_string<T>("15511210043330985984000000")),
  1313. T(boost::math::tools::convert_from_string<T>("403291461126605635584000000")),
  1314. T(boost::math::tools::convert_from_string<T>("10888869450418352160768000000")),
  1315. T(boost::math::tools::convert_from_string<T>("304888344611713860501504000000")),
  1316. T(boost::math::tools::convert_from_string<T>("8841761993739701954543616000000")),
  1317. T(boost::math::tools::convert_from_string<T>("265252859812191058636308480000000")),
  1318. T(boost::math::tools::convert_from_string<T>("8222838654177922817725562880000000")),
  1319. T(boost::math::tools::convert_from_string<T>("263130836933693530167218012160000000")),
  1320. T(boost::math::tools::convert_from_string<T>("8683317618811886495518194401280000000")),
  1321. T(boost::math::tools::convert_from_string<T>("295232799039604140847618609643520000000")),
  1322. T(boost::math::tools::convert_from_string<T>("10333147966386144929666651337523200000000")),
  1323. T(boost::math::tools::convert_from_string<T>("371993326789901217467999448150835200000000")),
  1324. T(boost::math::tools::convert_from_string<T>("13763753091226345046315979581580902400000000")),
  1325. T(boost::math::tools::convert_from_string<T>("523022617466601111760007224100074291200000000")),
  1326. T(boost::math::tools::convert_from_string<T>("20397882081197443358640281739902897356800000000")),
  1327. T(boost::math::tools::convert_from_string<T>("815915283247897734345611269596115894272000000000")),
  1328. T(boost::math::tools::convert_from_string<T>("33452526613163807108170062053440751665152000000000")),
  1329. T(boost::math::tools::convert_from_string<T>("1405006117752879898543142606244511569936384000000000")),
  1330. T(boost::math::tools::convert_from_string<T>("60415263063373835637355132068513997507264512000000000")),
  1331. T(boost::math::tools::convert_from_string<T>("2658271574788448768043625811014615890319638528000000000")),
  1332. T(boost::math::tools::convert_from_string<T>("119622220865480194561963161495657715064383733760000000000")),
  1333. T(boost::math::tools::convert_from_string<T>("5502622159812088949850305428800254892961651752960000000000")),
  1334. T(boost::math::tools::convert_from_string<T>("258623241511168180642964355153611979969197632389120000000000")),
  1335. T(boost::math::tools::convert_from_string<T>("12413915592536072670862289047373375038521486354677760000000000")),
  1336. T(boost::math::tools::convert_from_string<T>("608281864034267560872252163321295376887552831379210240000000000")),
  1337. T(boost::math::tools::convert_from_string<T>("30414093201713378043612608166064768844377641568960512000000000000")),
  1338. T(boost::math::tools::convert_from_string<T>("1551118753287382280224243016469303211063259720016986112000000000000")),
  1339. T(boost::math::tools::convert_from_string<T>("80658175170943878571660636856403766975289505440883277824000000000000")),
  1340. T(boost::math::tools::convert_from_string<T>("4274883284060025564298013753389399649690343788366813724672000000000000")),
  1341. T(boost::math::tools::convert_from_string<T>("230843697339241380472092742683027581083278564571807941132288000000000000")),
  1342. T(boost::math::tools::convert_from_string<T>("12696403353658275925965100847566516959580321051449436762275840000000000000")),
  1343. T(boost::math::tools::convert_from_string<T>("710998587804863451854045647463724949736497978881168458687447040000000000000")),
  1344. T(boost::math::tools::convert_from_string<T>("40526919504877216755680601905432322134980384796226602145184481280000000000000")),
  1345. T(boost::math::tools::convert_from_string<T>("2350561331282878571829474910515074683828862318181142924420699914240000000000000")),
  1346. T(boost::math::tools::convert_from_string<T>("138683118545689835737939019720389406345902876772687432540821294940160000000000000")),
  1347. T(boost::math::tools::convert_from_string<T>("8320987112741390144276341183223364380754172606361245952449277696409600000000000000")),
  1348. T(boost::math::tools::convert_from_string<T>("507580213877224798800856812176625227226004528988036003099405939480985600000000000000")),
  1349. T(boost::math::tools::convert_from_string<T>("31469973260387937525653122354950764088012280797258232192163168247821107200000000000000")),
  1350. T(boost::math::tools::convert_from_string<T>("1982608315404440064116146708361898137544773690227268628106279599612729753600000000000000")),
  1351. T(boost::math::tools::convert_from_string<T>("126886932185884164103433389335161480802865516174545192198801894375214704230400000000000000")),
  1352. T(boost::math::tools::convert_from_string<T>("8247650592082470666723170306785496252186258551345437492922123134388955774976000000000000000")),
  1353. T(boost::math::tools::convert_from_string<T>("544344939077443064003729240247842752644293064388798874532860126869671081148416000000000000000")),
  1354. T(boost::math::tools::convert_from_string<T>("36471110918188685288249859096605464427167635314049524593701628500267962436943872000000000000000")),
  1355. T(boost::math::tools::convert_from_string<T>("2480035542436830599600990418569171581047399201355367672371710738018221445712183296000000000000000")),
  1356. T(boost::math::tools::convert_from_string<T>("171122452428141311372468338881272839092270544893520369393648040923257279754140647424000000000000000")),
  1357. T(boost::math::tools::convert_from_string<T>("11978571669969891796072783721689098736458938142546425857555362864628009582789845319680000000000000000")),
  1358. T(boost::math::tools::convert_from_string<T>("850478588567862317521167644239926010288584608120796235886430763388588680378079017697280000000000000000")),
  1359. T(boost::math::tools::convert_from_string<T>("61234458376886086861524070385274672740778091784697328983823014963978384987221689274204160000000000000000")),
  1360. T(boost::math::tools::convert_from_string<T>("4470115461512684340891257138125051110076800700282905015819080092370422104067183317016903680000000000000000")),
  1361. T(boost::math::tools::convert_from_string<T>("330788544151938641225953028221253782145683251820934971170611926835411235700971565459250872320000000000000000")),
  1362. T(boost::math::tools::convert_from_string<T>("24809140811395398091946477116594033660926243886570122837795894512655842677572867409443815424000000000000000000")),
  1363. T(boost::math::tools::convert_from_string<T>("1885494701666050254987932260861146558230394535379329335672487982961844043495537923117729972224000000000000000000")),
  1364. T(boost::math::tools::convert_from_string<T>("145183092028285869634070784086308284983740379224208358846781574688061991349156420080065207861248000000000000000000")),
  1365. T(boost::math::tools::convert_from_string<T>("11324281178206297831457521158732046228731749579488251990048962825668835325234200766245086213177344000000000000000000")),
  1366. T(boost::math::tools::convert_from_string<T>("894618213078297528685144171539831652069808216779571907213868063227837990693501860533361810841010176000000000000000000")),
  1367. T(boost::math::tools::convert_from_string<T>("71569457046263802294811533723186532165584657342365752577109445058227039255480148842668944867280814080000000000000000000")),
  1368. T(boost::math::tools::convert_from_string<T>("5797126020747367985879734231578109105412357244731625958745865049716390179693892056256184534249745940480000000000000000000")),
  1369. T(boost::math::tools::convert_from_string<T>("475364333701284174842138206989404946643813294067993328617160934076743994734899148613007131808479167119360000000000000000000")),
  1370. T(boost::math::tools::convert_from_string<T>("39455239697206586511897471180120610571436503407643446275224357528369751562996629334879591940103770870906880000000000000000000")),
  1371. T(boost::math::tools::convert_from_string<T>("3314240134565353266999387579130131288000666286242049487118846032383059131291716864129885722968716753156177920000000000000000000")),
  1372. T(boost::math::tools::convert_from_string<T>("281710411438055027694947944226061159480056634330574206405101912752560026159795933451040286452340924018275123200000000000000000000")),
  1373. T(boost::math::tools::convert_from_string<T>("24227095383672732381765523203441259715284870552429381750838764496720162249742450276789464634901319465571660595200000000000000000000")),
  1374. T(boost::math::tools::convert_from_string<T>("2107757298379527717213600518699389595229783738061356212322972511214654115727593174080683423236414793504734471782400000000000000000000")),
  1375. T(boost::math::tools::convert_from_string<T>("185482642257398439114796845645546284380220968949399346684421580986889562184028199319100141244804501828416633516851200000000000000000000")),
  1376. T(boost::math::tools::convert_from_string<T>("16507955160908461081216919262453619309839666236496541854913520707833171034378509739399912570787600662729080382999756800000000000000000000")),
  1377. T(boost::math::tools::convert_from_string<T>("1485715964481761497309522733620825737885569961284688766942216863704985393094065876545992131370884059645617234469978112000000000000000000000")),
  1378. T(boost::math::tools::convert_from_string<T>("135200152767840296255166568759495142147586866476906677791741734597153670771559994765685283954750449427751168336768008192000000000000000000000")),
  1379. T(boost::math::tools::convert_from_string<T>("12438414054641307255475324325873553077577991715875414356840239582938137710983519518443046123837041347353107486982656753664000000000000000000000")),
  1380. T(boost::math::tools::convert_from_string<T>("1156772507081641574759205162306240436214753229576413535186142281213246807121467315215203289516844845303838996289387078090752000000000000000000000")),
  1381. T(boost::math::tools::convert_from_string<T>("108736615665674308027365285256786601004186803580182872307497374434045199869417927630229109214583415458560865651202385340530688000000000000000000000")),
  1382. T(boost::math::tools::convert_from_string<T>("10329978488239059262599702099394727095397746340117372869212250571234293987594703124871765375385424468563282236864226607350415360000000000000000000000")),
  1383. T(boost::math::tools::convert_from_string<T>("991677934870949689209571401541893801158183648651267795444376054838492222809091499987689476037000748982075094738965754305639874560000000000000000000000")),
  1384. T(boost::math::tools::convert_from_string<T>("96192759682482119853328425949563698712343813919172976158104477319333745612481875498805879175589072651261284189679678167647067832320000000000000000000000")),
  1385. T(boost::math::tools::convert_from_string<T>("9426890448883247745626185743057242473809693764078951663494238777294707070023223798882976159207729119823605850588608460429412647567360000000000000000000000")),
  1386. T(boost::math::tools::convert_from_string<T>("933262154439441526816992388562667004907159682643816214685929638952175999932299156089414639761565182862536979208272237582511852109168640000000000000000000000")),
  1387. T(boost::math::tools::convert_from_string<T>("93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000")),
  1388. }};
  1389. return factorials[i];
  1390. }
  1391. template <class T>
  1392. inline T unchecked_factorial_imp(unsigned i, const std::integral_constant<int, 0>&)
  1393. {
  1394. //
  1395. // If you're foolish enough to instantiate factorial
  1396. // on an integer type then you end up here. But this code is
  1397. // only intended for (variable precision) multiprecision types.
  1398. //
  1399. // Note, factorial<unsigned int>(n) is not implemented
  1400. // because it would overflow integral type T for too small n
  1401. // to be useful. Use instead a floating-point type,
  1402. // and convert to an unsigned type if essential, for example:
  1403. // unsigned int nfac = static_cast<unsigned int>(factorial<double>(n));
  1404. // See factorial documentation for more detail.
  1405. //
  1406. static_assert(!std::is_integral<T>::value && !std::numeric_limits<T>::is_integer, "Type T must not be an integral type");
  1407. static const char* const factorial_strings[] = {
  1408. "1",
  1409. "1",
  1410. "2",
  1411. "6",
  1412. "24",
  1413. "120",
  1414. "720",
  1415. "5040",
  1416. "40320",
  1417. "362880",
  1418. "3628800",
  1419. "39916800",
  1420. "479001600",
  1421. "6227020800",
  1422. "87178291200",
  1423. "1307674368000",
  1424. "20922789888000",
  1425. "355687428096000",
  1426. "6402373705728000",
  1427. "121645100408832000",
  1428. "2432902008176640000",
  1429. "51090942171709440000",
  1430. "1124000727777607680000",
  1431. "25852016738884976640000",
  1432. "620448401733239439360000",
  1433. "15511210043330985984000000",
  1434. "403291461126605635584000000",
  1435. "10888869450418352160768000000",
  1436. "304888344611713860501504000000",
  1437. "8841761993739701954543616000000",
  1438. "265252859812191058636308480000000",
  1439. "8222838654177922817725562880000000",
  1440. "263130836933693530167218012160000000",
  1441. "8683317618811886495518194401280000000",
  1442. "295232799039604140847618609643520000000",
  1443. "10333147966386144929666651337523200000000",
  1444. "371993326789901217467999448150835200000000",
  1445. "13763753091226345046315979581580902400000000",
  1446. "523022617466601111760007224100074291200000000",
  1447. "20397882081197443358640281739902897356800000000",
  1448. "815915283247897734345611269596115894272000000000",
  1449. "33452526613163807108170062053440751665152000000000",
  1450. "1405006117752879898543142606244511569936384000000000",
  1451. "60415263063373835637355132068513997507264512000000000",
  1452. "2658271574788448768043625811014615890319638528000000000",
  1453. "119622220865480194561963161495657715064383733760000000000",
  1454. "5502622159812088949850305428800254892961651752960000000000",
  1455. "258623241511168180642964355153611979969197632389120000000000",
  1456. "12413915592536072670862289047373375038521486354677760000000000",
  1457. "608281864034267560872252163321295376887552831379210240000000000",
  1458. "30414093201713378043612608166064768844377641568960512000000000000",
  1459. "1551118753287382280224243016469303211063259720016986112000000000000",
  1460. "80658175170943878571660636856403766975289505440883277824000000000000",
  1461. "4274883284060025564298013753389399649690343788366813724672000000000000",
  1462. "230843697339241380472092742683027581083278564571807941132288000000000000",
  1463. "12696403353658275925965100847566516959580321051449436762275840000000000000",
  1464. "710998587804863451854045647463724949736497978881168458687447040000000000000",
  1465. "40526919504877216755680601905432322134980384796226602145184481280000000000000",
  1466. "2350561331282878571829474910515074683828862318181142924420699914240000000000000",
  1467. "138683118545689835737939019720389406345902876772687432540821294940160000000000000",
  1468. "8320987112741390144276341183223364380754172606361245952449277696409600000000000000",
  1469. "507580213877224798800856812176625227226004528988036003099405939480985600000000000000",
  1470. "31469973260387937525653122354950764088012280797258232192163168247821107200000000000000",
  1471. "1982608315404440064116146708361898137544773690227268628106279599612729753600000000000000",
  1472. "126886932185884164103433389335161480802865516174545192198801894375214704230400000000000000",
  1473. "8247650592082470666723170306785496252186258551345437492922123134388955774976000000000000000",
  1474. "544344939077443064003729240247842752644293064388798874532860126869671081148416000000000000000",
  1475. "36471110918188685288249859096605464427167635314049524593701628500267962436943872000000000000000",
  1476. "2480035542436830599600990418569171581047399201355367672371710738018221445712183296000000000000000",
  1477. "171122452428141311372468338881272839092270544893520369393648040923257279754140647424000000000000000",
  1478. "11978571669969891796072783721689098736458938142546425857555362864628009582789845319680000000000000000",
  1479. "850478588567862317521167644239926010288584608120796235886430763388588680378079017697280000000000000000",
  1480. "61234458376886086861524070385274672740778091784697328983823014963978384987221689274204160000000000000000",
  1481. "4470115461512684340891257138125051110076800700282905015819080092370422104067183317016903680000000000000000",
  1482. "330788544151938641225953028221253782145683251820934971170611926835411235700971565459250872320000000000000000",
  1483. "24809140811395398091946477116594033660926243886570122837795894512655842677572867409443815424000000000000000000",
  1484. "1885494701666050254987932260861146558230394535379329335672487982961844043495537923117729972224000000000000000000",
  1485. "145183092028285869634070784086308284983740379224208358846781574688061991349156420080065207861248000000000000000000",
  1486. "11324281178206297831457521158732046228731749579488251990048962825668835325234200766245086213177344000000000000000000",
  1487. "894618213078297528685144171539831652069808216779571907213868063227837990693501860533361810841010176000000000000000000",
  1488. "71569457046263802294811533723186532165584657342365752577109445058227039255480148842668944867280814080000000000000000000",
  1489. "5797126020747367985879734231578109105412357244731625958745865049716390179693892056256184534249745940480000000000000000000",
  1490. "475364333701284174842138206989404946643813294067993328617160934076743994734899148613007131808479167119360000000000000000000",
  1491. "39455239697206586511897471180120610571436503407643446275224357528369751562996629334879591940103770870906880000000000000000000",
  1492. "3314240134565353266999387579130131288000666286242049487118846032383059131291716864129885722968716753156177920000000000000000000",
  1493. "281710411438055027694947944226061159480056634330574206405101912752560026159795933451040286452340924018275123200000000000000000000",
  1494. "24227095383672732381765523203441259715284870552429381750838764496720162249742450276789464634901319465571660595200000000000000000000",
  1495. "2107757298379527717213600518699389595229783738061356212322972511214654115727593174080683423236414793504734471782400000000000000000000",
  1496. "185482642257398439114796845645546284380220968949399346684421580986889562184028199319100141244804501828416633516851200000000000000000000",
  1497. "16507955160908461081216919262453619309839666236496541854913520707833171034378509739399912570787600662729080382999756800000000000000000000",
  1498. "1485715964481761497309522733620825737885569961284688766942216863704985393094065876545992131370884059645617234469978112000000000000000000000",
  1499. "135200152767840296255166568759495142147586866476906677791741734597153670771559994765685283954750449427751168336768008192000000000000000000000",
  1500. "12438414054641307255475324325873553077577991715875414356840239582938137710983519518443046123837041347353107486982656753664000000000000000000000",
  1501. "1156772507081641574759205162306240436214753229576413535186142281213246807121467315215203289516844845303838996289387078090752000000000000000000000",
  1502. "108736615665674308027365285256786601004186803580182872307497374434045199869417927630229109214583415458560865651202385340530688000000000000000000000",
  1503. "10329978488239059262599702099394727095397746340117372869212250571234293987594703124871765375385424468563282236864226607350415360000000000000000000000",
  1504. "991677934870949689209571401541893801158183648651267795444376054838492222809091499987689476037000748982075094738965754305639874560000000000000000000000",
  1505. "96192759682482119853328425949563698712343813919172976158104477319333745612481875498805879175589072651261284189679678167647067832320000000000000000000000",
  1506. "9426890448883247745626185743057242473809693764078951663494238777294707070023223798882976159207729119823605850588608460429412647567360000000000000000000000",
  1507. "933262154439441526816992388562667004907159682643816214685929638952175999932299156089414639761565182862536979208272237582511852109168640000000000000000000000",
  1508. "93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000",
  1509. };
  1510. //
  1511. // we rely on C++11 thread safe initialization in the event that we have no thread locals:
  1512. //
  1513. static BOOST_MATH_THREAD_LOCAL T factorials[sizeof(factorial_strings) / sizeof(factorial_strings[0])];
  1514. static BOOST_MATH_THREAD_LOCAL int digits = 0;
  1515. int current_digits = boost::math::tools::digits<T>();
  1516. if(digits != current_digits)
  1517. {
  1518. digits = current_digits;
  1519. for(unsigned k = 0; k < sizeof(factorials) / sizeof(factorials[0]); ++k)
  1520. factorials[k] = static_cast<T>(boost::math::tools::convert_from_string<T>(factorial_strings[k]));
  1521. }
  1522. return factorials[i];
  1523. }
  1524. template <class T>
  1525. inline T unchecked_factorial_imp(unsigned i, const std::integral_constant<int, std::numeric_limits<float>::digits>&)
  1526. {
  1527. return unchecked_factorial<float>(i);
  1528. }
  1529. template <class T>
  1530. inline T unchecked_factorial_imp(unsigned i, const std::integral_constant<int, std::numeric_limits<double>::digits>&)
  1531. {
  1532. return unchecked_factorial<double>(i);
  1533. }
  1534. #if DBL_MANT_DIG != LDBL_MANT_DIG
  1535. template <class T>
  1536. inline T unchecked_factorial_imp(unsigned i, const std::integral_constant<int, LDBL_MANT_DIG>&)
  1537. {
  1538. return unchecked_factorial<long double>(i);
  1539. }
  1540. #endif
  1541. #ifdef BOOST_MATH_USE_FLOAT128
  1542. template <class T>
  1543. inline T unchecked_factorial_imp(unsigned i, const std::integral_constant<int, 113>&)
  1544. {
  1545. return unchecked_factorial<BOOST_MATH_FLOAT128_TYPE>(i);
  1546. }
  1547. #endif
  1548. template <class T>
  1549. inline T unchecked_factorial(unsigned i)
  1550. {
  1551. typedef typename boost::math::policies::precision<T, boost::math::policies::policy<> >::type tag_type;
  1552. return unchecked_factorial_imp<T>(i, tag_type());
  1553. }
  1554. #ifdef BOOST_MATH_USE_FLOAT128
  1555. #define BOOST_MATH_DETAIL_FLOAT128_MAX_FACTORIAL : std::numeric_limits<T>::digits == 113 ? max_factorial<BOOST_MATH_FLOAT128_TYPE>::value
  1556. #else
  1557. #define BOOST_MATH_DETAIL_FLOAT128_MAX_FACTORIAL
  1558. #endif
  1559. template <class T>
  1560. struct max_factorial
  1561. {
  1562. static constexpr unsigned value =
  1563. std::numeric_limits<T>::digits == std::numeric_limits<float>::digits ? max_factorial<float>::value
  1564. : std::numeric_limits<T>::digits == std::numeric_limits<double>::digits ? max_factorial<double>::value
  1565. : std::numeric_limits<T>::digits == std::numeric_limits<long double>::digits ? max_factorial<long double>::value
  1566. BOOST_MATH_DETAIL_FLOAT128_MAX_FACTORIAL
  1567. : 100;
  1568. };
  1569. #undef BOOST_MATH_DETAIL_FLOAT128_MAX_FACTORIAL
  1570. #ifndef BOOST_NO_INCLASS_MEMBER_INITIALIZATION
  1571. template <class T>
  1572. constexpr unsigned max_factorial<T>::value;
  1573. #endif
  1574. } // namespace math
  1575. } // namespace boost
  1576. #endif // BOOST_MATH_SP_UC_FACTORIALS_HPP