/**
 * This file has no copyright assigned and is placed in the Public Domain.
 * This file is part of the w64 mingw-runtime package.
 * No warranty is given; refer to the file DISCLAIMER.PD within this package.
 */
#include "cephes_mconf.h"

#if UNK
static uLD S[9] = {
  { { -1.193945051381510095614E-3L } },
  { {  7.220599478036909672331E-3L } },
  { { -9.622023360406271645744E-3L } },
  { { -4.219773360705915470089E-2L } },
  { {  1.665386113720805206758E-1L } },
  { { -4.200263503403344054473E-2L } },
  { { -6.558780715202540684668E-1L } },
  { {  5.772156649015328608253E-1L } },
  { {  1.000000000000000000000E0L } }
};
#endif
#if IBMPC
static const uLD S[] = {
  { { 0xbaeb,0xd6d3,0x25e5,0x9c7e,0xbff5, 0, 0, 0 } },
  { { 0xfe9a,0xceb4,0xc74e,0xec9a,0x3ff7, 0, 0, 0 } },
  { { 0x9225,0xdfef,0xb0e9,0x9da5,0xbff8, 0, 0, 0 } },
  { { 0x10b0,0xec17,0x87dc,0xacd7,0xbffa, 0, 0, 0 } },
  { { 0x6b8d,0x7515,0x1905,0xaa89,0x3ffc, 0, 0, 0 } },
  { { 0xf183,0x126b,0xf47d,0xac0a,0xbffa, 0, 0, 0 } },
  { { 0x7bf6,0x57d1,0xa013,0xa7e7,0xbffe, 0, 0, 0 } },
  { { 0xc7a9,0x7db0,0x67e3,0x93c4,0x3ffe, 0, 0, 0 } },
  { { 0x0000,0x0000,0x0000,0x8000,0x3fff, 0, 0, 0 } }
};
#endif
#if MIEEE
static uLD S[27] = {
  { { 0xbff50000,0x9c7e25e5,0xd6d3baeb, 0 } },
  { { 0x3ff70000,0xec9ac74e,0xceb4fe9a, 0 } },
  { { 0xbff80000,0x9da5b0e9,0xdfef9225, 0 } },
  { { 0xbffa0000,0xacd787dc,0xec1710b0, 0 } },
  { { 0x3ffc0000,0xaa891905,0x75156b8d, 0 } },
  { { 0xbffa0000,0xac0af47d,0x126bf183, 0 } },
  { { 0xbffe0000,0xa7e7a013,0x57d17bf6, 0 } },
  { { 0x3ffe0000,0x93c467e3,0x7db0c7a9, 0 } },
  { { 0x3fff0000,0x80000000,0x00000000, 0 } }
};
#endif

#if UNK
static uLD SN[9] = {
  { {  1.133374167243894382010E-3L } },
  { {  7.220837261893170325704E-3L } },
  { {  9.621911155035976733706E-3L } },
  { { -4.219773343731191721664E-2L } },
  { { -1.665386113944413519335E-1L } },
  { { -4.200263503402112910504E-2L } },
  { {  6.558780715202536547116E-1L } },
  { {  5.772156649015328608727E-1L } },
  { { -1.000000000000000000000E0L } }
};
#endif
#if IBMPC
static const uLD SN[] = {
  { { 0x5dd1,0x02de,0xb9f7,0x948d,0x3ff5, 0, 0, 0 } },
  { { 0x989b,0xdd68,0xc5f1,0xec9c,0x3ff7, 0, 0, 0 } },
  { { 0x2ca1,0x18f0,0x386f,0x9da5,0x3ff8, 0, 0, 0 } },
  { { 0x783f,0x41dd,0x87d1,0xacd7,0xbffa, 0, 0, 0 } },
  { { 0x7a5b,0xd76d,0x1905,0xaa89,0xbffc, 0, 0, 0 } },
  { { 0x7f64,0x1234,0xf47d,0xac0a,0xbffa, 0, 0, 0 } },
  { { 0x5e26,0x57d1,0xa013,0xa7e7,0x3ffe, 0, 0, 0 } },
  { { 0xc7aa,0x7db0,0x67e3,0x93c4,0x3ffe, 0, 0, 0 } },
  { { 0x0000,0x0000,0x0000,0x8000,0xbfff, 0, 0, 0 } }
};
#endif
#if MIEEE
static uLD SN[] = {
  { { 0x3ff50000,0x948db9f7,0x02de5dd1, 0 } },
  { { 0x3ff70000,0xec9cc5f1,0xdd68989b, 0 } },
  { { 0x3ff80000,0x9da5386f,0x18f02ca1, 0 } },
  { { 0xbffa0000,0xacd787d1,0x41dd783f, 0 } },
  { { 0xbffc0000,0xaa891905,0xd76d7a5b, 0 } },
  { { 0xbffa0000,0xac0af47d,0x12347f64, 0 } },
  { { 0x3ffe0000,0xa7e7a013,0x57d15e26, 0 } },
  { { 0x3ffe0000,0x93c467e3,0x7db0c7aa, 0 } },
  { { 0xbfff0000,0x80000000,0x00000000, 0 } }
};
#endif


