Project

General

Profile

Bug #2189 ยป pole.diff

marcandre (Marc-Andre Lafortune), 11/01/2009 12:54 PM

View differences:

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
    (1-1/1)