Partage
  • Partager sur Facebook
  • Partager sur Twitter

comment fairep our calculer pi en c++

Sujet résolu
    21 août 2007 à 21:12:36

    Bonsoir,
    j'ai vu que certain logiciel faisait calculer PI à l'ordinateur pour en voir ces performence du style si le processeur chauffe beaucoup etc..
    Donc je voudrai savoir comment on peut faire ce calcule?

    Merciiii :)
    • Partager sur Facebook
    • Partager sur Twitter
    :)
    Anonyme
      21 août 2007 à 21:37:46

      1. #include <cmaths>
      2. //...
      3. cout<<M_PI;


      Bizarement , elle n'aparait pas la liste des constantes définies dans la liste des en-tête standard :
      (http://www.siteduzero.com/forum-83-11461-p1-listes-des-fonctions-c.html)
      • Partager sur Facebook
      • Partager sur Twitter
        21 août 2007 à 21:42:23

        Si tu veut utiliser pi pour faire des calcules, fait comme vient de dire Davidbrcz.
        Si tu veut calculer pi, va sur wikipedia article sur pi et implente un des algorithmes proposés.
        • Partager sur Facebook
        • Partager sur Twitter
        FaQ : Fr | En 1 2 | C++11 | Template || Blog : Deloget | C++|Boost--Dev | C++Next | GotW || Installer Boost
          21 août 2007 à 22:46:28

          Normal. Ce n'est pas une constante standard -- même si pas mal répandue.
          • Partager sur Facebook
          • Partager sur Twitter
          C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
          Anonyme
            21 août 2007 à 23:22:10

            Citation : lmghs

            Normal. Ce n'est pas une constante standard -- même si pas mal répandue.


            Bizarre que la SL du C( et par extension du C++) ne donne rien de standard pour PI.
            • Partager sur Facebook
            • Partager sur Twitter
              22 août 2007 à 8:27:32

              Oui, M_PI n'est pas standard.
              Mais bon, un moyen simple d'y remédier est le suivant.
              Dans un .h appelé pas tous tes fichiers .C ou .cpp (ou plusieurs fois meme, c'est pas genant), mettre :

              1. #ifndef M_PI
              2. #define M_PI 3.14159265359
              3. #endif


              • Partager sur Facebook
              • Partager sur Twitter

              Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                22 août 2007 à 9:46:24

                Je pense que vous n'avez pas compris... Il demande comment on calcule la valeur de pi, il veut pas la valeur, il veut juste calculer pi. Pas pour calculer des trucs à l'aide de pi, mais juste le calculer.
                • Partager sur Facebook
                • Partager sur Twitter
                  22 août 2007 à 10:38:09

                  Une solution (mauvaise au niveau mathématique mais facile à coder) est de faire comme ça:

                  Tu calcules la somme des inverses des carrés (<math>\(1%2F1%20%2B%201%2F4%20%2B%201%2F9%20%2B...%20%2B%201%2F10%5E2%20%2B%20...%20%2B%201%2F53%5E2%20%2B...\)</math>) puis tu multiplies par 6 et tu prends la racine carrée du résultat.


                  Je me base sur la formule :<math>\(%5Csum_%7Bn%3D1%7D%5E%7B%2B%5Cinfty%7D%7B1%20%5Cover%20n%5E%7B2%7D%7D%20%3D%20%5Cfrac%7B%5Cpi%5E2%7D%7B6%7D\)</math> (Cas particulier de la série de Riemann)
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                    22 août 2007 à 11:36:18

                    Sinon en C++ du peu inclure
                    1. #include <math.h>


                    et normalement pi est contenu dans la variable PI
                    • Partager sur Facebook
                    • Partager sur Twitter
                      22 août 2007 à 11:53:18

                      psychoh13 > ah oui, en effet, je pense qu'on s'est égaré, lol !
                      Tres sympa le lien Wikipedia :)
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                        22 août 2007 à 12:05:37

                        Voilà le code mais code::blocks décone - t -il?? car il me donne des erreurs bizzard..

                        main.cpp

                        1. #include <iostream>
                        2. #include <string>
                        3. #include <ctime>
                        4. #include <cmath>
                        5. void calcul_pi(int temps);
                        6. void pause();
                        7. int main()
                        8. {
                        9.     string temps = NULL;
                        10.     cout << "Entree le temps que vous souhaitez tester votre machine (en seconde) : ";
                        11.     cin >> temps;
                        12.     calcul_pi( (int)temps);
                        13.     pause();
                        14.     return 0;
                        15. }
                        16. void calcul_pi(int temps)
                        17. {
                        18.     size_t i = 0;
                        19.     long float pi = 0;
                        20.     time_t tempsDebut = time(NULL);
                        21.     while( (tempsActuel - tempsDebut) < temps )
                        22.     {
                        23.         tempsActuel = time(NULL);
                        24.         pi = ( (1/i++) + pi );
                        25.     }
                        26.     pi = ( sqrt(pi)/6 );
                        27.     cout << "PI est egal a : " << pi << endl;
                        28. }
                        29. void pause()
                        30. {
                        31.     char num[1000];
                        32.     cout << "Appuyez sur une touche puis sur entree pour quitter le programme..." << endl;
                        33.     cin >> num;
                        34. }


                        Project   : Console application
                        Compiler  : GNU GCC Compiler (called directly)
                        Directory : D:\Documents and Settings\Propriétaire\Mes documents\programme test C-C++\PI\
                        --------------------------------------------------------------------------------
                        Switching to target: default
                        Compiling: main.cpp
                        main.cpp: In function `int main()':
                        main.cpp:11: error: `string' undeclared (first use this function)
                        main.cpp:11: error: (Each undeclared identifier is reported only once for each function it appears in.)
                        main.cpp:11: error: expected `;' before "temps"
                        main.cpp:13: error: `cout' undeclared (first use this function)
                        main.cpp:14: error: `cin' undeclared (first use this function)
                        main.cpp:14: error: `temps' undeclared (first use this function)
                        main.cpp: In function `void calcul_pi(int)':
                        main.cpp:25: error: short, signed or unsigned invalid for `pi'
                        main.cpp:28: error: `tempsActuel' undeclared (first use this function)
                        main.cpp:37: error: `cout' undeclared (first use this function)
                        main.cpp:37: error: `endl' undeclared (first use this function)
                        main.cpp: In function `void pause()':
                        main.cpp:44: error: `cout' undeclared (first use this function)
                        main.cpp:44: error: `endl' undeclared (first use this function)
                        main.cpp:45: error: `cin' undeclared (first use this function)
                        Process terminated with status 1 (0 minutes, 0 seconds)
                        13 errors, 0 warnings
                        • Partager sur Facebook
                        • Partager sur Twitter
                        :)
                          22 août 2007 à 12:11:26

                          Pourquoi rejeter la faute sur CB?
                          Si tu mets ton projet en C, il ne compilera pas du C++, c'est tout.
                          Au passage, tu appliques mal la formule.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            22 août 2007 à 12:12:43

                            le truck c'est que je l'ai mis en c++
                            • Partager sur Facebook
                            • Partager sur Twitter
                            :)
                              22 août 2007 à 12:15:43

                              Soit tu mets un "using namespace std", ou bien tu mets "std::" devant tes cout (et les endl aussi).
                              • Partager sur Facebook
                              • Partager sur Twitter
                                22 août 2007 à 12:31:44

                                Voilà le code corrigé.
                                Mais je ne comprend pas sa marche pas.

                                1. #include <iostream>
                                2. #include <string>
                                3. #include <ctime>
                                4. #include <cmath>
                                5. using namespace std;
                                6. void calcul_pi(int tempsEntree);
                                7. void pause();
                                8. int main()
                                9. {
                                10.     string tempsEntree;
                                11.     cout << "Entree le temps que vous souhaitez tester votre machine (en seconde) : ";
                                12.     cin >> tempsEntree;
                                13.     calcul_pi( atoi(tempsEntree.c_str()) );
                                14.     pause();
                                15.         return 0;
                                16. }
                                17. void calcul_pi(int tempsEntree)
                                18. {
                                19.     size_t i = 0;
                                20.     float pi = 0;
                                21.     const time_t tempsDebut = time(NULL);
                                22.     time_t tempsActuel;
                                23.     while( (tempsActuel - tempsDebut) != tempsEntree )
                                24.     {
                                25.         tempsActuel = time(NULL);
                                26.         pi = ( (1/i++) + pi );
                                27.     }
                                28.     pi = ( sqrt(pi)/6 );
                                29.     cout << "PI est egal a : " << pi << endl;
                                30. }
                                31. void pause()
                                32. {
                                33.     char num[1000];
                                34.     cout << "Appuyez sur une touche puis sur entree pour quitter le programme..." << endl;
                                35.     cin >> num;
                                36. }


                                Je ne vois pas d'erreur...
                                Code::blocks ne trouve rien
                                • Partager sur Facebook
                                • Partager sur Twitter
                                :)
                                  22 août 2007 à 13:06:49

                                  Il faut compilre en C++ et pas en C...

                                  Et comme déjà dit, tu appliques mal la formule. Regarde ce que j'ai mis.
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                                    22 août 2007 à 14:18:35

                                    Citation : Nanoc

                                    Il faut compilre en C++ et pas en C...

                                    Et comme déjà dit, tu appliques mal la formule. Regarde ce que j'ai mis.


                                    Je compile en c++ sinon les cout et cin ne fonctionnerai pas.

                                    La formule??? j'ai du mal la comprendre j'y retourne lol
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    :)
                                      22 août 2007 à 14:28:06

                                      Citation : Nanoc

                                      Tu calcules la somme des inverses des carrés (<math>\(1%2F1%20%2B%201%2F4%20%2B%201%2F9%20%2B...%20%2B%201%2F10%5E2%20%2B%20...%20%2B%201%2F53%5E2%20%2B...\)</math>) puis tu multiplies par 6 et tu prends la racine carrée du résultat.



                                      C'est pourtant clair non ?

                                      Tu as oublier de mettre "using namespace std;"
                                      Et plutot que de demander le temps, demande le nombre d'itérations ce sera plus correct.

                                      Je tiens à préciser que cette méthode ne te donnera pas plus de 7 ou 8 décimales correctes (et encore) même en utilisant des double
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                                        22 août 2007 à 14:28:51

                                        Citation : Nanoc



                                        Je tiens à préciser que cette méthode ne te donnera pas plus de 7 ou 8 décimales correctes (et encore) même en utilisant des double



                                        pourquoi?
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                        :)
                                          22 août 2007 à 14:32:02

                                          Parce que l'ordinateur est limité dans la représentation des nombres. Il ne conserve que un certain nombres de décimales. 16 je crois pour les doubles. Il arrondi la suite.

                                          De plus le passage par la racine n'améliore pas les choses, l'algorithme de calcul de la racine n'étant pas parfait pour une infinité de décimale.

                                          Toute machine quelle qu'elle soit, est une machine finie , elle ne pourra donc calculer qu'aec un nombre fini de décimales.
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                          Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                                            22 août 2007 à 14:34:26

                                            C'était des connerie ce que j'ai lu alors, que pour faire des tests pour savoir si le processeur chauffais une fois overckloqué qu'il utilisait un calcul de décimals de pi?
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                            :)
                                              22 août 2007 à 14:39:08

                                              C'est tout à fait possible.

                                              Mais alors il utilise pas un "bête" programme comme celui que tu as écrit. Il utilise des algorithmes plus puissants et surtout d'autres bibliothèques permettant de gérer des grands nombres.

                                              Juste pour information avec l'algo que je t'ai donné et sous Excel on obtient:

                                              avec les nombres de 1 à 100: 3.132076532
                                              avec les nombres de 1 à 1000: 3.140618582
                                              avec les nombres de 1 à 5000: 3.140618582

                                              Et on remarque que on a atteint la limite de cet algorithme. Donc 2 décimales. Peut-être que tu as mieux en C++ mais là je peux pas tester.

                                              ---------------------------------------------------------------------------
                                              EDIT:

                                              Pour faire mieux essaye peut-être la formule suivante:

                                              Image utilisateur
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                              Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                                                22 août 2007 à 15:01:57

                                                Sur wikipedia, il donne ces 2 formules :

                                                Image utilisateur
                                                Image utilisateur

                                                Je les ai pas testé mais elles me semblent plus simple à intégrer que les formules de Machin (cf wiki) utilisé habituellement.
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                FaQ : Fr | En 1 2 | C++11 | Template || Blog : Deloget | C++|Boost--Dev | C++Next | GotW || Installer Boost
                                                  22 août 2007 à 15:09:49

                                                  Citation : Freedom

                                                  Sur wikipedia, il donne ces 2 formules :

                                                  Image utilisateur
                                                  Image utilisateur

                                                  Je les ai pas testé mais elles me semblent plus simple à intégrer que les formules de Machin (cf wiki) utilisé habituellement.



                                                  C'est quoi ces points d'exclamations ??
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                  :)
                                                    22 août 2007 à 15:14:11

                                                    Oui mais tu as un calcul de factorielle dedans, ce qui veut dire que tu obtients des nombres énormes très rapidement. Et pour être précis tu as besoin de toutes les décimales de ces nombres. Or l'ordinateur ne garde que les 16 (?) premiers chiffres pour le type double. Ce qui veut dire qu'avec 20! = 2432902008176640000 tu dépasses ce nombre. Et avec 20 itérations, tu es très loin d'une bonne valeur pour pi.

                                                    De plus il y a une racine de 2 qui doit être hyper-précise sinon tu perds dans tes décimales de pi et finalement tu dois encore inverser le résultat, chose qui se fait pas sans perdre de précision.

                                                    J'ai pas de quoi les tester, mais tes 2 formules sont certainement plus mauvaises que celles au-dessus.

                                                    EDIT : Le! est la factorielle d'un nombre<math>\(n%21%20%3D%201%2A2%2A3%2A4%2A...%2An\)</math> Exemple: <math>\(5%21%20%3D%201%2A2%2A3%2A4%2A5%20%3D%20120\)</math>
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                    Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                                                      22 août 2007 à 15:17:23

                                                      Comment je peux faire pour choper les chiffres avant la virgule et après? existe il une fonction??
                                                      Gràace a ça je n'aurais plus de float mais long long, mauvaise idée?
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                      :)
                                                        22 août 2007 à 15:20:52

                                                        En effet les formules de Freedom, mon ordinateur rend l'âme pour k=3 déjà.
                                                        Je trouve pi = 129143562.35 avec la 1ere et pi =-6952288102451570000 avec la 2eme.

                                                        Mais à nouveau ceci est uniquement du au fait que les ordinateurs sont des machines finies.

                                                        --------------------------------------------------------------------------------------------------------------------

                                                        Pour gêrer les grands nombres, il existe des bilbiothèques spéciales (LAPACK,..) mais c'est pas drôle mieux vaut la coder soi-même.

                                                        long long sera peut être mieux mais bon 10 décimales à la place de 3-4 c'est pas génial non-plus
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                        Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                                                          22 août 2007 à 15:32:10

                                                          Ha oui j'avais pas vu sa comme sa :p
                                                          La formules que tu as donné devrait mieux aller alors :
                                                          Image utilisateur
                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                          FaQ : Fr | En 1 2 | C++11 | Template || Blog : Deloget | C++|Boost--Dev | C++Next | GotW || Installer Boost

                                                          comment fairep our calculer pi en c++

                                                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                          • Editeur
                                                          • Markdown