/* A[]: Stirling's formula expansion of log gamma
 * B[], C[]: log gamma function between 2 and 3
 */


/* log gamma(x) = ( x - 0.5 ) * log(x) - x + LS2PI + 1/x A(1/x^2)
 * x >= 8
 * Peak relative error 1.51e-21
 * Relative spread of error peaks 5.67e-21
 */
#if UNK
static uLD A[7] = {
  { {  4.885026142432270781165E-3L } },
  { { -1.880801938119376907179E-3L } },
  { {  8.412723297322498080632E-4L } },
  { { -5.952345851765688514613E-4L } },
  { {  7.936507795855070755671E-4L } },
  { { -2.777777777750349603440E-3L } },
  { {  8.333333333333331447505E-2L } }
};
#endif
#if IBMPC
static const uLD A[] = {
  { { 0xd984,0xcc08,0x91c2,0xa012,0x3ff7, 0, 0, 0 } },
  { { 0x3d91,0x0304,0x3da1,0xf685,0xbff5, 0, 0, 0 } },
  { { 0x3bdc,0xaad1,0xd492,0xdc88,0x3ff4, 0, 0, 0 } },
  { { 0x8b20,0x9fce,0x844e,0x9c09,0xbff4, 0, 0, 0 } },
  { { 0xf8f2,0x30e5,0x0092,0xd00d,0x3ff4, 0, 0, 0 } },
  { { 0x4d88,0x03a8,0x60b6,0xb60b,0xbff6, 0, 0, 0 } },
  { { 0x9fcc,0xaaaa,0xaaaa,0xaaaa,0x3ffb, 0, 0, 0 } }
};
#endif
#if MIEEE
static uLD A[] = {
  { { 0x3ff70000,0xa01291c2,0xcc08d984, 0 } },
  { { 0xbff50000,0xf6853da1,0x03043d91, 0 } },
  { { 0x3ff40000,0xdc88d492,0xaad13bdc, 0 } },
  { { 0xbff40000,0x9c09844e,0x9fce8b20, 0 } },
  { { 0x3ff40000,0xd00d0092,0x30e5f8f2, 0 } },
  { { 0xbff60000,0xb60b60b6,0x03a84d88, 0 } },
  { { 0x3ffb0000,0xaaaaaaaa,0xaaaa9fcc, 0 } }
};
#endif

/* log gamma(x+2) = x B(x)/C(x)
 * 0 <= x <= 1
 * Peak relative error 7.16e-22
 * Relative spread of error peaks 4.78e-20
 */
#if UNK
static uLD B[7] = {
  { { -2.163690827643812857640E3L } },
  { { -8.723871522843511459790E4L } },
  { { -1.104326814691464261197E6L } },
  { { -6.111225012005214299996E6L } },
  { { -1.625568062543700591014E7L } },
  { { -2.003937418103815175475E7L } },
  { { -8.875666783650703802159E6L } }
};
static uLD C[7] = {
  { { -5.139481484435370143617E2L } },
  { { -3.403570840534304670537E4L } },
  { { -6.227441164066219501697E5L } },
  { { -4.814940379411882186630E6L } },
  { { -1.785433287045078156959E7L } },
  { { -3.138646407656182662088E7L } },
  { { -2.099336717757895876142E7L } }
};
#endif
#if IBMPC
static const uLD B[] = {
  { { 0x9557,0x4995,0x0da1,0x873b,0xc00a, 0, 0, 0 } },
  { { 0xfe44,0x9af8,0x5b8c,0xaa63,0xc00f, 0, 0, 0 } },
  { { 0x5aa8,0x7cf5,0x3684,0x86ce,0xc013, 0, 0, 0 } },
  { { 0x259a,0x258c,0xf206,0xba7f,0xc015, 0, 0, 0 } },
  { { 0xbe18,0x1ca3,0xc0a0,0xf80a,0xc016, 0, 0, 0 } },
  { { 0x168f,0x2c42,0x6717,0x98e3,0xc017, 0, 0, 0 } },
  { { 0x2051,0x9d55,0x92c8,0x876e,0xc016, 0, 0, 0 } }
};
static const uLD C[] = {
  { { 0xaa77,0xcf2f,0xae76,0x807c,0xc008, 0, 0, 0 } },
  { { 0xb280,0x0d74,0xb55a,0x84f3,0xc00e, 0, 0, 0 } },
  { { 0xa505,0xcd30,0x81dc,0x9809,0xc012, 0, 0, 0 } },
  { { 0x3369,0x4246,0xb8c2,0x92f0,0xc015, 0, 0, 0 } },
  { { 0x63cf,0x6aee,0xbe6f,0x8837,0xc017, 0, 0, 0 } },
  { { 0x26bb,0xccc7,0xb009,0xef75,0xc017, 0, 0, 0 } },
  { { 0x462b,0xbae8,0xab96,0xa02a,0xc017, 0, 0, 0 } }
};
#endif
#if MIEEE
static uLD B[] = {
  { { 0xc00a0000,0x873b0da1,0x49959557, 0 } },
  { { 0xc00f0000,0xaa635b8c,0x9af8fe44, 0 } },
  { { 0xc0130000,0x86ce3684,0x7cf55aa8, 0 } },
  { { 0xc0150000,0xba7ff206,0x258c259a, 0 } },
  { { 0xc0160000,0xf80ac0a0,0x1ca3be18, 0 } },
  { { 0xc0170000,0x98e36717,0x2c42168f, 0 } },
  { { 0xc0160000,0x876e92c8,0x9d552051, 0 } }
};
static uLD C[] = {
  { { 0xc0080000,0x807cae76,0xcf2faa77, 0 } },
  { { 0xc00e0000,0x84f3b55a,0x0d74b280, 0 } },
  { { 0xc0120000,0x980981dc,0xcd30a505, 0 } },
  { { 0xc0150000,0x92f0b8c2,0x42463369, 0 } },
  { { 0xc0170000,0x8837be6f,0x6aee63cf, 0 } },
  { { 0xc0170000,0xef75b009,0xccc726bb, 0 } },
  { { 0xc0170000,0xa02aab96,0xbae8462b, 0 } }
};
#endif

