6

我正在使用牛顿法在 Google Go 中编写立方根函数。我想使用 math/ 检查结果cmplx.Pow(),但对于我的生活,我不知道如何。我该怎么做呢?

4

6 回答 6

15

你试过myCubicRootOfx = Pow(x, 1.0/3)吗?

编辑:感谢Jason McCreary评论:
我们不能1/3用作第二个参数,Pow因为这是一个整数除法,因此不会产生预期的 1/3 值。通过使用1.0/3or1/3.0等​​,我们有效地产生了一个具有 0.333333... 值的浮点数。

于 2012-11-07T05:25:13.750 回答
9

作为Go Tour 练习 47的一部分,我使用牛顿法编写了立方根函数。也许下面的两个函数 (Cbrt1Cbrt) 是有帮助的。

package main

import (
    "fmt"
    "math/cmplx"
)

// Newton's method cube root function that hopes for
//   convergence within 20 iterations
func Cbrt1(x complex128) complex128 {
    var z complex128 = x
    for i:= 0; i < 20; i++ {
        z = z - ((z*z*z - x) / (3.0*z*z))
    }
    return z
}

// Newton's method cube root function that runs until stable
func Cbrt(x complex128) complex128 {
    var z, z0 complex128 = x, x
    for {
        z = z - ((z*z*z - x) / (3.0*z*z))
        if cmplx.Abs(z - z0) < 1e-10 {
            break
        }
        z0 = z
    }
    return z
}

func main() {
    fmt.Println(Cbrt(2.0) , "should match" , cmplx.Pow(2, 1.0/3.0))
}
于 2013-03-28T03:17:01.443 回答
2

当您使用牛顿法时,我想您从一个正实数开始。

所以你不需要复数。

你可以简单地做

package main

import (
    "fmt"
    "math"
)

func main() {
    x := 100.0
    root := math.Pow(x, 1.0/3.0)
    fmt.Println(root)
}
于 2012-11-07T07:23:45.957 回答
1

例如,

package main

import (
    "fmt"
    "math/cmplx"
)

func main() {
    var x complex128
    x = -8
    y := cmplx.Pow(x, 1.0/3.0)
    fmt.Println(y)
    x = -27i
    y = cmplx.Pow(x, 1.0/3.0)
    fmt.Println(y)
    x = -8 - 27i
    y = cmplx.Pow(x, 1.0/3.0)
    fmt.Println(y)
    x = complex(-8, -27)
    y = cmplx.Pow(x, 1.0/3.0)
    fmt.Println(y)
}

输出:

(1+1.732050807568877i)
(2.5980762113533156-1.4999999999999996i)
(2.4767967587776756-1.7667767800295509i)
(2.4767967587776756-1.7667767800295509i)

Go 编程语言规范

封装 cmplx

于 2012-11-07T07:11:50.053 回答
1

看起来 go 比其他一些答案最近发生了变化,所以我想我会更新 - 他们将 cuberoot 直接构建为mathas Cbrt。它需要并返回一个float64. 快速参考是godoc math | grep Cbrt(如果你已经godoc安装,我强烈推荐)

import "math"

func main() {
    var x float64 = math.Cbrt(8)
    fmt.Println(x) // prints 2
}
于 2016-05-12T00:22:43.410 回答
0

尝试这样的事情

package main

import(
        "fmt"
        "math/cmplx"
    )


func Cbrt(x complex128) complex128 {
    z := complex128(1)


    for i:=0;i<100;i++ {  // OR JUST for{ since you will outrun complex128 in worth case
      last_z := z

      z = z - ((z*z*z - x)/(3 *z*z))    
      if last_z == z{
        return z
      }
    }
    return z
}

func main() {
    fmt.Println("good enough", Cbrt(9))
    fmt.Println("builtin", cmplx.Pow(9, 1.0/3.0))
}
于 2013-11-08T22:04:59.437 回答