🙃

dc(1) で円周率を求める

2021/03/16に公開

3 月 14 日 = 円周率の日に間に合わなかったやつです. Unix-Like な環境ならどこでも入ってるであろう dc を使ったネタです.

暇な人は次のように実行してください.しばらくしたあとに円周率 (に近い値) が表示されます.

$ echo '6k10K^1-[d2-d1<A]dsAx0dsasF[[lar-sa0sF]sZ]sC[[la+sa1sF]sZlF1=C1r/lZxz0<m]dsmx4la*p' | dc

処理時間が長すぎて待ちきれない人は echo に渡されている文字列の先頭の 6 を 5 にしてください.

説明

中学生の頃に BASIC で時間を溶かしたみなさんなら見覚えのある式ですね.収束が結構遅めのやつです.

\pi = 4 \arctan{1} = 4 \sum_{n=0}^{\infty}{\frac{(-1)^n}{2n+1}}
6k			# 精度は 6 桁
10K^1-[d2-d1<A]dsAx	# すべての奇数を列挙する
0dsasF			# 各種レジスタを初期化
[[lar-sa0sF]sZ]sC	# 奇数番目の処理に上書きするマクロ
[
	[la+sa1sF]sZ	# 偶数番目だと仮定
	lF1=C		# 奇数番目なら上書き
	1r/		# 逆数に変換
	lZx		# 足し込み処理
	z0<m		# スタック高さ 1 までループ
]dsmx			# ここまで arctan(1)
4la*p			# 円周率の表示

Discussion