OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [libquadmath/] [math/] [lgammaq.c] - Blame information for rev 740

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.