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
|
||