mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
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
2 changed files with 9 additions and 1 deletions
9
math.c
9
math.c
|
@ -689,7 +689,14 @@ rb_math_sqrt(VALUE x)
|
|||
static VALUE
|
||||
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(-0.1, Math.cbrt(-0.001))
|
||||
assert_nothing_raised { assert_infinity(Math.cbrt(1.0/0)) }
|
||||
assert_operator(Math.cbrt(1.0 - Float::EPSILON), :<=, 1.0)
|
||||
end
|
||||
|
||||
def test_frexp
|
||||
|
|
Loading…
Reference in a new issue