Calculer le nombre PI

Résolu
Cedus Messages postés 4 Date d'inscription mercredi 18 mai 2005 Statut Membre Dernière intervention 17 juin 2006 - 16 juin 2006 à 16:55
 SAKingdom - 17 juin 2006 à 15:59
Bonjour,

J'ai trouvé une méthode permettant de calculer le nombre Pi et j'ai essayé de faire un algorithme sans succès .


La méthode est :


Pi / 4 = 1/1 - 1/3 + 1/5 - 1/7 + 1/9 - 1/11…



<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /?>
 




Donc voici mon code en C++ :



 





#include <cstdlib>





#include






 






using namespace std;






 






int main(int argc, char *argv[])





{






    double pi=0;






    bool z;






    int d;






   








    for (d=1;10000;d=d+2)






        {






        if (z==false) { z=true; }






        if (z==true) { z=false; }






       








        if (z==false) { pi=pi+1/d; }






        if (z==true) { pi=pi-1/d; }






       








        system("cls");






       








        cout << "z: " << z << "\n";






       
cout << "d: " << d << "\n";



       






        cout << "PI: " << pi << "\n";



       
}






     








    system("PAUSE");






    return EXIT_SUCCESS;




}



 





 




Le code se compile dans Dev-C++ mais la variable booléenne z reste constante.



 




Je suis vraiment débutant en C++ alors si quelqu’un pourrait m’aider, ce serait vraiment sympa.



 




Merci d’avance .

22 réponses

cs_laurent1024 Messages postés 987 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 30 août 2012 25
16 juin 2006 à 17:08
Tu peut aussi faire z = !z;

++
3
niketou Messages postés 295 Date d'inscription dimanche 4 mai 2003 Statut Membre Dernière intervention 6 décembre 2010
16 juin 2006 à 17:10
z n'a pas de valeur :
bool z;

plutot :
boll z= false;
3
niketou Messages postés 295 Date d'inscription dimanche 4 mai 2003 Statut Membre Dernière intervention 6 décembre 2010
16 juin 2006 à 17:11
#include <cstdlib>


#include


 


using namespace std;


 


int main(int argc, char *argv[])


{


    double pi=0;


    bool z =false;


    int d;


   


    for (d=1;10000;d=d+2)


        {


     //   if (z==false) { z=true; }


     //   if (z==true) { z=false; }


       
switch (z)




{
case (false) :
 z=true;
 break;


case (true) :
 z=false;
 break;
}


 




        if (z==false) { pi=pi+1/d; }


        if (z==true) { pi=pi-1/d; }


       


        system("cls");


       


        cout << "z: " << z << "\n";


        cout << "d: " << d << "\n";


       


        cout << "PI: " << pi << "\n";


        }


     


    system("PAUSE");


    return EXIT_SUCCESS;


}
3
ncoder Messages postés 244 Date d'inscription vendredi 6 mai 2005 Statut Membre Dernière intervention 6 avril 2008 1
16 juin 2006 à 17:13
On a tous répondu en mème temps je crois ...

En tout cas tu es sur que :
for (d=1;10000;d=d+2) marche ?

for (d=1;d<10000;d=d+2) n'est pas mieux par hasard ?
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ncoder Messages postés 244 Date d'inscription vendredi 6 mai 2005 Statut Membre Dernière intervention 6 avril 2008 1
16 juin 2006 à 17:15
Enfin ça va marcher mais ça sera illimité ...

Tu peux encore raccourcir en :

if (z==false) pi+=1/d;
else pi-=1/d;

Tu peux meme supprimer les accolades car ya qu'une expression ensuite
3
Cedus Messages postés 4 Date d'inscription mercredi 18 mai 2005 Statut Membre Dernière intervention 17 juin 2006
16 juin 2006 à 17:28
Merci pour toutes ces réponses si rapides mais j'ai essayé le code posté par niketou et la variable pi reste constante à pi = -1 !!!

Quelqu'un pourrait m'expliquer

code :
#include <cstdlib>
#include




using namespace std;
 


int main(int argc, char *argv[])


{


    double pi = 0;
    bool z = false;
    int d;


   
    for (d=1;d<10000;d=d+2)


        {
 
        switch (z)
               {
                case (false) :
                z=true;
                break;


                case (true) :
                z=false;
                break;
                }




        if (z==false) pi=pi+1/d;
        if (z==true) pi=pi-1/d;  


        system("cls");
       
        cout << "z: " << z << "\n";


        cout << "d: " << d << "\n";


        cout << "PI: " << pi << "\n";


        } 


    system("PAUSE");


    return EXIT_SUCCESS;


}
3
ncoder Messages postés 244 Date d'inscription vendredi 6 mai 2005 Statut Membre Dernière intervention 6 avril 2008 1
16 juin 2006 à 18:31
Attention tu nous indiques :

