]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/commit
The value small=2**-(p+3), where p is the precision, can be determine from
authorkargl <kargl@FreeBSD.org>
Thu, 9 Oct 2014 22:39:52 +0000 (22:39 +0000)
committerkargl <kargl@FreeBSD.org>
Thu, 9 Oct 2014 22:39:52 +0000 (22:39 +0000)
commit8a978711f200d55ba1fe58b520d91bea1a98e4c3
tree213dcf8a03f79d33a7dc294bc16c9c245d80d2eb
parent61ddedd3c6dfda7114feb4d46eddc2be44de304b
The value small=2**-(p+3), where p is the precision, can be determine from
lgamma(x) = -log(x) - log(1+x) + x*(1-g) + x**2*P(x) with g = 0.57...
being the Euler constant and P(x) a polynomial.  Substitution of small
into the RHS shows that the last 3 terms are negligible in comparison to
the leading term.  The choice of 3 may be conservative.

The value large=2**(p+3) is detemined from Stirling's approximation
lgamma(x) = x*(log(x)-1) - log(x)/2 + log(2*pi)/2 + P(1/x)/x
Again, substitution of large into the RHS reveals the last 3 terms
are negligible in comparison to the leading term.

Move the x=+-0 special case into the |x|<small block.

In the ld80 and ld128 implementaion, use fdlibm compatible comparisons
involving ix, lx, and llx.  This replaces several floating point
comparisons (some involving fabsl()) and also fixes the special cases
x=1 and x=2.

While here
  . Remove unnecessary parentheses.
  . Fix/improve comments due to the above changes.
  . Fix nearby whitespace.

* src/e_lgamma_r.c:
  . Sort declaration.
  . Remove unneeded explicit cast for type conversion.
  . Replace a double literal constant by an integer literal constant.

* src/e_lgammaf_r.c:
  . Sort declaration.

* ld128/e_lgammal_r.c:
  . Replace a long double literal constant by a double literal constant.

* ld80/e_lgammal_r.c:
  . Remove unused '#include float.h'
  . Replace a long double literal constant by a double literal constant.

Requested by: bde
lib/msun/ld128/e_lgammal_r.c
lib/msun/ld80/e_lgammal_r.c
lib/msun/src/e_lgamma_r.c
lib/msun/src/e_lgammaf_r.c