bcで円周率を計算

§1 bcとは

bcは、大変便利な計算機です。数式をそのまま入力できるので、関数電卓のように扱う事が出来ます。

例)

$ bc -q
7+7/7+7*7-7
50
6/2*(1+2)
9

bcのもう一つの大きな特徴として、小数点以下の精度を任意に指定できることが挙げられます。
変数scaleに値を代入すると、それがそのまま桁数になるのです。

例)

$bc -q
scale=17
sqrt(2)
1.41421356237309504
scale=7
sqrt(5)
2.2360679

bcはUNIXの基本的なコマンドであるにも関わらず、Cygwinではデフォルトではインストールされないので, まずは

をインストールしましょう。そうしましたら、いきなりですがこのページの主題である

『任意の桁数での円周率の計算』

に入りたいと思います。

§2 円周率の計算

円周率を求める方法はいくつかありますが、今回は単純に逆正接関数arctanを使います。
bcに-lオプションを付けて起動すると、6つの数学関数{s(),c(),a(),l(),e(),j(,)}が使えるようになります。
このうちa()がarctanで、括弧内に任意の数値を入れると、それに対応する角度をラジアンで返してくれます。
tan(π/4)=1ですから、arctan(1)=π/4であり、これを4倍すればπが得られるわけです。

$ bc -ql
scale=1000
4*a(1)
3.141592653589793238462643383279502884197169399375105820974944592307\
81640628620899862803482534211706798214808651328230664709384460955058\
22317253594081284811174502841027019385211055596446229489549303819644\
28810975665933446128475648233786783165271201909145648566923460348610\
45432664821339360726024914127372458700660631558817488152092096282925\
40917153643678925903600113305305488204665213841469519415116094330572\
70365759591953092186117381932611793105118548074462379962749567351885\
75272489122793818301194912983367336244065664308602139494639522473719\
07021798609437027705392171762931767523846748184676694051320005681271\
45263560827785771342757789609173637178721468440901224953430146549585\
37105079227968925892354201995611212902196086403441815981362977477130\
99605187072113499999983729780499510597317328160963185950244594553469\
08302642522308253344685035261931188171010003137838752886587533208381\
42061717766914730359825349042875546873115956286388235378759375195778\
18577805321712268066130019278766111959092164201988

注意: 末尾1桁は不正確な値が出る(偶然合うこともありますが)ので、もし小数点以下1000桁の正確な値が欲しければ、scale=1001としましょう。

§3 計算結果の利用

ただ計算するだけでも十分面白いのですが、折角やるのですからこの結果を何かに転用したいですよね。
そこでこの章では、パイプとリダイレクションを駆使して円周率の計算結果を整形し、ファイルに出力してみたいと思います。
ここで使うコマンドは, echo, bc, trの3つです。
echoは標準出力(画面)に文字を表示する為のコマンドですが、|(パイプ)と組み合わせればコマンドに文字列を渡すのにも使えます。
bcは、計算結果を出力するとき、上に示したように68桁毎に自動で改行し、各行の末尾に改行されたことを表す為の記号(バックスラッシュ)を挿入してくれます。
これは、結果を別のところで利用するには非常に邪魔なので、trを使って取り去ってやる必要があります。
trで整形したら、>(リダイレクション)で結果の保存先を指定しましょう。ここではpi.txtとしました。

$ echo 'scale=1000;4*a(1)' | bc -l | tr -d '\\\n' > pi.txt

\\は\(バックスラッシュ)を、\nは改行を表します。

同様の方法で小数点以下10万桁の円周率を計算したものがこちらです。
1000桁程度なら0.5秒弱で済みますが、10000桁で2分強、100000桁ともなると16時間38分44.435秒も掛かったので、もし真似をするならコマンドの最後に&を付けてバックグラウンドで実行されることをおすすめします。
うっかり付け忘れた場合はctrl+cで強制終了できますのでご安心を。
コマンドの所要時間はtimeで計測できます。

$ time echo 'scale=100001;4*a(1)' | bc -l | tr -d '\\\n' | tee pi_100000.html &
3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128
(以下略)

§4 円周率を乱数表代わりに使う

工事中

§5 参考

戻る