Bug #2189 ยป pole.diff
math.c | ||
---|---|---|
rb_sys_fail(msg);
|
||
}
|
||
static void
|
||
infinity_check(VALUE arg, double res, const char *msg)
|
||
{
|
||
while(1) {
|
||
if (errno) {
|
||
rb_sys_fail(msg);
|
||
}
|
||
if (isinf(res) && !isinf(RFLOAT_VALUE(arg))) {
|
||
#if defined(EDOM)
|
||
errno = EDOM;
|
||
#elif defined(ERANGE)
|
||
errno = ERANGE;
|
||
#endif
|
||
continue;
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
/*
|
||
* call-seq:
|
||
* Math.atan2(y, x) => float
|
||
... | ... | |
return DBL2NUM(asinh(RFLOAT_VALUE(x)));
|
||
}
|
||
#define plus_infinity_num() DBL2NUM(+1.0 / 0.0)
|
||
#define minus_infinity_num() DBL2NUM(-1.0 / 0.0)
|
||
/*
|
||
* call-seq:
|
||
* Math.atanh(x) => float
|
||
... | ... | |
Need_Float(x);
|
||
errno = 0;
|
||
d0 = RFLOAT_VALUE(x);
|
||
if (d0 == -1.0) {
|
||
return minus_infinity_num();
|
||
}
|
||
if (d0 == 1.0) {
|
||
return plus_infinity_num();
|
||
}
|
||
d = atanh(d0);
|
||
domain_check(d0, d, "atanh");
|
||
infinity_check(x, d, "atanh");
|
||
return DBL2NUM(d);
|
||
}
|
||
... | ... | |
Need_Float(x);
|
||
errno = 0;
|
||
d0 = RFLOAT_VALUE(x);
|
||
if (d0 == 0.0) {
|
||
return minus_infinity_num();
|
||
}
|
||
d = log(d0);
|
||
if (argc == 2) {
|
||
Need_Float(base);
|
||
d /= log(RFLOAT_VALUE(base));
|
||
}
|
||
domain_check(d0, d, "log");
|
||
infinity_check(x, d, "log");
|
||
return DBL2NUM(d);
|
||
}
|
||
... | ... | |
Need_Float(x);
|
||
errno = 0;
|
||
d0 = RFLOAT_VALUE(x);
|
||
if (d0 == 0.0) {
|
||
return minus_infinity_num();
|
||
}
|
||
d = log2(d0);
|
||
domain_check(d0, d, "log2");
|
||
infinity_check(x, d, "log2");
|
||
return DBL2NUM(d);
|
||
}
|
||
... | ... | |
Need_Float(x);
|
||
errno = 0;
|
||
d0 = RFLOAT_VALUE(x);
|
||
if (d0 == 0.0) {
|
||
return minus_infinity_num();
|
||
}
|
||
d = log10(d0);
|
||
domain_check(d0, d, "log10");
|
||
infinity_check(x, d, "log10");
|
||
return DBL2NUM(d);
|
||
}
|
||
test/ruby/test_math.rb | ||
---|---|---|
check(0, Math.atanh(Math.sinh(0) / Math.cosh(0)))
|
||
check(1, Math.atanh(Math.sinh(1) / Math.cosh(1)))
|
||
check(2, Math.atanh(Math.sinh(2) / Math.cosh(2)))
|
||
assert_raise(Errno::EDOM, Errno::ERANGE) { Math.atanh(-1) }
|
||
assert_equal(-1.0/0, Math.atanh(-1))
|
||
assert_equal(+1.0/0, Math.atanh(+1))
|
||
end
|
||
def test_exp
|
||
... | ... | |
check(1, Math.log(10, 10))
|
||
check(2, Math.log(100, 10))
|
||
assert_equal(1.0/0, Math.log(1.0/0))
|
||
assert_raise(Errno::EDOM, Errno::ERANGE) { Math.log(0) }
|
||
assert_equal(-1.0/0, Math.log(0))
|
||
assert_equal(-1.0/0, Math.log(-0.0))
|
||
assert_equal(-1.0/0, Math.log(0.0))
|
||
assert_raise(Errno::EDOM, Errno::ERANGE) { Math.log(-Float::MIN) }
|
||
assert_raise(Errno::EDOM, Errno::ERANGE) { Math.log(-1) }
|
||
assert_raise(TypeError) { Math.log(1,nil) }
|
||
end
|
||
... | ... | |
check(1, Math.log2(2))
|
||
check(2, Math.log2(4))
|
||
assert_equal(1.0/0, Math.log2(1.0/0))
|
||
assert_raise(Errno::EDOM, Errno::ERANGE) { Math.log2(0) }
|
||
assert_equal(-1.0/0, Math.log2(0))
|
||
assert_raise(Errno::EDOM, Errno::ERANGE) { Math.log2(-1) }
|
||
end
|
||
... | ... | |
check(1, Math.log10(10))
|
||
check(2, Math.log10(100))
|
||
assert_equal(1.0/0, Math.log10(1.0/0))
|
||
assert_raise(Errno::EDOM, Errno::ERANGE) { Math.log10(0) }
|
||
assert_equal(-1.0/0, Math.log10(0))
|
||
assert_raise(Errno::EDOM, Errno::ERANGE) { Math.log10(-1) }
|
||
end
|
||