From c995315153f7403636ec0d6119b7885668b32039 Mon Sep 17 00:00:00 2001 From: nobu Date: Wed, 6 Jun 2018 14:01:43 +0000 Subject: 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 --- math.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'math.c') diff --git a/math.c b/math.c index 0b15ba7056..509cd46ef2 100644 --- a/math.c +++ b/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); } /* -- cgit v1.2.1