倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

2015年3月14日

日記

本日は3.14で円周率の日! プログラム中で円周率を使った計算をする際、通常は倍精度の円周率の値を使う。 最近のプログラミング言語では定数としてこの値が定義されている。 Java では

Math.PI

でこの値を参照できる。 まぁ、これはこれでいいんだけど、昔 C だか Fortran だかでライブラリに詳しくなかったときに思いついた、円周率の値を倍精度で取得する方法がある。 余弦関数の逆関数、Java では Math.acos() を使って

Math.acos(-1.0)

とするだけ! 実際に(Scala で)やって下さった方がいて、実行結果がこちら:


わぁーい。

「Math.PI でいいやん!」と思ったそこのあなた。 この方法なら(任意精度の浮動小数点数に対する余弦関数の逆関数が定義されていれば)任意精度で円周率の値がわかるんだよ! Scala なら spire を使えば可能。 まぁ、時間があればそのうちやってみよう。

ちなみに、spire では実数としての円周率が定数として定義されていて、その定義は(正接関数の逆関数を \( \arctan() \) として)
\begin{align*}
\pi = 16 \arctan\frac{1}{5} - 4 \arctan\frac{1}{239}
\end{align*}
となってる。 一見「むむ!?」と思うけど、正接の加法定理などを使えば、この関係が厳密に(近似
なしに)成り立っているのが示せる。 『Javaによるアルゴリズム事典』を見るとこれ以外にもいくつか円周率を計算する方法があるもよう。

Javaによるアルゴリズム事典

Javaによるアルゴリズム事典

ツイート