]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/commit
The value small=2**-(p+3), where p is the precision, can be determine from
authorSteve Kargl <kargl@FreeBSD.org>
Thu, 9 Oct 2014 22:39:52 +0000 (22:39 +0000)
committerSteve Kargl <kargl@FreeBSD.org>
Thu, 9 Oct 2014 22:39:52 +0000 (22:39 +0000)
commita4e4b355f45538a9b9550df744ca43787fd43c93
tree213dcf8a03f79d33a7dc294bc16c9c245d80d2eb
parenta0a9e1b57c884ad07e539980d53ea4cc0ee0700f
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