* 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:
nobu 2018-06-06 14:01:43 +00:00
Родитель 439e50789b
Коммит c995315153
2 изменённых файлов: 9 добавлений и 1 удалений

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