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!