制御関連のカテゴリーに入り、そろそろページ的には半分を超えてきた感じの「A Tour of Go」です。
つーわけで、今回も「Go」を進めていきます。
今回進めるページ
まずURLはこちらね。(´・ω・)つhttps://go-tour-jp.appspot.com/flowcontrol/8

今回の内容は?
タイトルにも書いちゃってますが、演習のようです。
演習のお題は「平方根の計算を Go で実装してみましょう」的なやつ。
まずはページをザーッと読んでみましたが…、、、これ、ニュートン法だかっていう計算方法を使って平方根を求めるようですね。。。(^_^;)ワカラン…
まぁ、ニュートン法は一旦おいておくとして、ページに記載されているプログラムソースに平方根を求める処理を追記すれば良いようです。
ちなみにソースは下記になります。
package main
import (
"fmt"
)
func Sqrt(x float64) float64 {
// ここに平方根を求める処理をかくのね
}
func main() {
fmt.Println(Sqrt(2))
}
平方根の求め方?
ページの解説に書いてありますが、平方根を求めるために「ニュートン法を使ってね」となっています。
コンピュータは通常ループを使って x の平方根を計算します。 いくつかの z を推測することから始めて、z2 がどれほど x に近づいているかに応じて z を調整できます。
z -= (z*z – x) / (2*z)
実際の平方根に近い答えになるまでこの調整を繰り返すことによって、推測はより良いものなります。
:
(Note: If you are interested in the details of the algorithm, the z2 ? x above is how far away z2 is from where it needs to be (x), and the division by 2z is the derivative of z2, to scale how much we adjust z by how quickly z2 is changing. この一般的なアプローチはニュートン法と呼ばれています。 多くの関数で有効に働きますがとくに平方根では殊更有効です。)
と言っても、私は「ニュートン法」とやらを知らないので、下記サイトを参考にしました。
こちらのサイトでは「ニュートン法」の解説や、サンプルプログラム(Pythonですが…)なども紹介されていたので、詳しく知りたければ是非覗いてみてください。
プログラミングしてみる
さて、前述の参考サイトを見ながら平方根を求める処理を書いてみました。
package main
import (
"fmt"
"math"
)
// 平方根を求める関数
func Sqrt(x float64) float64 {
z := 1.0 // 開始推測値
res := 0.0 // ニュートン法の結果値
for {
// ニュートン法による演算
res = z - ( z*z - x ) / ( 2*z )
// 推測値と結果値の誤差が 0.001 未満ならループ終了
if math.Abs(res - z) < 0.001 { break } // → math.Abs は絶対値を求めるための関数
// デバック用出力
fmt.Printf("Sqrt x >>> %f\n", x)
fmt.Printf("Sqrt z >>> %f\n", z)
fmt.Printf("Sqrt res >>> %f\n", res)
fmt.Printf("Sqrt (z - x) >>> %f\n\n", z- x)
// 結果値を推測値として更新
z = res
}
// 結果値を返却
return res
}
func main() {
fmt.Println(Sqrt(2)) // 平方根を計算する関数を呼ぶ
}
実行結果を見てみる
Run すると次のような結果が出力されるかと思います。
Sqrt x >>> 2.000000
Sqrt z >>> 1.000000
Sqrt res >>> 1.500000
Sqrt (z – x) >>> -1.000000
Sqrt x >>> 2.000000
Sqrt z >>> 1.500000
Sqrt res >>> 1.416667
Sqrt (z – x) >>> -0.500000
Sqrt x >>> 2.000000
Sqrt z >>> 1.416667
Sqrt res >>> 1.414216
Sqrt (z – x) >>> -0.583333
1.4142135623746899
青字については処理途中の変数の変化を出力したもの、太字の数値は平方根を求めた結果になります。
プログラム内では 2 の平方根を求めていますが、1.41421356237 あたりまでは一致したようですね。
ニュートン法について
17行目の方程式ちっくなものが、例の「ニュートン法」による演算箇所になります。
ただですね、、、計算式自体はページの解説にも書いてあるし、そもそもの目的としては「ニュートン法」の学習ではなく、for や if を使った制御文の学習のはずなので、「ニュートン法」がわからなくても問題はない…はずですよね?(^_^;)
というわけで、わからなくても問題は無いと思います。(*´∀`*)ナイナー
今回のまとめ
特有の計算式は正直よくわかりませんでしたが、if や for はここまでで学習した内容を覚えてれば、難しくは無いんじゃないかなーと思いました。
今回は演習だけだったし、ポイントになるようなものもなさそうなので、今回はここまで!
そして次回からは「switch」ってゆー制御分に入っていきます。
それじゃまた次回~。٩(๑´3`๑)۶
コメント