今まで、円周率をマチンの公式や Klingensitierna の公式で多桁計算する概念、C++ アルゴリズムを紹介しました。
今回も、同様に Arctan 系の公式である「オイラーの公式(2)」を使用して、円周率 を計算してみました。
ちなみに、正確には「オイラーの公式(2)」という名前の公式ではありません。数ある「オイラーの公式」のうち、今回当方が紹介するのが2つ目という意味の (2) です。
当然、プログラミン言語そのものが保有している三角関数は使用しません。級数展開して計算します。(多桁の円周率計算では、全く無意味ですから。但し、常用対数は影響がないので関数を使用)
また、Arctan 系公式は項数や係数が異るだけなので、1つのプログラムで組むこととしました。
0. 前提条件
- Linux Mint 14 Nadia (64bit) での作業を想定。
- g++ (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2
- 多桁計算で使用する1つの配列のサイズは8桁としている。
(当方の環境で扱える int 型の範囲は -2,147,483,648 〜 2,147,483,647 であることから) - 指定する桁数は int 型の範囲としているが、あまり大きいと計算に膨大な時間を要するので注意!
1. オイラー(Euler)の公式(2)について
他の Arctan 系の公式と考え方は同じ。
数式が多いので で記載。
ちなみに、 と置き換えてもよい。
なお、ここではオイラーの公式(2)の証明はしない。(証明方法は何種類かあります)
また、上記の方法で算出した計算項数では、収束の速い方は無駄に多く計算していることになる。
それを防ぎたかったら、各 Arctan 毎に必要な項数分だけ計算して、最後に合算する方法を取ると良いだろう。
2. C++ ソース作成
例として、以下のようにソースを作成した。
- 使用する公式番号を入力するようにしている。
- 計算桁数を入力するようにしている。
- 計算する項数もプログラム内で計算させるようにしている。
- 計算結果をテキストファイルに出力するようにしている。
- ソースは、メイン部分・計算クラス部分・計算クラスプロトタイプ宣言部分の3つに分けるようにした。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
|
3. C++ ソースコンパイル
1
|
|
何も出力されなければ成功です。
4. 実行
1 2 3 4 5 6 7 8 9 10 |
|
“PI_Euler2.txt” というテキストファイルができているはずである。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
|
「オイラーの公式」で計算・出力した結果と一致しました。
また、何回か実行してみたが、「オイラーの公式(2)」の方が「オイラーの公式」より計算に若干時間がかかった。
5. 参考サイト
自分の環境と相談して、計算する桁数を大きくしてみるのもよいでしょう。
ちなみに、結果が何万桁以上になる場合は、多桁(多倍長)乗算に上記の方法ではなく「Karatsuba法」や「Toom-Cook法」や「FFT(高速フーリエ変換)」を使うのが一般的なようです。
今回、Arctan 系の公式による計算を汎用化することができたので、その他の Arctan 系公式による計算に即応用可能となりました。
以上。