enkdsnnnnnnnn

めもるめもる

【A Tour of Go】 Exercise: Loops and Functionsの実験

A Tour Of Gogo-tour-jp.appspot.com

の最初のエクササイズです

2の平方根を求めるときはループ回数5回で精度が追いつく

ループ回数5回でmath.Sqrtと同じ精度になる

package main

import (
    "fmt"
    "math"
)

func Sqrt(x float64) float64 {

    // Zの開始観測値を定義する
    z := float64(1)
 
    // ループ回数
    lp := 5
     
    // ループ回数分、精度を上げる
    for i :=0 ; i < lp ; i++ {
        z -= (z*z - x) / (2*z)
    }
    return z
}

func main() {
    fmt.Println(Sqrt(2)) 
    fmt.Println(math.Sqrt(2)) // 比較用
}
// result

1.4142135623730951
1.4142135623730951
423の平方根を求めるときはループ回数9回で精度が追いつく
package main

import (
    "fmt"
    "math"
)

func Sqrt(x float64) float64 {

    // Zの開始観測値を定義する
    z := float64(1)
 
    // ループ回数
    lp := 9
     
    // ループ回数分、精度を上げる
    for i :=0 ; i < lp ; i++ {
        z -= (z*z - x) / (2*z)
    }
    return z
}

func main() {
    sq := float64(423)
    fmt.Println(Sqrt(sq))
    fmt.Println(math.Sqrt(sq))
}
// result

20.566963801203133
20.566963801203133
123456789の平方根は、ループ回数10回じゃまったく精度が足りない
package main

import (
    "fmt"
    "math"
)

func Sqrt(x float64) float64 {

    // Zの開始観測値を定義する
    z := float64(1)
 
    // ループ回数
    lp := 10
     
    // ループ回数分、精度を上げる
    for i :=0 ; i < lp ; i++ {
        z -= (z*z - x) / (2*z)
    }
    return z
}

func main() {
    sq := float64(123456789)
    fmt.Println(Sqrt(sq))
    fmt.Println(math.Sqrt(sq))
}
// result
120904.41039922157
11111.111060555555

ぜんぜんだめやんけ

調べるのがめんどくなってきたので、精度がmath.Sqrtと一致するループ回数を出力できるよう拡張

package main

import (
    "fmt"
    "math"
)

func Sqrt(x float64) (float64, int) {

    // Zの開始観測値を定義。精度目標はmath.Sqrtの精度に。
    z := float64(1)
    goal := math.Sqrt(x)
    lp := 0
 
    // ループ回数分、精度を上げる
    for {
        z -= (z*z - x) / (2*z)
     
        // 精度がmath.Sqrtの結果と一致したらループを中断する
        if z == goal {
            break
        }
        // ループカウントを更新
        lp++
    }
    return z, lp
}

func main() {
    sq := float64(9997890)
    res, lp := Sqrt(sq)
 
    fmt.Println(lp)
    fmt.Println(res)
    fmt.Println(math.Sqrt(sq))
}
15
3161.944022274904
3161.944022274904