begin process at 2013 06 19 15:20:23
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > CALCUL DE PI

CALCUL DE PI


 Information sur la source

Note :
7 / 10 - par 1 personne
7,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Maths & Algorithmes Classé sous :PI, Leibniz, Viete, BBP, Wallis Niveau :Débutant Date de création :30/09/2012 Vu :3 317

Auteur : lann

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (3)
Ajouter un commentaire et/ou une note


 Description

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

  • #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;
  • }
#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;
}



 Sources du même auteur

CALCUL DE PI AVEC LA BIBLIOTHÈQUE GMP
Source avec Zip Source avec une capture WIN COURRIER
Source avec Zip NOTIFICATION DE LA FERMETURE D'UN FICHIER
Source avec Zip DÉCOUPEUR DE FICHIERS OUTLOOK AVEC L'EXTENSION DBX
Source avec Zip Source avec une capture ACCORDEUR GUITARE

 Sources de la même categorie

Source avec Zip LE PROBLÈME DU VOYAGEUR DE COMMERCE EN LANGAGE C (ANT SYSTEM... par casseur
Source avec Zip VECTEUR CREUX par stroke599
Source avec Zip Source avec une capture FONCTIONS EN ACTION par ringo73
CALCUL DE PI AVEC LA BIBLIOTHÈQUE GMP par lann
Source avec Zip Source avec une capture MAGEO3D, POUR GÉRER LES POINTS ET LES VECTEURS DE L'ESPACE R... par pgl10

 Sources en rapport avec celle ci

CALCUL DE PI AVEC LA BIBLIOTHÈQUE GMP par lann
Source avec Zip DÉTERMINER PI PAR LE BIAIS DE LA MÉTHODE DE MONTE CARLO ( LA... par Shakan972
LES 2400 PREMIÈRES DÉCIMALES DE PI par euclidoscope

Commentaires et avis

Commentaire de Zipotron le 08/10/2012 10:50:04 7/10

Je n'ai pas vérifier les calcules ou si la syntaxe est ok, j'ai juste trouvé que faire plein des procédures
qui écrivent le même texte était pas très simplifié.

Voici ce que je pense qui est mieux mais ça fait 20 ans que j'ai pas fait du C++.

    #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;
    }
  
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;
    }

    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;
    }

    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];
    }


    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;
    }

    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;
    }
    
int main(void)
    {
int choix;
cout.precision(15);
long unsigned int iterations;
time_t temps;

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;

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

switch (choix)
{
case 2:
<< Process_Wallis(iterations);
break;

case 1:
<< Process_MadhavaLeibniz(iterations);
break;

case 3:
<< Process_viete(iterations);
break;

case 4:
<< Process_SuiteLeibniz(iterations);
break;

case 5:
<< Process_Salamin_Brent(iterations);
break;

case 6:
<< Process_BBP(iterations);
break;
}
<<endl;
}
cout<<"en "<<time(NULL)-temps<<" secondes"<<endl;

while (choix!=0);
return EXIT_SUCCESS;
    }

Comme j'ai dis plus haut.. pas sure pour la syntaxe car j'ai pas compilé le code ou vérifié les calcules..

a+

Commentaire de Zipotron le 08/10/2012 10:52:06

ps: je sais pas pourquoi l'indentation n'a pas fonctionné, désolé p-e Firefox qui fait des siennes..

Commentaire de lann le 08/10/2012 19:26:56

Oui c'est sans doute mieux mais je n'ai fait des copier coller :)

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Pseudo code avec problème :( (urgent) [ par cardi ] Mon poste ressemble un peu à celui de Goschan... Voici mon pseudo code pour faire un déplacement positif dans un vecteur d'entiers avec les pointeurs: C ANSI allocation dynamique de tableau [ par pedu ] Ce petit pro beug en sortie, pourquoi et que faire ?#include &lt;stdio.h&gt;#include &lt;stdlib.h&gt;int (*pi)[1][1]; /* pointeur sur un tableau d'e Symbole de PI [ par boun85 ] J'aimerai savoir comment faire pour afficher le symbole de PI à l'écran?Merci d'avance lecture fichier texte [ par amin79 ] Mon problème est de lire le fichier texte ci-joint et de mettre dans des tabkeaux int chaque colonne (ri, pi, di et yi) et une martrice int qui contie Probleme fonction creta process [ par morgandetoi06 ] bonjour, je suis en train de faire un installeur de patch correctifs winXPmais je n arrive pas à lancer mes patch en leur passant les parametres "-q - passage d'argement chaine [ par victorcoasne ] Je fais :int taille(char chaine[]){ cout &lt;&lt; chaine &lt;&lt; endl; return (sizeof(chaine)/sizeof(chaine[0])); }int main(){char Je débute ... premiere interrogation [ par rapapar ] salutC'est une question à 2balles...Je suis coincé dans visual .net...mais comment faire pour trouver une solution à part en supprimant les commentair Pb d'impression [ par cecel ] SalutJe devellope une appli qui permet d'imprimer des etiquettes sur une imprimante ZEBRA.J'utilise un driver "Generic text" car j'imprime un fichier CreateProcess [ par vecchio56 ] Salut,J'ai une petite question dont la réponse est sans doute dans la MSDN mais c'est vraiment long a lire alors avant de commencer je tente le coup i CreatePorcess + App 16-bits [ par vecchio56 ] BonjourJ'éxécute une application 16-bits avec CreateProcess mais je n'arrive pas à récupérer ce qu'il y a dans stdout. Le problème c'est que le même c


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Juin 2013
LMMJVSD
     12
3456789
10111213141516
17181920212223
24252627282930

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,201 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales