Hi,

I've noticed some inconsistancies with Math.sqrt(-1).  Here's what the
rdoc in math.c says:

/*
 *  call-seq:
 *     Math.sqrt(numeric)    => float
 *
 *  Returns the non-negative square root of <i>numeric</i>. Raises
 *  <code>ArgError</code> if <i>numeric</i> is less than zero.
 */

On Gentoo Linux PPC:
 > ruby -v
   ruby 1.8.2 (2004-12-25) [powerpc-linux]
 > ruby -e "p Math.sqrt(-1)"
   -e:1:in `sqrt': Numerical argument out of domain - sqrt (Errno::EDOM)
      	   from -e:1

On Windows 2000:
 > ruby -v
   ruby 1.8.2 (2004-12-25) [i386-mswin32]
 > ruby -e "p Math.sqrt(-1)"
   -e:1:in `sqrt': Domain error - sqrt (Errno::EDOM)
        from -e:1

On Cygwin:
 > ruby -v
   ruby 1.8.2 (2004-12-25) [i386-cygwin]
 > ruby -e "p Math.sqrt(-1)"
   -e:1:in `sqrt': Numerical argument out of domain - sqrt (Errno::EDOM)
        from -e:1

On FreeBSD 5.3
 > ruby -v
   ruby 1.8.2 (2004-07-29) [i386-freebsd5]
 > ruby -e "p Math.sqrt(-1)"
   NaN

Two of my friends tested it on a couple of other platforms, Mac OSX
returns "NaN", x86 Linux and Solaris throw the Errno::EDOM error.

So, it appears that the sqrt() the *BSDs (at least, FreeBSD and Mac OSX) use
does not set errno.  My friend thinks that you have to use fegetexceptflag() or
something like that to check for floating-point exceptions on *BSDs.

The math_sqrt function in math.c is the same in ruby 1.8.1, 1.8.2, and the CVS
HEAD.  ruby 1.6.8's math_sqrt() is similiar, but it does check if the parameter
is negative and throws an ArgumentError if it is negative.  Here's the 1.6.8
source:
      if (RFLOAT(x)->value < 0.0) rb_raise(rb_eArgError, "square root for negative number");

Maybe that line should be re-added?  If not, maybe the rdoc should be updated
to say something like "This function runs your libc sqrt function.  If that
function sets errno, an exception is raised.  This may or may not raise an
exception if numeric is negative."  Or perhaps there needs to be a new way to
look for floating point exceptions on the *BSDs.

I have no idea what the Right(TM) solution is :-)  I figured you gurus here
would know.

Jeff