cs_lann
Messages postés16Date d'inscriptionmercredi 30 octobre 2002StatutMembreDernière intervention14 novembre 2007 8 oct. 2012 à 19:26
Oui c'est sans doute mieux mais je n'ai fait des copier coller :)
cs_Zipotron
Messages postés6Date d'inscriptiondimanche 27 juin 2004StatutMembreDernière intervention 8 octobre 2012 8 oct. 2012 à 10:52
ps: je sais pas pourquoi l'indentation n'a pas fonctionné, désolé p-e Firefox qui fait des siennes..
cs_Zipotron
Messages postés6Date d'inscriptiondimanche 27 juin 2004StatutMembreDernière intervention 8 octobre 2012 8 oct. 2012 à 10:50
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++.
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;
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;
8 oct. 2012 à 19:26
8 oct. 2012 à 10:52
8 oct. 2012 à 10:50
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
#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+