A Tour of Go の練習問題 『Loops and Functions』 についてのメモ
文系(美術系)の自分にはそもそも計算式の意味が・・・
10回ループ
問題文に書いてある通り、とりあえず ニュートン法の式をそのまま関数に入れて 10回ループさせて x の値を増やしていき math.Sqrt
との近似値を確認する。
package main
import (
"fmt"
"math"
)
func Sqrt(x float64) float64 {
z := float64(1)
for i := 0; i < 10; i++ {
z = z - (z * z - x) / 2 * z
}
return z
}
func main() {
x := float64(2)
sq := Sqrt(x)
ms := math.Sqrt(x)
fmt.Println(ms, sq)
fmt.Println(ms - sq)
}
10回ループした結果
1.4142135623730951 1.3351578377717581
0.07905572460133703
10000回ループした結果
1.4142135623730951 1.4106685607006662
0.0035450016724289934
ここまではなんとか・・・
10000回ループすると math.Sqrt
に近づいているのがわかる
zの値の直前との差が小さくなったら停止するようにループを変更
if 文を追加して直前のzの値との差が定義した許容値以下になったら break するように修正
package main
import (
"fmt"
"math"
)
const tolerance = 0.001
func Sqrt(x float64) float64 {
z := float64(1)
t := z
for {
z = z - (z * z - x) / 2 * z
if math.Abs(z - t) < tolerance {
break
}
t = z
}
return z
}
func main() {
x := float64(2)
sq := Sqrt(x)
ms := math.Sqrt(x)
fmt.Println(ms, sq)
fmt.Println(ms - sq)
}
結果
1.4142135623730951 1.414713296482291
-0.000499734109195904
最初、自分は直前との差を出すのに if z - t < tolerance {
とやっていてうまくいかず・・・
調べたら差分がマイナスになることもあるので絶対値をもとめる
math.Abs
を使うべしということがわかった
がしかしチュートリアル充実してるし
思ってたよりGoシンプルでわかりやすいし
逃げずにコツコツ勉強しようと思います。たぶん。