From: "NARUSE, Yui" Date: 2008-07-29T01:39:41+09:00 Subject: [ruby-dev:35675] Re: [Ruby 1.9 - Bug #368] (Open) 境界における Math.atanh 等の動作 成瀬です。 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