成瀬です。

Tadashi Saito wrote:
> 気を取り直してSUSv3を見たのですが、atanh(x)の項には
> 
>> If x is ±1, a pole error shall occur, (...)
> 
> とあるので、「errnoを設定しないFreeBSD 7の振る舞いが例外的である」として
> 
>> Errno::EDOMかErrno::ERANGEを返す
> 
> という実装に(Ruby側が)する方が良いのではないでしょうか。
> 
> log*(0)についても、同様の記述で
> 
>> If x is ±0, a pole error shall occur
> 
> でした。ので、やはりRuby側が頑張るのが望ましいのではないかと思います。

ふむ、それですと、こんな感じですかね。
変更内容的に副作用が気になっていたりはするんですが。

--- math.c      (revision 18249)
+++ math.c      (working copy)
@@ -41,7 +41,7 @@ domain_check(double x, const char *msg)
        if (errno) {
            rb_sys_fail(msg);
        }
-       if (isnan(x)) {
+       if (isnan(x) || isinf(x)) {
 #if defined(EDOM)
            errno = EDOM;
 #elif defined(ERANGE)
@@ -369,9 +369,7 @@ math_log2(VALUE obj, VALUE x)
     Need_Float(x);
     errno = 0;
     d = log2(RFLOAT_VALUE(x));
-    if (errno) {
-       rb_sys_fail("log2");
-    }
+    domain_check(d, "log2");
     return DOUBLE2NUM(d);
 }



-- 
NARUSE, Yui  <naruse / airemix.jp>