2020/12/16 公開
・ライプニッツの公式
ライプニッツの公式を使って円周率πを計算で求める方法を紹介します。
以下がライプニッツの公式で、級数で表されます。

この公式で円周率πの4分の1の値が計算できるので、これを4倍して円周率πを計算することができます。

それでは、ライプニッツの公式を使って円周率πを計算するJavaソースコードを紹介します。
LeibnizFormula.java ← クリックしてダウンロードページに移動
001: public class LeibnizFormula { 002: // 項の数termnumberを渡して円周率πを計算 003: static double LeibnizFormula( int termnumber ) 004: { 005: double sgn; // 符号 006: double pi; // 計算結果 007: double denom; // 分母 008: 009: if ( 1 > termnumber ) return 0; 010: 011: // πの初期値に0.0を代入 012: pi = 0.0; 013: 014: // 符号の初期値に1を代入 015: sgn = 1.0; 016: 017: // 分母の初期値に1.0を代入 018: denom = 1.0; 019: 020: // π/4の計算 021: for ( int i = 1; i <= termnumber; i++ ) { 022: // 項の値を計算(符号付) 023: pi += sgn / denom; 024: 025: // 符号を反対にする 026: sgn *= -1.0; 027: 028: // 分母に2を足す 029: denom += 2.0; 030: } 031: 032: // πの結果を戻す 033: return pi * 4.0; 034: } 035: 036: // メイン 037: public static void main( String[] args ) { 038: int termnum; // 項の数 039: double pi; // 計算結果 040: 041: termnum = 100; 042: pi = LeibnizFormula( termnum ); 043: System.out.println( "項の数:" + termnum + " " + pi ); 044: 045: termnum = 1000; 046: pi = LeibnizFormula( termnum ); 047: System.out.println( "項の数:" + termnum + " " + pi ); 048: 049: termnum = 10000; 050: pi = LeibnizFormula( termnum ); 051: System.out.println( "項の数:" + termnum + " " + pi ); 052: 053: termnum = 100000; 054: pi = LeibnizFormula( termnum ); 055: System.out.println( "項の数:" + termnum + " " + pi ); 056: 057: termnum = 1000000; 058: pi = LeibnizFormula( termnum ); 059: System.out.println( "項の数:" + termnum + " " + pi ); 060: } 061: }
LeibnizFormulaを実行
C:\talavax\javasample>java LeibnizFormula
LeibnizFormula.javaの出力結果
項の数:100 3.1315929035585537 項の数:1000 3.140592653839794 項の数:10000 3.1414926535900345 項の数:100000 3.1415826535897198 項の数:1000000 3.1415916535897743
項の数を多くすると円周率πの計算値が、実際のπの値(3.14159265...)に近づいています。
ただし、この公式は収束が遅く実用的ではありません。実際の値に近づけるためには項の数を相当多くする必要があります。
ここからライプニッツの公式を計算するメソッドを説明していきます。
002: // 項の数termnumberを渡して円周率πを計算 003: static double LeibnizFormula( int termnumber ) 004: {
static double LeibnizFormula( int termnumber )はライプニッツの公式で円周率πを計算するメソッドです。int型の引数termnumberは計算する項の数で、この数を大きくすると計算精度が高くなります。
005: double sgn; // 符号 006: double pi; // 計算結果 007: double denom; // 分母
計算で使う変数を宣言しています。
009: if ( 1 > termnumber ) return 0;
計算する項の数termnumberが1未満の場合は計算できないので、戻り値を0.0にしています。
011: // πの初期値に0.0を代入 012: pi = 0.0;
円周率πの結果を格納するdouble型の変数piに初期値として0.0を代入しています。
014: // 符号の初期値に1を代入 015: sgn = 1.0;
項の符号(プラスかマイナスか)を格納するdouble型の変数sgnに初期値として1.0を代入しています。このプログラムでは、1.0がプラス、-1.0がマイナスです。
017: // 分母の初期値に1.0を代入 018: denom = 1.0;
項の分母の値を格納するdouble型の変数denomの値に初期値として1.0を代入しています。
020: // π/4の計算 021: for ( int i = 1; i <= termnumber; i++ ) {
項の数termnumber回のループをfor文で作成しています。
022: // 項の値を計算(符号付) 023: pi += sgn / denom;
項の値を計算しています。変数sgnを変数denomで割ることで符号付の項を計算できます。
025: // 符号を反対にする 026: sgn *= -1.0;
符号を表す変数sgnに-1.0を掛けています。これで交互にプラスとマイナスが入れ替わります。
028: // 分母に2を足す 029: denom += 2.0;
分母を表す変数denomに2.0を足しています。
032: // πの結果を戻す 033: return pi * 4.0;
for文を抜けて出てきた結果piを4倍することで円周率piを計算し、return文で戻しています。
次に、円周率πの計算結果が収束する様子を確認することができるプログラムを紹介します。
以下は、項を1つづつ増やしていったときの円周率πの計算結果を随時出力するJavaソースコードです。項の数を1000まで計算しています。
LeibnizFormula1.java ← クリックしてダウンロードページに移動
001: public class LeibnizFormula1 { 002: // メイン 003: public static void main( String[] args ) { 004: int termnum; // 項の数 005: double sgn; // 符号 006: double pi; // 計算結果 007: double denom; // 分母 008: 009: // πの初期値に0.0を代入 010: pi = 0.0; 011: 012: // 符号の初期値に1を代入 013: sgn = 1.0; 014: 015: // 分母の初期値に1.0を代入 016: denom = 1.0; 017: 018: // 項の数を代入 019: termnum = 1000; 020: 021: // π計算 022: for ( int i = 1; i <= termnum; i++ ) { 023: // 項の値を計算(符号付) 024: pi += sgn / denom; 025: 026: // 符号を反対にする 027: sgn *= -1.0; 028: 029: // 分母に2を足す 030: denom += 2.0; 031: 032: // 結果を都度出力 033: System.out.println( i + " : " + pi * 4.0 ); 034: } 035: } 036: }
LeibnizFormula1を実行
C:\talavax\javasample>java LeibnizFormula1
LeibnizFormula1.javaの出力結果
1 : 4.0 2 : 2.666666666666667 3 : 3.466666666666667 4 : 2.8952380952380956 5 : 3.3396825396825403 6 : 2.9760461760461765 7 : 3.2837384837384844 8 : 3.017071817071818 9 : 3.2523659347188767 10 : 3.0418396189294032 11 : 3.232315809405594 12 : 3.058402765927333 13 : 3.2184027659273333 14 : 3.0702546177791854 15 : 3.208185652261944 16 : 3.079153394197428 17 : 3.200365515409549 18 : 3.0860798011238346 19 : 3.1941879092319425 20 : 3.09162380666784 21 : 3.189184782277596 22 : 3.0961615264636424 23 : 3.1850504153525314 24 : 3.099944032373808 25 : 3.1815766854350325 :
■関連コンテンツ
数学関数について | 数学関数について解説 |
符号 signum | Math.signumの使い方について解説 |
return文 | メソッドの戻り値 |
![]() |
円周率π(パイ)π(パイ)の意味と、Math.PIの使い方について解説 |
![]() |
計算結果の表示足し算(加法)/引き算(減法)/掛け算(乗法)/割り算(除法)の使い方を説明 |
![]() |
for文繰り返し処理に使用するfor文をJavaのソースコードを使って説明しています。 |
■新着情報
2021.12.21 | 現在の日時を取得 | いまの年月日、時分秒? |
■広告
