Javaプログラミング学習サイト ゆるゆるプログラミング

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の使い方について解説-画像

円周率π(パイ)

π(パイ)の意味と、Math.PIの使い方について解説

四則演算(足し算/引き算/掛け算/割り算)について-画像

計算結果の表示

足し算(加法)/引き算(減法)/掛け算(乗法)/割り算(除法)の使い方を説明

繰り返し処理に使用するfor文について解説-画像

for文

繰り返し処理に使用するfor文をJavaのソースコードを使って説明しています。

■新着情報

2021.06.18 変数の初期値 変数に値を代入しないで計算
2021.05.28 短針と長針の角度 短針と長針の角度は?
2021.05.19 各位(くらい)を求める 1の位の値は?10の位は?

■広告

 

 

 

 

 

 

 

 

 

Topへ