math.c: adjust cbrt
* math.c (math_cbrt): refine the approximation result on boundary values by an iteration of Newton-Raphson method. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@63592 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
439e50789b
commit
c995315153
9
math.c
9
math.c
@ -689,7 +689,14 @@ rb_math_sqrt(VALUE x)
|
|||||||
static VALUE
|
static VALUE
|
||||||
math_cbrt(VALUE unused_obj, VALUE x)
|
math_cbrt(VALUE unused_obj, VALUE x)
|
||||||
{
|
{
|
||||||
return DBL2NUM(cbrt(Get_Double(x)));
|
double f = Get_Double(x);
|
||||||
|
double r = cbrt(f);
|
||||||
|
#if defined __GLIBC__
|
||||||
|
if (isfinite(r)) {
|
||||||
|
r = (2.0 * r + (f / r / r)) / 3.0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return DBL2NUM(r);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -202,6 +202,7 @@ class TestMath < Test::Unit::TestCase
|
|||||||
check(3, Math.cbrt(27))
|
check(3, Math.cbrt(27))
|
||||||
check(-0.1, Math.cbrt(-0.001))
|
check(-0.1, Math.cbrt(-0.001))
|
||||||
assert_nothing_raised { assert_infinity(Math.cbrt(1.0/0)) }
|
assert_nothing_raised { assert_infinity(Math.cbrt(1.0/0)) }
|
||||||
|
assert_operator(Math.cbrt(1.0 - Float::EPSILON), :<=, 1.0)
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_frexp
|
def test_frexp
|
||||||
|
Loading…
x
Reference in New Issue
Block a user