Dear R users, I have to calculate gamma functions for negative numbers beyond -171.4. e.x. gamma(-500.4) I got following:> gamma(-170.4)[1] -5.824625e-308> gamma(-171.4)[1] 0 Warning message: underflow occurred in 'gammafn' I have tried to use a recursion getting values a little futher -180. How could I solve this problem? Thank you beforehand. Chuse.
On 09/02/2011 10:23 AM, Chuse chuse wrote:> Dear R users, > > I have to calculate gamma functions for negative numbers beyond -171.4. > e.x. gamma(-500.4) > I got following: > > > gamma(-170.4) > [1] -5.824625e-308 > > gamma(-171.4) > [1] 0 > Warning message: > underflow occurred in 'gammafn' > > I have tried to use a recursion getting values a little futher -180. > How could I solve this problem? Thank you beforehand.Use the lgamma function. Duncan Murdoch
Have you considered: (lg.170.4 <- lgamma(-170.4)) (lg.171.4 <- lgamma(-171.4)) The problem is documented with ".Machine$double.xmin" Hope this helps, Spencer On 2/9/2011 7:23 AM, Chuse chuse wrote:> Dear R users, > > I have to calculate gamma functions for negative numbers beyond -171.4. > e.x. gamma(-500.4) > I got following: > >> gamma(-170.4) > [1] -5.824625e-308 >> gamma(-171.4) > [1] 0 > Warning message: > underflow occurred in 'gammafn' > > I have tried to use a recursion getting values a little futher -180. > How could I solve this problem? Thank you beforehand. > > Chuse. > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code.
On Wed, Feb 09, 2011 at 05:23:27PM +0200, Chuse chuse wrote:> Dear R users, > > I have to calculate gamma functions for negative numbers beyond -171.4. > e.x. gamma(-500.4) > I got following: > > > gamma(-170.4) > [1] -5.824625e-308 > > gamma(-171.4) > [1] 0 > Warning message: > underflow occurred in 'gammafn' > > I have tried to use a recursion getting values a little futher -180. > How could I solve this problem? Thank you beforehand.Hello. As others pointed out, the function lgamma() should be used. If the accuracy of double precision is not sufficient or in case of doubt concerning accuracy in extreme cases, Rmpfr package may be used. In this case, we get x <- c(-171.4, -170.4) y1 <- lgamma(x) y1 [1] -712.5781 -707.4341 library(Rmpfr) y2 <- lgamma(mpfr(x, precBits=200)) y1 - y2 2 'mpfr' numbers of precision 200 bits [1] -8.0100329934347335532420397139357516023505624051256280109870069e-14 [2] -1.0849741205998334826524274950211713854549088941953001164911718e-13 Hope this helps. Petr Savicky.