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