lgammaq.c 31 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042
  1. /* lgammal
  2. *
  3. * Natural logarithm of gamma function
  4. *
  5. *
  6. *
  7. * SYNOPSIS:
  8. *
  9. * __float128 x, y, lgammal();
  10. * extern int sgngam;
  11. *
  12. * y = lgammal(x);
  13. *
  14. *
  15. *
  16. * DESCRIPTION:
  17. *
  18. * Returns the base e (2.718...) logarithm of the absolute
  19. * value of the gamma function of the argument.
  20. * The sign (+1 or -1) of the gamma function is returned in a
  21. * global (extern) variable named signgam.
  22. *
  23. * The positive domain is partitioned into numerous segments for approximation.
  24. * For x > 10,
  25. * log gamma(x) = (x - 0.5) log(x) - x + log sqrt(2 pi) + 1/x R(1/x^2)
  26. * Near the minimum at x = x0 = 1.46... the approximation is
  27. * log gamma(x0 + z) = log gamma(x0) + z^2 P(z)/Q(z)
  28. * for small z.
  29. * Elsewhere between 0 and 10,
  30. * log gamma(n + z) = log gamma(n) + z P(z)/Q(z)
  31. * for various selected n and small z.
  32. *
  33. * The cosecant reflection formula is employed for negative arguments.
  34. *
  35. *
  36. *
  37. * ACCURACY:
  38. *
  39. *
  40. * arithmetic domain # trials peak rms
  41. * Relative error:
  42. * IEEE 10, 30 100000 3.9e-34 9.8e-35
  43. * IEEE 0, 10 100000 3.8e-34 5.3e-35
  44. * Absolute error:
  45. * IEEE -10, 0 100000 8.0e-34 8.0e-35
  46. * IEEE -30, -10 100000 4.4e-34 1.0e-34
  47. * IEEE -100, 100 100000 1.0e-34
  48. *
  49. * The absolute error criterion is the same as relative error
  50. * when the function magnitude is greater than one but it is absolute
  51. * when the magnitude is less than one.
  52. *
  53. */
  54. /* Copyright 2001 by Stephen L. Moshier <moshier@na-net.ornl.gov>
  55. This library is free software; you can redistribute it and/or
  56. modify it under the terms of the GNU Lesser General Public
  57. License as published by the Free Software Foundation; either
  58. version 2.1 of the License, or (at your option) any later version.
  59. This library is distributed in the hope that it will be useful,
  60. but WITHOUT ANY WARRANTY; without even the implied warranty of
  61. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  62. Lesser General Public License for more details.
  63. You should have received a copy of the GNU Lesser General Public
  64. License along with this library; if not, write to the Free Software
  65. Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
  66. #include "quadmath-imp.h"
  67. #ifdef HAVE_MATH_H_SIGNGAM
  68. #include <math.h> /* For POSIX's extern int signgam. */
  69. #endif
  70. static const __float128 PIQ = 3.1415926535897932384626433832795028841972E0Q;
  71. static const __float128 MAXLGM = 1.0485738685148938358098967157129705071571E4928Q;
  72. static const __float128 one = 1.0Q;
  73. static const __float128 zero = 0.0Q;
  74. static const __float128 huge = 1.0e4000Q;
  75. /* log gamma(x) = ( x - 0.5 ) * log(x) - x + LS2PI + 1/x P(1/x^2)
  76. 1/x <= 0.0741 (x >= 13.495...)
  77. Peak relative error 1.5e-36 */
  78. static const __float128 ls2pi = 9.1893853320467274178032973640561763986140E-1Q;
  79. #define NRASY 12
  80. static const __float128 RASY[NRASY + 1] =
  81. {
  82. 8.333333333333333333333333333310437112111E-2Q,
  83. -2.777777777777777777777774789556228296902E-3Q,
  84. 7.936507936507936507795933938448586499183E-4Q,
  85. -5.952380952380952041799269756378148574045E-4Q,
  86. 8.417508417507928904209891117498524452523E-4Q,
  87. -1.917526917481263997778542329739806086290E-3Q,
  88. 6.410256381217852504446848671499409919280E-3Q,
  89. -2.955064066900961649768101034477363301626E-2Q,
  90. 1.796402955865634243663453415388336954675E-1Q,
  91. -1.391522089007758553455753477688592767741E0Q,
  92. 1.326130089598399157988112385013829305510E1Q,
  93. -1.420412699593782497803472576479997819149E2Q,
  94. 1.218058922427762808938869872528846787020E3Q
  95. };
  96. /* log gamma(x+13) = log gamma(13) + x P(x)/Q(x)
  97. -0.5 <= x <= 0.5
  98. 12.5 <= x+13 <= 13.5
  99. Peak relative error 1.1e-36 */
  100. static const __float128 lgam13a = 1.9987213134765625E1Q;
  101. static const __float128 lgam13b = 1.3608962611495173623870550785125024484248E-6Q;
  102. #define NRN13 7
  103. static const __float128 RN13[NRN13 + 1] =
  104. {
  105. 8.591478354823578150238226576156275285700E11Q,
  106. 2.347931159756482741018258864137297157668E11Q,
  107. 2.555408396679352028680662433943000804616E10Q,
  108. 1.408581709264464345480765758902967123937E9Q,
  109. 4.126759849752613822953004114044451046321E7Q,
  110. 6.133298899622688505854211579222889943778E5Q,
  111. 3.929248056293651597987893340755876578072E3Q,
  112. 6.850783280018706668924952057996075215223E0Q
  113. };
  114. #define NRD13 6
  115. static const __float128 RD13[NRD13 + 1] =
  116. {
  117. 3.401225382297342302296607039352935541669E11Q,
  118. 8.756765276918037910363513243563234551784E10Q,
  119. 8.873913342866613213078554180987647243903E9Q,
  120. 4.483797255342763263361893016049310017973E8Q,
  121. 1.178186288833066430952276702931512870676E7Q,
  122. 1.519928623743264797939103740132278337476E5Q,
  123. 7.989298844938119228411117593338850892311E2Q
  124. /* 1.0E0Q */
  125. };
  126. /* log gamma(x+12) = log gamma(12) + x P(x)/Q(x)
  127. -0.5 <= x <= 0.5
  128. 11.5 <= x+12 <= 12.5
  129. Peak relative error 4.1e-36 */
  130. static const __float128 lgam12a = 1.75023040771484375E1Q;
  131. static const __float128 lgam12b = 3.7687254483392876529072161996717039575982E-6Q;
  132. #define NRN12 7
  133. static const __float128 RN12[NRN12 + 1] =
  134. {
  135. 4.709859662695606986110997348630997559137E11Q,
  136. 1.398713878079497115037857470168777995230E11Q,
  137. 1.654654931821564315970930093932954900867E10Q,
  138. 9.916279414876676861193649489207282144036E8Q,
  139. 3.159604070526036074112008954113411389879E7Q,
  140. 5.109099197547205212294747623977502492861E5Q,
  141. 3.563054878276102790183396740969279826988E3Q,
  142. 6.769610657004672719224614163196946862747E0Q
  143. };
  144. #define NRD12 6
  145. static const __float128 RD12[NRD12 + 1] =
  146. {
  147. 1.928167007860968063912467318985802726613E11Q,
  148. 5.383198282277806237247492369072266389233E10Q,
  149. 5.915693215338294477444809323037871058363E9Q,
  150. 3.241438287570196713148310560147925781342E8Q,
  151. 9.236680081763754597872713592701048455890E6Q,
  152. 1.292246897881650919242713651166596478850E5Q,
  153. 7.366532445427159272584194816076600211171E2Q
  154. /* 1.0E0Q */
  155. };
  156. /* log gamma(x+11) = log gamma(11) + x P(x)/Q(x)
  157. -0.5 <= x <= 0.5
  158. 10.5 <= x+11 <= 11.5
  159. Peak relative error 1.8e-35 */
  160. static const __float128 lgam11a = 1.5104400634765625E1Q;
  161. static const __float128 lgam11b = 1.1938309890295225709329251070371882250744E-5Q;
  162. #define NRN11 7
  163. static const __float128 RN11[NRN11 + 1] =
  164. {
  165. 2.446960438029415837384622675816736622795E11Q,
  166. 7.955444974446413315803799763901729640350E10Q,
  167. 1.030555327949159293591618473447420338444E10Q,
  168. 6.765022131195302709153994345470493334946E8Q,
  169. 2.361892792609204855279723576041468347494E7Q,
  170. 4.186623629779479136428005806072176490125E5Q,
  171. 3.202506022088912768601325534149383594049E3Q,
  172. 6.681356101133728289358838690666225691363E0Q
  173. };
  174. #define NRD11 6
  175. static const __float128 RD11[NRD11 + 1] =
  176. {
  177. 1.040483786179428590683912396379079477432E11Q,
  178. 3.172251138489229497223696648369823779729E10Q,
  179. 3.806961885984850433709295832245848084614E9Q,
  180. 2.278070344022934913730015420611609620171E8Q,
  181. 7.089478198662651683977290023829391596481E6Q,
  182. 1.083246385105903533237139380509590158658E5Q,
  183. 6.744420991491385145885727942219463243597E2Q
  184. /* 1.0E0Q */
  185. };
  186. /* log gamma(x+10) = log gamma(10) + x P(x)/Q(x)
  187. -0.5 <= x <= 0.5
  188. 9.5 <= x+10 <= 10.5
  189. Peak relative error 5.4e-37 */
  190. static const __float128 lgam10a = 1.280181884765625E1Q;
  191. static const __float128 lgam10b = 8.6324252196112077178745667061642811492557E-6Q;
  192. #define NRN10 7
  193. static const __float128 RN10[NRN10 + 1] =
  194. {
  195. -1.239059737177249934158597996648808363783E14Q,
  196. -4.725899566371458992365624673357356908719E13Q,
  197. -7.283906268647083312042059082837754850808E12Q,
  198. -5.802855515464011422171165179767478794637E11Q,
  199. -2.532349691157548788382820303182745897298E10Q,
  200. -5.884260178023777312587193693477072061820E8Q,
  201. -6.437774864512125749845840472131829114906E6Q,
  202. -2.350975266781548931856017239843273049384E4Q
  203. };
  204. #define NRD10 7
  205. static const __float128 RD10[NRD10 + 1] =
  206. {
  207. -5.502645997581822567468347817182347679552E13Q,
  208. -1.970266640239849804162284805400136473801E13Q,
  209. -2.819677689615038489384974042561531409392E12Q,
  210. -2.056105863694742752589691183194061265094E11Q,
  211. -8.053670086493258693186307810815819662078E9Q,
  212. -1.632090155573373286153427982504851867131E8Q,
  213. -1.483575879240631280658077826889223634921E6Q,
  214. -4.002806669713232271615885826373550502510E3Q
  215. /* 1.0E0Q */
  216. };
  217. /* log gamma(x+9) = log gamma(9) + x P(x)/Q(x)
  218. -0.5 <= x <= 0.5
  219. 8.5 <= x+9 <= 9.5
  220. Peak relative error 3.6e-36 */
  221. static const __float128 lgam9a = 1.06045989990234375E1Q;
  222. static const __float128 lgam9b = 3.9037218127284172274007216547549861681400E-6Q;
  223. #define NRN9 7
  224. static const __float128 RN9[NRN9 + 1] =
  225. {
  226. -4.936332264202687973364500998984608306189E13Q,
  227. -2.101372682623700967335206138517766274855E13Q,
  228. -3.615893404644823888655732817505129444195E12Q,
  229. -3.217104993800878891194322691860075472926E11Q,
  230. -1.568465330337375725685439173603032921399E10Q,
  231. -4.073317518162025744377629219101510217761E8Q,
  232. -4.983232096406156139324846656819246974500E6Q,
  233. -2.036280038903695980912289722995505277253E4Q
  234. };
  235. #define NRD9 7
  236. static const __float128 RD9[NRD9 + 1] =
  237. {
  238. -2.306006080437656357167128541231915480393E13Q,
  239. -9.183606842453274924895648863832233799950E12Q,
  240. -1.461857965935942962087907301194381010380E12Q,
  241. -1.185728254682789754150068652663124298303E11Q,
  242. -5.166285094703468567389566085480783070037E9Q,
  243. -1.164573656694603024184768200787835094317E8Q,
  244. -1.177343939483908678474886454113163527909E6Q,
  245. -3.529391059783109732159524500029157638736E3Q
  246. /* 1.0E0Q */
  247. };
  248. /* log gamma(x+8) = log gamma(8) + x P(x)/Q(x)
  249. -0.5 <= x <= 0.5
  250. 7.5 <= x+8 <= 8.5
  251. Peak relative error 2.4e-37 */
  252. static const __float128 lgam8a = 8.525146484375E0Q;
  253. static const __float128 lgam8b = 1.4876690414300165531036347125050759667737E-5Q;
  254. #define NRN8 8
  255. static const __float128 RN8[NRN8 + 1] =
  256. {
  257. 6.600775438203423546565361176829139703289E11Q,
  258. 3.406361267593790705240802723914281025800E11Q,
  259. 7.222460928505293914746983300555538432830E10Q,
  260. 8.102984106025088123058747466840656458342E9Q,
  261. 5.157620015986282905232150979772409345927E8Q,
  262. 1.851445288272645829028129389609068641517E7Q,
  263. 3.489261702223124354745894067468953756656E5Q,
  264. 2.892095396706665774434217489775617756014E3Q,
  265. 6.596977510622195827183948478627058738034E0Q
  266. };
  267. #define NRD8 7
  268. static const __float128 RD8[NRD8 + 1] =
  269. {
  270. 3.274776546520735414638114828622673016920E11Q,
  271. 1.581811207929065544043963828487733970107E11Q,
  272. 3.108725655667825188135393076860104546416E10Q,
  273. 3.193055010502912617128480163681842165730E9Q,
  274. 1.830871482669835106357529710116211541839E8Q,
  275. 5.790862854275238129848491555068073485086E6Q,
  276. 9.305213264307921522842678835618803553589E4Q,
  277. 6.216974105861848386918949336819572333622E2Q
  278. /* 1.0E0Q */
  279. };
  280. /* log gamma(x+7) = log gamma(7) + x P(x)/Q(x)
  281. -0.5 <= x <= 0.5
  282. 6.5 <= x+7 <= 7.5
  283. Peak relative error 3.2e-36 */
  284. static const __float128 lgam7a = 6.5792388916015625E0Q;
  285. static const __float128 lgam7b = 1.2320408538495060178292903945321122583007E-5Q;
  286. #define NRN7 8
  287. static const __float128 RN7[NRN7 + 1] =
  288. {
  289. 2.065019306969459407636744543358209942213E11Q,
  290. 1.226919919023736909889724951708796532847E11Q,
  291. 2.996157990374348596472241776917953749106E10Q,
  292. 3.873001919306801037344727168434909521030E9Q,
  293. 2.841575255593761593270885753992732145094E8Q,
  294. 1.176342515359431913664715324652399565551E7Q,
  295. 2.558097039684188723597519300356028511547E5Q,
  296. 2.448525238332609439023786244782810774702E3Q,
  297. 6.460280377802030953041566617300902020435E0Q
  298. };
  299. #define NRD7 7
  300. static const __float128 RD7[NRD7 + 1] =
  301. {
  302. 1.102646614598516998880874785339049304483E11Q,
  303. 6.099297512712715445879759589407189290040E10Q,
  304. 1.372898136289611312713283201112060238351E10Q,
  305. 1.615306270420293159907951633566635172343E9Q,
  306. 1.061114435798489135996614242842561967459E8Q,
  307. 3.845638971184305248268608902030718674691E6Q,
  308. 7.081730675423444975703917836972720495507E4Q,
  309. 5.423122582741398226693137276201344096370E2Q
  310. /* 1.0E0Q */
  311. };
  312. /* log gamma(x+6) = log gamma(6) + x P(x)/Q(x)
  313. -0.5 <= x <= 0.5
  314. 5.5 <= x+6 <= 6.5
  315. Peak relative error 6.2e-37 */
  316. static const __float128 lgam6a = 4.7874908447265625E0Q;
  317. static const __float128 lgam6b = 8.9805548349424770093452324304839959231517E-7Q;
  318. #define NRN6 8
  319. static const __float128 RN6[NRN6 + 1] =
  320. {
  321. -3.538412754670746879119162116819571823643E13Q,
  322. -2.613432593406849155765698121483394257148E13Q,
  323. -8.020670732770461579558867891923784753062E12Q,
  324. -1.322227822931250045347591780332435433420E12Q,
  325. -1.262809382777272476572558806855377129513E11Q,
  326. -7.015006277027660872284922325741197022467E9Q,
  327. -2.149320689089020841076532186783055727299E8Q,
  328. -3.167210585700002703820077565539658995316E6Q,
  329. -1.576834867378554185210279285358586385266E4Q
  330. };
  331. #define NRD6 8
  332. static const __float128 RD6[NRD6 + 1] =
  333. {
  334. -2.073955870771283609792355579558899389085E13Q,
  335. -1.421592856111673959642750863283919318175E13Q,
  336. -4.012134994918353924219048850264207074949E12Q,
  337. -6.013361045800992316498238470888523722431E11Q,
  338. -5.145382510136622274784240527039643430628E10Q,
  339. -2.510575820013409711678540476918249524123E9Q,
  340. -6.564058379709759600836745035871373240904E7Q,
  341. -7.861511116647120540275354855221373571536E5Q,
  342. -2.821943442729620524365661338459579270561E3Q
  343. /* 1.0E0Q */
  344. };
  345. /* log gamma(x+5) = log gamma(5) + x P(x)/Q(x)
  346. -0.5 <= x <= 0.5
  347. 4.5 <= x+5 <= 5.5
  348. Peak relative error 3.4e-37 */
  349. static const __float128 lgam5a = 3.17803955078125E0Q;
  350. static const __float128 lgam5b = 1.4279566695619646941601297055408873990961E-5Q;
  351. #define NRN5 9
  352. static const __float128 RN5[NRN5 + 1] =
  353. {
  354. 2.010952885441805899580403215533972172098E11Q,
  355. 1.916132681242540921354921906708215338584E11Q,
  356. 7.679102403710581712903937970163206882492E10Q,
  357. 1.680514903671382470108010973615268125169E10Q,
  358. 2.181011222911537259440775283277711588410E9Q,
  359. 1.705361119398837808244780667539728356096E8Q,
  360. 7.792391565652481864976147945997033946360E6Q,
  361. 1.910741381027985291688667214472560023819E5Q,
  362. 2.088138241893612679762260077783794329559E3Q,
  363. 6.330318119566998299106803922739066556550E0Q
  364. };
  365. #define NRD5 8
  366. static const __float128 RD5[NRD5 + 1] =
  367. {
  368. 1.335189758138651840605141370223112376176E11Q,
  369. 1.174130445739492885895466097516530211283E11Q,
  370. 4.308006619274572338118732154886328519910E10Q,
  371. 8.547402888692578655814445003283720677468E9Q,
  372. 9.934628078575618309542580800421370730906E8Q,
  373. 6.847107420092173812998096295422311820672E7Q,
  374. 2.698552646016599923609773122139463150403E6Q,
  375. 5.526516251532464176412113632726150253215E4Q,
  376. 4.772343321713697385780533022595450486932E2Q
  377. /* 1.0E0Q */
  378. };
  379. /* log gamma(x+4) = log gamma(4) + x P(x)/Q(x)
  380. -0.5 <= x <= 0.5
  381. 3.5 <= x+4 <= 4.5
  382. Peak relative error 6.7e-37 */
  383. static const __float128 lgam4a = 1.791748046875E0Q;
  384. static const __float128 lgam4b = 1.1422353055000812477358380702272722990692E-5Q;
  385. #define NRN4 9
  386. static const __float128 RN4[NRN4 + 1] =
  387. {
  388. -1.026583408246155508572442242188887829208E13Q,
  389. -1.306476685384622809290193031208776258809E13Q,
  390. -7.051088602207062164232806511992978915508E12Q,
  391. -2.100849457735620004967624442027793656108E12Q,
  392. -3.767473790774546963588549871673843260569E11Q,
  393. -4.156387497364909963498394522336575984206E10Q,
  394. -2.764021460668011732047778992419118757746E9Q,
  395. -1.036617204107109779944986471142938641399E8Q,
  396. -1.895730886640349026257780896972598305443E6Q,
  397. -1.180509051468390914200720003907727988201E4Q
  398. };
  399. #define NRD4 9
  400. static const __float128 RD4[NRD4 + 1] =
  401. {
  402. -8.172669122056002077809119378047536240889E12Q,
  403. -9.477592426087986751343695251801814226960E12Q,
  404. -4.629448850139318158743900253637212801682E12Q,
  405. -1.237965465892012573255370078308035272942E12Q,
  406. -1.971624313506929845158062177061297598956E11Q,
  407. -1.905434843346570533229942397763361493610E10Q,
  408. -1.089409357680461419743730978512856675984E9Q,
  409. -3.416703082301143192939774401370222822430E7Q,
  410. -4.981791914177103793218433195857635265295E5Q,
  411. -2.192507743896742751483055798411231453733E3Q
  412. /* 1.0E0Q */
  413. };
  414. /* log gamma(x+3) = log gamma(3) + x P(x)/Q(x)
  415. -0.25 <= x <= 0.5
  416. 2.75 <= x+3 <= 3.5
  417. Peak relative error 6.0e-37 */
  418. static const __float128 lgam3a = 6.93145751953125E-1Q;
  419. static const __float128 lgam3b = 1.4286068203094172321214581765680755001344E-6Q;
  420. #define NRN3 9
  421. static const __float128 RN3[NRN3 + 1] =
  422. {
  423. -4.813901815114776281494823863935820876670E11Q,
  424. -8.425592975288250400493910291066881992620E11Q,
  425. -6.228685507402467503655405482985516909157E11Q,
  426. -2.531972054436786351403749276956707260499E11Q,
  427. -6.170200796658926701311867484296426831687E10Q,
  428. -9.211477458528156048231908798456365081135E9Q,
  429. -8.251806236175037114064561038908691305583E8Q,
  430. -4.147886355917831049939930101151160447495E7Q,
  431. -1.010851868928346082547075956946476932162E6Q,
  432. -8.333374463411801009783402800801201603736E3Q
  433. };
  434. #define NRD3 9
  435. static const __float128 RD3[NRD3 + 1] =
  436. {
  437. -5.216713843111675050627304523368029262450E11Q,
  438. -8.014292925418308759369583419234079164391E11Q,
  439. -5.180106858220030014546267824392678611990E11Q,
  440. -1.830406975497439003897734969120997840011E11Q,
  441. -3.845274631904879621945745960119924118925E10Q,
  442. -4.891033385370523863288908070309417710903E9Q,
  443. -3.670172254411328640353855768698287474282E8Q,
  444. -1.505316381525727713026364396635522516989E7Q,
  445. -2.856327162923716881454613540575964890347E5Q,
  446. -1.622140448015769906847567212766206894547E3Q
  447. /* 1.0E0Q */
  448. };
  449. /* log gamma(x+2.5) = log gamma(2.5) + x P(x)/Q(x)
  450. -0.125 <= x <= 0.25
  451. 2.375 <= x+2.5 <= 2.75 */
  452. static const __float128 lgam2r5a = 2.8466796875E-1Q;
  453. static const __float128 lgam2r5b = 1.4901722919159632494669682701924320137696E-5Q;
  454. #define NRN2r5 8
  455. static const __float128 RN2r5[NRN2r5 + 1] =
  456. {
  457. -4.676454313888335499356699817678862233205E9Q,
  458. -9.361888347911187924389905984624216340639E9Q,
  459. -7.695353600835685037920815799526540237703E9Q,
  460. -3.364370100981509060441853085968900734521E9Q,
  461. -8.449902011848163568670361316804900559863E8Q,
  462. -1.225249050950801905108001246436783022179E8Q,
  463. -9.732972931077110161639900388121650470926E6Q,
  464. -3.695711763932153505623248207576425983573E5Q,
  465. -4.717341584067827676530426007495274711306E3Q
  466. };
  467. #define NRD2r5 8
  468. static const __float128 RD2r5[NRD2r5 + 1] =
  469. {
  470. -6.650657966618993679456019224416926875619E9Q,
  471. -1.099511409330635807899718829033488771623E10Q,
  472. -7.482546968307837168164311101447116903148E9Q,
  473. -2.702967190056506495988922973755870557217E9Q,
  474. -5.570008176482922704972943389590409280950E8Q,
  475. -6.536934032192792470926310043166993233231E7Q,
  476. -4.101991193844953082400035444146067511725E6Q,
  477. -1.174082735875715802334430481065526664020E5Q,
  478. -9.932840389994157592102947657277692978511E2Q
  479. /* 1.0E0Q */
  480. };
  481. /* log gamma(x+2) = x P(x)/Q(x)
  482. -0.125 <= x <= +0.375
  483. 1.875 <= x+2 <= 2.375
  484. Peak relative error 4.6e-36 */
  485. #define NRN2 9
  486. static const __float128 RN2[NRN2 + 1] =
  487. {
  488. -3.716661929737318153526921358113793421524E9Q,
  489. -1.138816715030710406922819131397532331321E10Q,
  490. -1.421017419363526524544402598734013569950E10Q,
  491. -9.510432842542519665483662502132010331451E9Q,
  492. -3.747528562099410197957514973274474767329E9Q,
  493. -8.923565763363912474488712255317033616626E8Q,
  494. -1.261396653700237624185350402781338231697E8Q,
  495. -9.918402520255661797735331317081425749014E6Q,
  496. -3.753996255897143855113273724233104768831E5Q,
  497. -4.778761333044147141559311805999540765612E3Q
  498. };
  499. #define NRD2 9
  500. static const __float128 RD2[NRD2 + 1] =
  501. {
  502. -8.790916836764308497770359421351673950111E9Q,
  503. -2.023108608053212516399197678553737477486E10Q,
  504. -1.958067901852022239294231785363504458367E10Q,
  505. -1.035515043621003101254252481625188704529E10Q,
  506. -3.253884432621336737640841276619272224476E9Q,
  507. -6.186383531162456814954947669274235815544E8Q,
  508. -6.932557847749518463038934953605969951466E7Q,
  509. -4.240731768287359608773351626528479703758E6Q,
  510. -1.197343995089189188078944689846348116630E5Q,
  511. -1.004622911670588064824904487064114090920E3Q
  512. /* 1.0E0 */
  513. };
  514. /* log gamma(x+1.75) = log gamma(1.75) + x P(x)/Q(x)
  515. -0.125 <= x <= +0.125
  516. 1.625 <= x+1.75 <= 1.875
  517. Peak relative error 9.2e-37 */
  518. static const __float128 lgam1r75a = -8.441162109375E-2Q;
  519. static const __float128 lgam1r75b = 1.0500073264444042213965868602268256157604E-5Q;
  520. #define NRN1r75 8
  521. static const __float128 RN1r75[NRN1r75 + 1] =
  522. {
  523. -5.221061693929833937710891646275798251513E7Q,
  524. -2.052466337474314812817883030472496436993E8Q,
  525. -2.952718275974940270675670705084125640069E8Q,
  526. -2.132294039648116684922965964126389017840E8Q,
  527. -8.554103077186505960591321962207519908489E7Q,
  528. -1.940250901348870867323943119132071960050E7Q,
  529. -2.379394147112756860769336400290402208435E6Q,
  530. -1.384060879999526222029386539622255797389E5Q,
  531. -2.698453601378319296159355612094598695530E3Q
  532. };
  533. #define NRD1r75 8
  534. static const __float128 RD1r75[NRD1r75 + 1] =
  535. {
  536. -2.109754689501705828789976311354395393605E8Q,
  537. -5.036651829232895725959911504899241062286E8Q,
  538. -4.954234699418689764943486770327295098084E8Q,
  539. -2.589558042412676610775157783898195339410E8Q,
  540. -7.731476117252958268044969614034776883031E7Q,
  541. -1.316721702252481296030801191240867486965E7Q,
  542. -1.201296501404876774861190604303728810836E6Q,
  543. -5.007966406976106636109459072523610273928E4Q,
  544. -6.155817990560743422008969155276229018209E2Q
  545. /* 1.0E0Q */
  546. };
  547. /* log gamma(x+x0) = y0 + x^2 P(x)/Q(x)
  548. -0.0867 <= x <= +0.1634
  549. 1.374932... <= x+x0 <= 1.625032...
  550. Peak relative error 4.0e-36 */
  551. static const __float128 x0a = 1.4616241455078125Q;
  552. static const __float128 x0b = 7.9994605498412626595423257213002588621246E-6Q;
  553. static const __float128 y0a = -1.21490478515625E-1Q;
  554. static const __float128 y0b = 4.1879797753919044854428223084178486438269E-6Q;
  555. #define NRN1r5 8
  556. static const __float128 RN1r5[NRN1r5 + 1] =
  557. {
  558. 6.827103657233705798067415468881313128066E5Q,
  559. 1.910041815932269464714909706705242148108E6Q,
  560. 2.194344176925978377083808566251427771951E6Q,
  561. 1.332921400100891472195055269688876427962E6Q,
  562. 4.589080973377307211815655093824787123508E5Q,
  563. 8.900334161263456942727083580232613796141E4Q,
  564. 9.053840838306019753209127312097612455236E3Q,
  565. 4.053367147553353374151852319743594873771E2Q,
  566. 5.040631576303952022968949605613514584950E0Q
  567. };
  568. #define NRD1r5 8
  569. static const __float128 RD1r5[NRD1r5 + 1] =
  570. {
  571. 1.411036368843183477558773688484699813355E6Q,
  572. 4.378121767236251950226362443134306184849E6Q,
  573. 5.682322855631723455425929877581697918168E6Q,
  574. 3.999065731556977782435009349967042222375E6Q,
  575. 1.653651390456781293163585493620758410333E6Q,
  576. 4.067774359067489605179546964969435858311E5Q,
  577. 5.741463295366557346748361781768833633256E4Q,
  578. 4.226404539738182992856094681115746692030E3Q,
  579. 1.316980975410327975566999780608618774469E2Q,
  580. /* 1.0E0Q */
  581. };
  582. /* log gamma(x+1.25) = log gamma(1.25) + x P(x)/Q(x)
  583. -.125 <= x <= +.125
  584. 1.125 <= x+1.25 <= 1.375
  585. Peak relative error = 4.9e-36 */
  586. static const __float128 lgam1r25a = -9.82818603515625E-2Q;
  587. static const __float128 lgam1r25b = 1.0023929749338536146197303364159774377296E-5Q;
  588. #define NRN1r25 9
  589. static const __float128 RN1r25[NRN1r25 + 1] =
  590. {
  591. -9.054787275312026472896002240379580536760E4Q,
  592. -8.685076892989927640126560802094680794471E4Q,
  593. 2.797898965448019916967849727279076547109E5Q,
  594. 6.175520827134342734546868356396008898299E5Q,
  595. 5.179626599589134831538516906517372619641E5Q,
  596. 2.253076616239043944538380039205558242161E5Q,
  597. 5.312653119599957228630544772499197307195E4Q,
  598. 6.434329437514083776052669599834938898255E3Q,
  599. 3.385414416983114598582554037612347549220E2Q,
  600. 4.907821957946273805080625052510832015792E0Q
  601. };
  602. #define NRD1r25 8
  603. static const __float128 RD1r25[NRD1r25 + 1] =
  604. {
  605. 3.980939377333448005389084785896660309000E5Q,
  606. 1.429634893085231519692365775184490465542E6Q,
  607. 2.145438946455476062850151428438668234336E6Q,
  608. 1.743786661358280837020848127465970357893E6Q,
  609. 8.316364251289743923178092656080441655273E5Q,
  610. 2.355732939106812496699621491135458324294E5Q,
  611. 3.822267399625696880571810137601310855419E4Q,
  612. 3.228463206479133236028576845538387620856E3Q,
  613. 1.152133170470059555646301189220117965514E2Q
  614. /* 1.0E0Q */
  615. };
  616. /* log gamma(x + 1) = x P(x)/Q(x)
  617. 0.0 <= x <= +0.125
  618. 1.0 <= x+1 <= 1.125
  619. Peak relative error 1.1e-35 */
  620. #define NRN1 8
  621. static const __float128 RN1[NRN1 + 1] =
  622. {
  623. -9.987560186094800756471055681088744738818E3Q,
  624. -2.506039379419574361949680225279376329742E4Q,
  625. -1.386770737662176516403363873617457652991E4Q,
  626. 1.439445846078103202928677244188837130744E4Q,
  627. 2.159612048879650471489449668295139990693E4Q,
  628. 1.047439813638144485276023138173676047079E4Q,
  629. 2.250316398054332592560412486630769139961E3Q,
  630. 1.958510425467720733041971651126443864041E2Q,
  631. 4.516830313569454663374271993200291219855E0Q
  632. };
  633. #define NRD1 7
  634. static const __float128 RD1[NRD1 + 1] =
  635. {
  636. 1.730299573175751778863269333703788214547E4Q,
  637. 6.807080914851328611903744668028014678148E4Q,
  638. 1.090071629101496938655806063184092302439E5Q,
  639. 9.124354356415154289343303999616003884080E4Q,
  640. 4.262071638655772404431164427024003253954E4Q,
  641. 1.096981664067373953673982635805821283581E4Q,
  642. 1.431229503796575892151252708527595787588E3Q,
  643. 7.734110684303689320830401788262295992921E1Q
  644. /* 1.0E0 */
  645. };
  646. /* log gamma(x + 1) = x P(x)/Q(x)
  647. -0.125 <= x <= 0
  648. 0.875 <= x+1 <= 1.0
  649. Peak relative error 7.0e-37 */
  650. #define NRNr9 8
  651. static const __float128 RNr9[NRNr9 + 1] =
  652. {
  653. 4.441379198241760069548832023257571176884E5Q,
  654. 1.273072988367176540909122090089580368732E6Q,
  655. 9.732422305818501557502584486510048387724E5Q,
  656. -5.040539994443998275271644292272870348684E5Q,
  657. -1.208719055525609446357448132109723786736E6Q,
  658. -7.434275365370936547146540554419058907156E5Q,
  659. -2.075642969983377738209203358199008185741E5Q,
  660. -2.565534860781128618589288075109372218042E4Q,
  661. -1.032901669542994124131223797515913955938E3Q,
  662. };
  663. #define NRDr9 8
  664. static const __float128 RDr9[NRDr9 + 1] =
  665. {
  666. -7.694488331323118759486182246005193998007E5Q,
  667. -3.301918855321234414232308938454112213751E6Q,
  668. -5.856830900232338906742924836032279404702E6Q,
  669. -5.540672519616151584486240871424021377540E6Q,
  670. -3.006530901041386626148342989181721176919E6Q,
  671. -9.350378280513062139466966374330795935163E5Q,
  672. -1.566179100031063346901755685375732739511E5Q,
  673. -1.205016539620260779274902967231510804992E4Q,
  674. -2.724583156305709733221564484006088794284E2Q
  675. /* 1.0E0 */
  676. };
  677. /* Evaluate P[n] x^n + P[n-1] x^(n-1) + ... + P[0] */
  678. static __float128
  679. neval (__float128 x, const __float128 *p, int n)
  680. {
  681. __float128 y;
  682. p += n;
  683. y = *p--;
  684. do
  685. {
  686. y = y * x + *p--;
  687. }
  688. while (--n > 0);
  689. return y;
  690. }
  691. /* Evaluate x^n+1 + P[n] x^(n) + P[n-1] x^(n-1) + ... + P[0] */
  692. static __float128
  693. deval (__float128 x, const __float128 *p, int n)
  694. {
  695. __float128 y;
  696. p += n;
  697. y = x + *p--;
  698. do
  699. {
  700. y = y * x + *p--;
  701. }
  702. while (--n > 0);
  703. return y;
  704. }
  705. __float128
  706. lgammaq (__float128 x)
  707. {
  708. __float128 p, q, w, z, nx;
  709. int i, nn;
  710. #ifndef HAVE_MATH_H_SIGNGAM
  711. int signgam;
  712. #endif
  713. signgam = 1;
  714. if (! finiteq (x))
  715. return x * x;
  716. if (x == 0.0Q)
  717. {
  718. if (signbitq (x))
  719. signgam = -1;
  720. }
  721. if (x < 0.0Q)
  722. {
  723. q = -x;
  724. p = floorq (q);
  725. if (p == q)
  726. return (one / (p - p));
  727. i = p;
  728. if ((i & 1) == 0)
  729. signgam = -1;
  730. else
  731. signgam = 1;
  732. z = q - p;
  733. if (z > 0.5Q)
  734. {
  735. p += 1.0Q;
  736. z = p - q;
  737. }
  738. z = q * sinq (PIQ * z);
  739. if (z == 0.0Q)
  740. return (signgam * huge * huge);
  741. w = lgammaq (q);
  742. z = logq (PIQ / z) - w;
  743. return (z);
  744. }
  745. if (x < 13.5Q)
  746. {
  747. p = 0.0Q;
  748. nx = floorq (x + 0.5Q);
  749. nn = nx;
  750. switch (nn)
  751. {
  752. case 0:
  753. /* log gamma (x + 1) = log(x) + log gamma(x) */
  754. if (x <= 0.125)
  755. {
  756. p = x * neval (x, RN1, NRN1) / deval (x, RD1, NRD1);
  757. }
  758. else if (x <= 0.375)
  759. {
  760. z = x - 0.25Q;
  761. p = z * neval (z, RN1r25, NRN1r25) / deval (z, RD1r25, NRD1r25);
  762. p += lgam1r25b;
  763. p += lgam1r25a;
  764. }
  765. else if (x <= 0.625)
  766. {
  767. z = x + (1.0Q - x0a);
  768. z = z - x0b;
  769. p = neval (z, RN1r5, NRN1r5) / deval (z, RD1r5, NRD1r5);
  770. p = p * z * z;
  771. p = p + y0b;
  772. p = p + y0a;
  773. }
  774. else if (x <= 0.875)
  775. {
  776. z = x - 0.75Q;
  777. p = z * neval (z, RN1r75, NRN1r75) / deval (z, RD1r75, NRD1r75);
  778. p += lgam1r75b;
  779. p += lgam1r75a;
  780. }
  781. else
  782. {
  783. z = x - 1.0Q;
  784. p = z * neval (z, RN2, NRN2) / deval (z, RD2, NRD2);
  785. }
  786. p = p - logq (x);
  787. break;
  788. case 1:
  789. if (x < 0.875Q)
  790. {
  791. if (x <= 0.625)
  792. {
  793. z = x + (1.0Q - x0a);
  794. z = z - x0b;
  795. p = neval (z, RN1r5, NRN1r5) / deval (z, RD1r5, NRD1r5);
  796. p = p * z * z;
  797. p = p + y0b;
  798. p = p + y0a;
  799. }
  800. else if (x <= 0.875)
  801. {
  802. z = x - 0.75Q;
  803. p = z * neval (z, RN1r75, NRN1r75)
  804. / deval (z, RD1r75, NRD1r75);
  805. p += lgam1r75b;
  806. p += lgam1r75a;
  807. }
  808. else
  809. {
  810. z = x - 1.0Q;
  811. p = z * neval (z, RN2, NRN2) / deval (z, RD2, NRD2);
  812. }
  813. p = p - logq (x);
  814. }
  815. else if (x < 1.0Q)
  816. {
  817. z = x - 1.0Q;
  818. p = z * neval (z, RNr9, NRNr9) / deval (z, RDr9, NRDr9);
  819. }
  820. else if (x == 1.0Q)
  821. p = 0.0Q;
  822. else if (x <= 1.125Q)
  823. {
  824. z = x - 1.0Q;
  825. p = z * neval (z, RN1, NRN1) / deval (z, RD1, NRD1);
  826. }
  827. else if (x <= 1.375)
  828. {
  829. z = x - 1.25Q;
  830. p = z * neval (z, RN1r25, NRN1r25) / deval (z, RD1r25, NRD1r25);
  831. p += lgam1r25b;
  832. p += lgam1r25a;
  833. }
  834. else
  835. {
  836. /* 1.375 <= x+x0 <= 1.625 */
  837. z = x - x0a;
  838. z = z - x0b;
  839. p = neval (z, RN1r5, NRN1r5) / deval (z, RD1r5, NRD1r5);
  840. p = p * z * z;
  841. p = p + y0b;
  842. p = p + y0a;
  843. }
  844. break;
  845. case 2:
  846. if (x < 1.625Q)
  847. {
  848. z = x - x0a;
  849. z = z - x0b;
  850. p = neval (z, RN1r5, NRN1r5) / deval (z, RD1r5, NRD1r5);
  851. p = p * z * z;
  852. p = p + y0b;
  853. p = p + y0a;
  854. }
  855. else if (x < 1.875Q)
  856. {
  857. z = x - 1.75Q;
  858. p = z * neval (z, RN1r75, NRN1r75) / deval (z, RD1r75, NRD1r75);
  859. p += lgam1r75b;
  860. p += lgam1r75a;
  861. }
  862. else if (x == 2.0Q)
  863. p = 0.0Q;
  864. else if (x < 2.375Q)
  865. {
  866. z = x - 2.0Q;
  867. p = z * neval (z, RN2, NRN2) / deval (z, RD2, NRD2);
  868. }
  869. else
  870. {
  871. z = x - 2.5Q;
  872. p = z * neval (z, RN2r5, NRN2r5) / deval (z, RD2r5, NRD2r5);
  873. p += lgam2r5b;
  874. p += lgam2r5a;
  875. }
  876. break;
  877. case 3:
  878. if (x < 2.75)
  879. {
  880. z = x - 2.5Q;
  881. p = z * neval (z, RN2r5, NRN2r5) / deval (z, RD2r5, NRD2r5);
  882. p += lgam2r5b;
  883. p += lgam2r5a;
  884. }
  885. else
  886. {
  887. z = x - 3.0Q;
  888. p = z * neval (z, RN3, NRN3) / deval (z, RD3, NRD3);
  889. p += lgam3b;
  890. p += lgam3a;
  891. }
  892. break;
  893. case 4:
  894. z = x - 4.0Q;
  895. p = z * neval (z, RN4, NRN4) / deval (z, RD4, NRD4);
  896. p += lgam4b;
  897. p += lgam4a;
  898. break;
  899. case 5:
  900. z = x - 5.0Q;
  901. p = z * neval (z, RN5, NRN5) / deval (z, RD5, NRD5);
  902. p += lgam5b;
  903. p += lgam5a;
  904. break;
  905. case 6:
  906. z = x - 6.0Q;
  907. p = z * neval (z, RN6, NRN6) / deval (z, RD6, NRD6);
  908. p += lgam6b;
  909. p += lgam6a;
  910. break;
  911. case 7:
  912. z = x - 7.0Q;
  913. p = z * neval (z, RN7, NRN7) / deval (z, RD7, NRD7);
  914. p += lgam7b;
  915. p += lgam7a;
  916. break;
  917. case 8:
  918. z = x - 8.0Q;
  919. p = z * neval (z, RN8, NRN8) / deval (z, RD8, NRD8);
  920. p += lgam8b;
  921. p += lgam8a;
  922. break;
  923. case 9:
  924. z = x - 9.0Q;
  925. p = z * neval (z, RN9, NRN9) / deval (z, RD9, NRD9);
  926. p += lgam9b;
  927. p += lgam9a;
  928. break;
  929. case 10:
  930. z = x - 10.0Q;
  931. p = z * neval (z, RN10, NRN10) / deval (z, RD10, NRD10);
  932. p += lgam10b;
  933. p += lgam10a;
  934. break;
  935. case 11:
  936. z = x - 11.0Q;
  937. p = z * neval (z, RN11, NRN11) / deval (z, RD11, NRD11);
  938. p += lgam11b;
  939. p += lgam11a;
  940. break;
  941. case 12:
  942. z = x - 12.0Q;
  943. p = z * neval (z, RN12, NRN12) / deval (z, RD12, NRD12);
  944. p += lgam12b;
  945. p += lgam12a;
  946. break;
  947. case 13:
  948. z = x - 13.0Q;
  949. p = z * neval (z, RN13, NRN13) / deval (z, RD13, NRD13);
  950. p += lgam13b;
  951. p += lgam13a;
  952. break;
  953. }
  954. return p;
  955. }
  956. if (x > MAXLGM)
  957. return (signgam * huge * huge);
  958. q = ls2pi - x;
  959. q = (x - 0.5Q) * logq (x) + q;
  960. if (x > 1.0e18Q)
  961. return (q);
  962. p = 1.0Q / (x * x);
  963. q += neval (p, RASY, NRASY) / x;
  964. return (q);
  965. }