Calculer le nombre PI [Résolu]

Signaler
Messages postés
4
Date d'inscription
mercredi 18 mai 2005
Statut
Membre
Dernière intervention
17 juin 2006
-
 SAKingdom -
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

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

++
Messages postés
295
Date d'inscription
dimanche 4 mai 2003
Statut
Membre
Dernière intervention
6 décembre 2010

z n'a pas de valeur :
bool z;

plutot :
boll z= false;
Messages postés
295
Date d'inscription
dimanche 4 mai 2003
Statut
Membre
Dernière intervention
6 décembre 2010

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


}
Messages postés
244
Date d'inscription
vendredi 6 mai 2005
Statut
Membre
Dernière intervention
6 avril 2008
1
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 ?
Messages postés
244
Date d'inscription
vendredi 6 mai 2005
Statut
Membre
Dernière intervention
6 avril 2008
1
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
Messages postés
4
Date d'inscription
mercredi 18 mai 2005
Statut
Membre
Dernière intervention
17 juin 2006

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;


}
Messages postés
244
Date d'inscription
vendredi 6 mai 2005
Statut
Membre
Dernière intervention
6 avril 2008
1
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+
Messages postés
244
Date d'inscription
vendredi 6 mai 2005
Statut
Membre
Dernière intervention
6 avril 2008
1
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+
Messages postés
4
Date d'inscription
mercredi 18 mai 2005
Statut
Membre
Dernière intervention
17 juin 2006

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 ???
Messages postés
295
Date d'inscription
dimanche 4 mai 2003
Statut
Membre
Dernière intervention
6 décembre 2010

        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)
Messages postés
295
Date d'inscription
dimanche 4 mai 2003
Statut
Membre
Dernière intervention
6 décembre 2010

        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" /?>
Messages postés
244
Date d'inscription
vendredi 6 mai 2005
Statut
Membre
Dernière intervention
6 avril 2008
1
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 )
Messages postés
295
Date d'inscription
dimanche 4 mai 2003
Statut
Membre
Dernière intervention
6 décembre 2010

effectivement
Messages postés
4
Date d'inscription
mercredi 18 mai 2005
Statut
Membre
Dernière intervention
17 juin 2006

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
Messages postés
244
Date d'inscription
vendredi 6 mai 2005
Statut
Membre
Dernière intervention
6 avril 2008
1
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.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
Instruction FLDPI (asm) te le donne illico.
Suffit de: FSTP qword ptr[ADRESSE]
à la suite pour le récupérer.

ciao...
BruNews, MVP VC++
Messages postés
244
Date d'inscription
vendredi 6 mai 2005
Statut
Membre
Dernière intervention
6 avril 2008
1
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 ?
Messages postés
244
Date d'inscription
vendredi 6 mai 2005
Statut
Membre
Dernière intervention
6 avril 2008
1
Je ne comprends pas la remarque de BruNews ?
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
Je pensais qu'il fallait trouver PI, j'ai donc donné la solution la + rapide.

ciao...
BruNews, MVP VC++
Messages postés
244
Date d'inscription
vendredi 6 mai 2005
Statut
Membre
Dernière intervention
6 avril 2008
1
Oui mais je pensais qu'il fallait trouver PI de CETTE manière