From: "Berger, Daniel" Date: 2007-02-03T05:33:58+09:00 Subject: math.c, acosh.h, domain_check, MS Windows - possible bug 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 #include #include 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.