円周率計算してみたかった。ちなみにテイラー展開してgoルーチン使って書いてる人はここにいるんだけど、精度がfloat64だったから…。
Go言語にはちょうどいいことに多倍長浮動小数点数パッケージがあったので使ってみた。
アルゴリズムについてはここの三つ目のオイラー加速したものを参照。
pi.go
package main
import (
"fmt"
"math/big"
)
func main() {
max := int64(1000)
two := big.NewRat(2, 1)
pi := big.NewRat(1.0, 1.0)
a := big.NewRat(1.0, 1.0)
b := big.NewRat(1.0, 2.0)
x := new(big.Rat)
for i := int64(2); i < max; i += 2 {
y := big.NewRat(i, i + 1)
a.Mul(a, y)
x.Mul(a, b)
pi.Add(pi, x)
b.Quo(b, two) //割り算はQuoっぽい。第二引数が0だとpanic飛ばすらしいから、それが嫌なら予め篩うかInvで逆数を求めるか…
}
fmt.Print(pi.Mul(pi, two).FloatString(100))
}
やっぱGo言語情報少ないな…。