/* log( sqrt( 2*pi ) ) */
static const long double LS2PI  =  0.91893853320467274178L;
#define MAXLGM 1.04848146839019521116e+4928L


/* Logarithm of gamma function */
/* Reentrant version */ 
long double __lgammal_r(long double x, int* sgngaml);

long double __lgammal_r(long double x, int* sgngaml)
{
	long double p, q, w, z, f, nx;
	int i;

	*sgngaml = 1;
#ifdef NANS
	if (isnanl(x))
		return(NANL);
#endif
#ifdef INFINITIES
	if (!isfinitel(x))
		return (INFINITYL);
#endif
	if (x < -34.0L)
	{
		q = -x;
		w = __lgammal_r(q, sgngaml); /* note this modifies sgngam! */
		p = floorl(q);
		if (p == q)
		{
lgsing:
			_SET_ERRNO(EDOM);
			mtherr( "lgammal", SING );
#ifdef INFINITIES
			return (INFINITYL);
#else
			return (MAXNUML);
#endif
		}
		i = p;
		if ((i & 1) == 0)
			*sgngaml = -1;
		else
			*sgngaml = 1;
		z = q - p;
		if (z > 0.5L)
		{
			p += 1.0L;
			z = p - q;
		}
		z = q * sinl(PIL * z);
		if (z == 0.0L)
			goto lgsing;
	/*	z = LOGPI - logl( z ) - w; */
		z = logl(PIL/z) - w;
		return (z);
	}

	if (x < 13.0L)
	{
		z = 1.0L;
		nx = floorl(x +  0.5L);
		f = x - nx;
		while (x >= 3.0L)
		{
			nx -= 1.0L;
			x = nx + f;
			z *= x;
		}
		while (x < 2.0L)
		{
			if (fabsl(x) <= 0.03125)
				goto lsmall;
			z /= nx +  f;
			nx += 1.0L;
			x = nx + f;
		}
		if (z < 0.0L)
		{
			*sgngaml = -1;
			z = -z;
		}
		else
			*sgngaml = 1;
		if (x == 2.0L)
			return ( logl(z) );
		x = (nx - 2.0L) + f;
		p = x * polevll(x, B, 6) / p1evll(x, C, 7);
		return ( logl(z) + p );
	}

	if (x > MAXLGM)
	{
		_SET_ERRNO(ERANGE);
		mtherr("lgammal", OVERFLOW);
#ifdef INFINITIES
		return (*sgngaml * INFINITYL);
#else
		return (*sgngaml * MAXNUML);
#endif
	}

	q = (x - 0.5L) * logl(x) - x + LS2PI;
	if (x > 1.0e10L)
		return(q);
	p = 1.0L/(x*x);
	q += polevll(p, A, 6) / x;
	return (q);

lsmall:
	if (x == 0.0L)
		goto lgsing;
	if (x < 0.0L)
	{
		x = -x;
		q = z / (x * polevll(x, SN, 8));
	}
	else
		q = z / (x * polevll(x, S, 8));
	if (q < 0.0L)
	{
		*sgngaml = -1;
		q = -q;
	}
	else
		*sgngaml = 1;
	q = logl(q);
	return (q);
}

/* This is the C99 version */
long double lgammal(long double x)
{
	int local_sgngaml = 0;
	return (__lgammal_r(x, &local_sgngaml));
}

