Hi, On Thu, Feb 18, 2010 at 12:31 PM, Kenta Murata <muraken / gmail.com> wrote: > lgamma(x) is defined as log(fabs(tgamma(x))). > SUSv3 defines that lgamma(-INFINITY) is +INFINITY > though tgamma(-INFINITY) is defined a domain error. > > Do you think what does Math.lgamma(-Float::INFINITY) return? Indeed, it makes no mathematical sense that Math.lgamma(-Float::INFINITY) return +INFINITY. Since lgamma oscillates wildly for negative arguments, it should return NaN or raise an error, same as tgamma. > I try to write a patch for atanh, log, log2, log10, and sqrt > according to the following policies: > > (1) Pick up domain and pole error cases before calling actual C functions. > (2) Returns NAN if a domain error is picked up. Are you proposing to never raise an error for any domain errors and instead returning NaN? I am a bit confused here, since you suggest a bit afterwardsto create a new error class Math::DomainError. > (3) Returns INFINITY with suitable flag if a pole error is picked up. Returning +-INFINITY is great. What "suitable flag" did you have in mind? > ... > diff --git a/math.c b/math.c > ... The patch posted is a great step in the right direction. Some care has to be taken with -0.0. I completely understand why you feel that Log(-0.0) should return NaN. IEEE decided it was wiser to return -Infinity, though. It can be argued that having an actual value that could be exact is more useful than a NaN. On the other hand, don't ask me why IEEE decided that Sqrt(-0.0) == -0.0 instead of +0.0, I have no clue!