Pi / 4 = 1/1 - 1/3 + 1/5 - 1/7 + 1/9 - 1/11…

Or tu mets :

cout << "PI: " << pi << "\n";

Cela ne serait pas plutot :

cout << "PI: " << pi*4 << "\n";

?

A+
3
ncoder Messages postés 244 Date d'inscription vendredi 6 mai 2005 Statut Membre Dernière intervention 6 avril 2008 1
16 juin 2006 à 19:09
Ca ça marche :

int main(int argc, char *argv[])
{

    double pi = 0;
    int z = 0;
    unsigned long d;

    for (d=1; d<10000; d=d+2)
    {

       if (!z){
                pi=pi+(double)1/d;
                z=1;
                }
        else {
             pi=pi-(double)1/d;
             z=0;
             }
            
}

printf("z : %d\n", z);

printf("PI : %f\n", (double)(pi*4) );

    system("PAUSE");

    return 0;

}

J'ai converti en C.

A+
3
Cedus Messages postés 4 Date d'inscription mercredi 18 mai 2005 Statut Membre Dernière intervention 17 juin 2006
17 juin 2006 à 14:10
Merci beaucoup pour ton code ncoder mais je n'ai qu'une précision de 6 chiffres après la virgule. Est il possible d'avoir une meilleure précision ???
3
niketou Messages postés 295 Date d'inscription dimanche 4 mai 2003 Statut Membre Dernière intervention 6 décembre 2010
16 juin 2006 à 17:04
        if (z==false) { z=true; }<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>






        if (z==true) { z=false; }

Tu peux m'expliquer stp?(je crois que l'erreur vient d'ici)
0
niketou Messages postés 295 Date d'inscription dimanche 4 mai 2003 Statut Membre Dernière intervention 6 décembre 2010
16 juin 2006 à 17:06
        if (z==false) { z=true; }  //si z= false il devient true




        if (z==true) { z=false; } // z est true vu qu'il est passé true (au dessus)donc il devient false

ca retournera toujour false
essais plutot les "select case".<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /?>
0
ncoder Messages postés 244 Date d'inscription vendredi 6 mai 2005 Statut Membre Dernière intervention 6 avril 2008 1
16 juin 2006 à 17:11
Rajoute "else" devant le 2eme if :

if (z==false) { z=true; }  //si z= false il devient trueelse if (z==true) { z=false; }

Ca plantera plus

A+

( De toute façon si z != false, il est égal à true car c'est une var booléenne, donc un else suffit tout simplement )
0
niketou Messages postés 295 Date d'inscription dimanche 4 mai 2003 Statut Membre Dernière intervention 6 décembre 2010
16 juin 2006 à 17:15
effectivement
0
Cedus Messages postés 4 Date d'inscription mercredi 18 mai 2005 Statut Membre Dernière intervention 17 juin 2006
16 juin 2006 à 17:25
Merci pour toutes ces réponses si rapides mais j'ai essayé le code posté par niketou et la variable pi reste constante à pi = -1 !!!

Quelqu'un pourrait m'expliquer
0
ncoder Messages postés 244 Date d'inscription vendredi 6 mai 2005 Statut Membre Dernière intervention 6 avril 2008 1
16 juin 2006 à 18:40
De plus :

Tu donnes z = 0 au début, dès qu'il va passer dans le switch, il deviendra z=1, alors qu'au début il nous faut l'inverse.

Mets plutot z=1 au début.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
16 juin 2006 à 18:40
Instruction FLDPI (asm) te le donne illico.
Suffit de: FSTP qword ptr[ADRESSE]
à la suite pour le récupérer.

ciao...
BruNews, MVP VC++
0
ncoder Messages postés 244 Date d'inscription vendredi 6 mai 2005 Statut Membre Dernière intervention 6 avril 2008 1
16 juin 2006 à 18:48
Ca doit etre du à une mauvaise conversion je pense ...

Un double doit etre converti par inadvertance en int donc on perd tout ce qu'il nous intéresse dans 1/d ...

Non ?
0
ncoder Messages postés 244 Date d'inscription vendredi 6 mai 2005 Statut Membre Dernière intervention 6 avril 2008 1
16 juin 2006 à 18:48
Je ne comprends pas la remarque de BruNews ?
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
16 juin 2006 à 19:10
Je pensais qu'il fallait trouver PI, j'ai donc donné la solution la + rapide.

ciao...
BruNews, MVP VC++
0
ncoder Messages postés 244 Date d'inscription vendredi 6 mai 2005 Statut Membre Dernière intervention 6 avril 2008 1
16 juin 2006 à 19:16
Oui mais je pensais qu'il fallait trouver PI de CETTE manière
0
Rejoignez-nous