Rso's Jotter

日々の開発の知見のメモやその他雑記

グレゴリの級数を用いてπを求める.
積み残しの(情報落ち)影響を調べる.

// これは、アプリケーション ウィザードを使って生成された、VC++ アプリケーション プロジェクトの 
// メイン プロジェクト ファイルです。

#include "stdafx.h"

#using <mscorlib.dll>

#include "iostream"
#include <iomanip>
#include <cmath>

using namespace std;


using namespace System;

//グレゴリの級数でπを求める
void calcpai(int N);
void calcpai2(int N);
double odd(int n);

//π = 3.14159 26535 89793 
int _tmain()
{
    // TODO: 下のサンプル コードを独自のコードに置き換えてください。
    //Console::WriteLine(S"Hello World");
	cout << "真値:3.14159 26535 89793" << endl;
	cout << "N:\t\t" << "float\t\t" << "double\t\t" << "long double" << endl; 
	for(int i = 10;i <= 10000000 ;i *= 10){
		calcpai(i);
	}
	cout << endl << endl;

	for(int i = 10;i <= 10000000 ;i *= 10){
		calcpai2(i);
	}

	return 0;
}

//グレゴリの級数でπを求める
void calcpai(int N){

	float fpai = 0.0;
	double dpai = 0.0;
	long double ldpai = 0.0;

	
	for(int i = 0;i < N;i++){
		fpai += (float)((odd(i) / (2 * i + 1)) * 4);		//Σ(((-1)^n)*(1/(2n+1)))
		dpai += (odd(i) / (2 * i + 1) )* 4;
		ldpai += (odd(i) / (2 * i + 1) )* 4;
	}

	cout << setw(8)  << i << "\t" << setprecision(10) << fpai << "\t" << dpai << "\t" << ldpai << endl;

}

//情報落ちを防ぐ
void calcpai2(int N){

	float fpai = 0.0;
	double dpai = 0.0;
	long double ldpai = 0.0;

	
	for(int i = N -1;i >= 0;i--){
		fpai += (float)((odd(i) / (2 * i + 1)) * 4.0);		//Σ(((-1)^n)*(1/(2n+1)))
		dpai += (odd(i)  / (2 * i + 1) )* 4.0;
		ldpai += (odd(i) / (2 * i + 1) )* 4.0;
	}

	cout << setw(8)  << N << "\t" << setprecision(10) << fpai << "\t" << dpai << "\t" << ldpai << endl;

}

double odd(int n){
	return (n % 2)? -1.0 :1.0;
}