ニュートン法を使用して、GoogleGoで立方根関数を記述しています。math /を使って結果を確認したいのですcmplx.Pow()
が、一生の間、どうすればいいのかわかりません。どうすればよいですか?
質問する
3884 次
6 に答える
15
試しましたmyCubicRootOfx = Pow(x, 1.0/3)
か?
編集済みJason McCreary
:コメントのおかげで:これは整数除算であり、したがって期待される1/3値を生成しないため、2番目のパラメーターとして
使用することはできません。またはなどを使用することにより、0.333333...値のフロートを効果的に生成します。1/3
Pow
1.0/3
1/3.0
于 2012-11-07T05:25:13.750 に答える
9
Go Tour演習47の一部として、ニュートン法を使用して立方根関数を作成しました。おそらく、以下の2つの関数(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))
}
于 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)
于 2012-11-07T07:11:50.053 に答える
1
goは他のいくつかの回答よりも最近変更されたように見えるので、更新することにしました-彼らはcuberootをmath
として組み込みました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 に答える