Hi,

Ruby 1.8.5 p12
Windows XP Pro SP 2 and Solaris 10

I noticed that, based on the Changelog, the domain_check() helper
function was added to math.c to see if isnan() returns true and, if it
does, an Errno::ERANGE or Errno::EDOM error is raised. Otherwise, a
method will return "Infinity". But, there seems to be a discrepancy
between UNIX and MS Windows.

For example:

irb(main):001:0> RUBY_PLATFORM
=> "i386-mswin32_80"

irb(main):002:0> Math.atanh(1)
=> Infinity # ???

irb(main):003:0> Math.atanh(1.01)
Errno::EDOM: Domain error - atanh

irb(main):001:0> RUBY_PLATFORM
=> "sparc-solaris2.10"

irb(main):002:0> Math.atanh(1)
Errno::ERANGE: Result too large - atanh

irb(main):003:0> Math.atanh(1.01)
Errno::EDOM: Argument out of domain - atanh

If this is a bug, then what about the following patch?

--- acosh.orig  Sat Oct 18 08:04:18 2003
+++ acosh.c     Fri Feb 02 13:25:11 2007
@@ -81,7 +81,7 @@
     double z = fabs(x);

     if (z < SMALL_CRITERIA) return x;
-    z = log(z > 1 ? -1 : (1 + z) / (1 - z)) / 2;
+    z = log(z >= 1 ? -1 : (1 + z) / (1 - z)) / 2;
     if (neg) z = -z;
     return z;
 }

That will force an Errno::EDOM error if x is 1 or -1 at least.

Or is this a bug in MS Windows? I ask because the following does *not*
set errno:

#include <math.h>
#include <stdio.h>
#include <errno.h>

double atanh(double);

int main(){
   double x = atanh(1);

   if(errno)
      printf("ERROR: %i\n", errno);
   else
      printf("NO ERROR\n");

   printf("ATANH: %e\n", x);

   return 0;
}

double atanh(double x){
   return log((1 + x) / (1 - x)) / 2;
}

This prints out:

NO ERROR
ATANH: 1.#INF00e+000

Regards,

Dan


This communication is the property of Qwest and may contain confidential or
privileged information. Unauthorized use of this communication is strictly 
prohibited and may be unlawful.  If you have received this communication 
in error, please immediately notify the sender by reply e-mail and destroy 
all copies of the communication and any attachments.