[英]How to take a cube root in Go?
我正在使用牛顿法在 Google Go 中编写立方根函数。 我想使用 math/ cmplx.Pow()
检查结果,但对于我来说,我无法弄清楚如何。 我该怎么做呢?
您是否尝试过myCubicRootOfx = Pow(x, 1.0/3)
?
编辑:感谢Jason McCreary
评论:
我们不能使用1/3
作为Pow
的第二个参数,因为这是一个整数除法,因此不会产生预期的 1/3 值。 通过使用1.0/3
或1/3.0
等,我们有效地生成了一个具有 0.333333... 值的浮点数。
作为围棋练习 47的一部分,我使用牛顿法编写了立方根函数。 也许下面的两个函数( Cbrt1
和Cbrt
)会有所帮助。
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))
}
当您使用牛顿法时,我想您是从一个正实数开始的。
所以你不需要复杂的数字。
你可以简单地做
package main
import (
"fmt"
"math"
)
func main() {
x := 100.0
root := math.Pow(x, 1.0/3.0)
fmt.Println(root)
}
例如,
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 比其他一些答案最近发生了变化,所以我想我会更新 - 他们将 cuberoot 直接构建到math
中作为Cbrt
。 它接受并返回一个float64
。 快速参考在godoc math | grep Cbrt
godoc math | grep Cbrt
(如果你安装了godoc
,我强烈推荐)
import "math"
func main() {
var x float64 = math.Cbrt(8)
fmt.Println(x) // prints 2
}
尝试这样的事情
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))
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.