Calcul de pi

Contenu du snippet

Calcul approximatif du nombre PI suivant ces différentes méthodes :
1 : Par la formule de Madhava-Leibniz
2 : Par la formule de Wallis
3 : Par la formule de Viete
4 : Par la suite de Leibniz
5 : Par l'algorithme de Salamin et Brent
6 : Par la formule BBP

Source / Exemple :


#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <vector>

using namespace std;
double MoinsUnPuissanceN(const long unsigned  int n);

inline double MoinsUnPuissanceN(const long unsigned int n)
{
  return (n&1) ? -1 : 1;
}

long double Process_Wallis(long unsigned int iterations)
{
     long double retour=1.0;

     for (long unsigned int i=1; i<=iterations; i++)
     {
	  retour*=(long double)(1.0-1.0/(pow((2.0*i+1.0),2)));
     }
     return retour*4;
     
}

void Wallis()
{
     long unsigned int iterations;
     time_t temps;

     cout<<endl<<"Nombre d'iterations : ";
     cin>>iterations;
     temps=time(NULL);
     cout<<endl<<"Valeur approchée de PI : "<< Process_Wallis(iterations)<<endl;
     cout<<"en "<<time(NULL)-temps<<" secondes"<<endl;

}
long double Process_MadhavaLeibniz(long unsigned int iterations)
{
     long double retour=0;

     for (long unsigned int i=0; i<=iterations;i++)
     {
	  retour+=(long double)(MoinsUnPuissanceN(i)/(2*i+1));
     }
     
     return retour*4;

}

void MadhavaLeibniz()
{
     long unsigned int iterations;
     time_t temps;

     cout<<endl<<"Nombre d'iterations : ";
     cin>>iterations;
     temps=time(NULL);
     cout<<endl<<"Valeur approchée de PI : "<< Process_MadhavaLeibniz(iterations)<<endl;
     cout<<"en "<<time(NULL)-temps<<" secondes"<<endl;
}

long double Process_viete(long unsigned int iterations)
{
     long double retour, encours;
     retour=2*(2/sqrt(2));
     encours=sqrt(2);
     for (long unsigned int i=1; i<=iterations;i++)
     {
	  encours=sqrt(2+encours);
	  retour*=(2/encours);
     }
     return retour;
}

void Viete()
{
     long unsigned int iterations;
     time_t temps;

     cout<<endl<<"Nombre d'iterations : ";
     cin>>iterations;
     temps=time(NULL);
     cout<<endl<<"Valeur approchée de PI : "<< Process_viete(iterations)<<endl;
     cout<<"en "<<time(NULL)-temps<<" secondes"<<endl;
}

long double Process_SuiteLeibniz(long unsigned int iterations)
{
     vector<long double> Vecteur1(iterations*2+1,0);
     vector<vector<long double> > Vecteur2(iterations*2+1,Vecteur1);

     for (long unsigned int j=1;j<Vecteur2.size();j++)
     {
	 
	       Vecteur2[0][j]=Process_MadhavaLeibniz(j);
     }

     for (long unsigned int i=1; i<Vecteur1.size();i++)
     {
	 
	  for (long unsigned int j=1;j<Vecteur2.size();j++)
	  {
	       Vecteur2[i][j]=(Vecteur2[i-1][j]+Vecteur2[i-1][j+1])/2;
	  }
	  
     }

     return Vecteur2[iterations][iterations];

}

void SuiteLeibniz()
{
     long unsigned int iterations;
     time_t temps;

     cout<<endl<<"Nombre d'iterations : ";
     cin>>iterations;
     temps=time(NULL);
     cout<<endl<<"Valeur approchée de PI : "<< Process_SuiteLeibniz(iterations)<<endl;
     cout<<"en "<<time(NULL)-temps<<" secondes"<<endl;
}

long double Process_Salamin_Brent(long unsigned int iterations)
{
     long double a0=1, b0=1/sqrt(2), t0=0.25, p0=1;
     long double an, bn, tn, pn;
     long double retour;

     for (long unsigned int i=0; i<=iterations; i++)
     {
	  an=(a0+b0)/2;
	  bn=sqrt(a0*b0);
	  tn=t0-pow((a0-an),2)*p0;
	  pn=2*p0;

	  a0=an;
	  b0=bn;
	  t0=tn;
	  p0=pn;
     }
     retour=pow((an+bn),2)/(4*tn);

     return retour;

}

void Algo_Salamin_Brent()
{
     long unsigned int iterations;
     time_t temps;

     cout<<endl<<"Nombre d'iterations : ";
     cin>>iterations;
     temps=time(NULL);
     cout<<endl<<"Valeur approchée de PI : "<< Process_Salamin_Brent(iterations)<<endl;
     cout<<"en "<<time(NULL)-temps<<" secondes"<<endl;
}

long double Process_BBP(long unsigned int iterations)
{
     long double retour=0;

     for (long unsigned int i=0; i<=iterations; i++)
     {
	  long double ajout;

	  ajout=(long double)((4.0/(8.0*i+1.0))-(2.0/(8.0*i+4.0))-(1.0/(8.0*i+5.0))-(1.0/(8.0*i+6.0)));
	  ajout*=(long double)(1.0/pow(16.0,i));
	  retour+=ajout;
     }

     return retour;

}

void BBP()
{
     long unsigned int iterations;
     time_t temps;

     cout<<endl<<"Nombre d'iterations : ";
     cin>>iterations;
     temps=time(NULL);
     cout<<endl<<"Valeur approchée de PI : "<< Process_BBP(iterations)<<endl;
     cout<<"en "<<time(NULL)-temps<<" secondes"<<endl;

}

int main(void)
{
     int choix;

     cout.precision(15);

     do
     {
	  cout<<endl<<"Calcul du nombre PI par différentes méthodes"<<endl<<endl;
	  cout<<"1 : Par la formule de Madhava-Leibniz"<<endl;
	  cout<<"2 : Par la formule de Wallis"<<endl;
	  cout<<"3 : Par la formule de Viete"<<endl;
	  cout<<"4 : Par la suite de Leibniz"<<endl;
	  cout<<"5 : Par l'algorithme de Salamin et Brent"<<endl;
	  cout<<"6 : Par la formule BBP"<<endl;
	  cout<<"0 : Arret du programme"<<endl;
	  cout<<endl<<"Votre choix ?"<<endl;
	  cin>>choix;

	  switch (choix)
	  {
	  case 2:
	       Wallis();
	       break;
	  case 1:
	       MadhavaLeibniz();
	       break;
	  case 3:
	       Viete();
	       break;
	  case 4:
	       SuiteLeibniz();
	       break;
	  case 5:
	       Algo_Salamin_Brent();
	       break;
	  case 6:
	       BBP();
	       break;
	  }

     }
     while (choix!=0);

     return EXIT_SUCCESS;
}

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.