| // Copyright 2009 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| The algorithm is based in part on "Optimal Partitioning of |
| Newton's Method for Calculating Roots", by Gunter Meinardus |
| and G. D. Taylor, Mathematics of Computation © 1980 American |
| (http://www.jstor.org/stable/2006387?seq=9, accessed 11-Feb-2010) |
| // Cbrt returns the cube root of x. |
| func Cbrt(x float64) float64 { |
| case x == 0 || IsNaN(x) || IsInf(x, 0): |
| // Reduce argument and estimate cube root |
| f, e := Frexp(x) // 0.5 <= f < 1.0 |
| e -= m // e is multiple of 3 |
| case 0: // 0.5 <= f < 1.0 |
| f = A1*f + A2 - A3/(A4+f) |
| f *= 0.5 // 0.25 <= f < 0.5 |
| f = B1*f + B2 - B3/(B4+f) |
| f *= 0.25 // 0.125 <= f < 0.25 |
| f = C1*f + C2 - C3/(C4+f) |
| y := Ldexp(f, e/3) // e/3 = exponent of cube root |
| y -= y * (((14.0/81.0)*s-(2.0/9.0))*s + (1.0 / 3.0)) * s |