1 // Copyright 2009 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
8 The algorithm is based in part on "Optimal Partitioning of
9 Newton's Method for Calculating Roots", by Gunter Meinardus
10 and G. D. Taylor, Mathematics of Computation © 1980 American
12 (http://www.jstor.org/stable/2006387?seq=9, accessed 11-Feb-2010)
15 // Cbrt returns the cube root of its argument.
21 func Cbrt(x float64) float64 {
36 // TODO(rsc): Remove manual inlining of IsNaN, IsInf
37 // when compiler does it for us
40 case x == 0 || x != x || x < -MaxFloat64 || x > MaxFloat64: // x == 0 || IsNaN(x) || IsInf(x, 0):
48 // Reduce argument and estimate cube root
49 f, e := Frexp(x) // 0.5 <= f < 1.0
53 e -= m // e is multiple of 3
56 case 0: // 0.5 <= f < 1.0
57 f = A1*f + A2 - A3/(A4+f)
59 f *= 0.5 // 0.25 <= f < 0.5
60 f = B1*f + B2 - B3/(B4+f)
62 f *= 0.25 // 0.125 <= f < 0.25
63 f = C1*f + C2 - C3/(C4+f)
65 y := Ldexp(f, e/3) // e/3 = exponent of cube root
70 y *= (t + x) / (s + t)
73 y -= y * (((14.0/81.0)*s-(2.0/9.0))*s + (1.0 / 3.0)) * s