IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Calculer pi problème


Sujet :

C++

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 51
    Points : 56
    Points
    56
    Par défaut Calculer pi problème
    Bonsoir,

    Je débute tout juste le C++ en suivant quelques cours C++, pour me donner un petit défis j'ai essayer de créer un programme simple pour calculer pi.
    Cependant, lorsque je lance le programme, il n'y a afficher que des 3 ... J'ai cherché plusieurs solutions (changer les variables pour faire des testes, nommer des variables pour simplifier...), j'ai regardé bien 50 fois la fonction mais rien... Même sur internet aucun sujet traitant de ça ...

    J'ai peut-être une idée, c'est que le programme fait des arrondis des résultats à chaque fois ! mais je ne suis pas sur.

    Voici le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    #include <iostream>
     
    using namespace std;
     
    int main()  // pi= 4/1 + 4/3 - 4/5 + 4/7 etc...
    {
     
        double pi(0);
        int deno(-1); //c'est le dénominateur qui va servir a ajouter ce qu'il faut à pi (ex: 1 de 4/1)
                      //il est négatif pour qu'au premier tour, le dénominateur soit 1 : -1 + 2 = 1
        double deno1(0);//c'est ce que l'on va ajouter à pi (ex: 4/1)
     
       while (pi != 3.14159265)
       {
          deno += 2;
          deno1 = 4 / deno;
          pi = pi + deno1;
     
          cout << pi << endl;
     
          deno += 2;
          deno1 = 4 / deno;
          pi = pi - deno1;
     
          cout << pi << endl;
     
       }
     
        return 0;
    }
    Si vous avez des questions n'hésitez pas !
    Merci

  2. #2
    Membre régulier
    Homme Profil pro
    Lycéen
    Inscrit en
    Juillet 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juillet 2010
    Messages : 46
    Points : 73
    Points
    73
    Par défaut
    Hello,


    Ton dénominateur est un int, de ce fait, lorsque tu calcules par exemple 4 / 3, tu auras comme résultat 1 et non 1.333...
    ...la solution sera alors de le caster en double, soit en faisant 4.0 / deno, soit en utilisant un cast sur deno, du genre 4 / (double)deno ou 4 / static_cast<double>(deno).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    #include <iostream>
     
    int	main(void)
    {
    	double	pi = 0;
    	int	deno = -1;	// c'est le dénominateur qui va servir a ajouter ce qu'il faut à pi (ex: 1 de 4/1)
    				// il est négatif pour qu'au premier tour, le dénominateur soit 1 : -1 + 2 = 1
    	double	deno1 = 0;	// c'est ce que l'on va ajouter à pi (ex: 4/1)
     
    	while (pi != 3.14159265)
    	{
    		deno += 2;
    		deno1 = 4.0 / deno;
    		pi += deno1;
    		std::cout << pi << std::endl;
     
    		deno += 2;
    		deno1 = 4.0 / deno
    		pi -= deno1;
    		std::cout << pi << std::endl;
    	}
     
    	return (0);
    }
    Bon, il oscille encore entre 3.141558 et 3.141560 à l'infini, mais là ce n'est qu'une simple question de précision décimale.
    Tu peux soit décider d'arrêter ta boucle dès qu'il arrive dans une range proche de pi, ou alors de décider à l'avance de faire seulement n tours.


    Bonne soirée,
    Raphaël.

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 51
    Points : 56
    Points
    56
    Par défaut
    Merci beaucoup pour ta réponse !

    Il existe un moyen d'augmenter le nombre de décimale ?

  4. #4
    Membre régulier
    Homme Profil pro
    Lycéen
    Inscrit en
    Juillet 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juillet 2010
    Messages : 46
    Points : 73
    Points
    73
    Par défaut
    Hello,

    Je ne sais pas si cela serait encore suffisant, mais tu devrais pouvoir utiliser des 'long double', qui font 12 bytes (au lieu de 8 pour les double) sur mon Windows 7, et 16 bytes avec ma VM Lubuntu & mon laptop Linux Mint -- à noter que j'utilise g++ sur les trois ; d'après ce que je lisais, c'est dépendant, et de la machine, et du compilo.

    Après, si tu souhaites encore plus de précision, tu peux faire de l' "arbitrary-precision arithmetic", en utilisant soit une library déjà fait (je n'ai pas de nom à te donner là-dessus, désolé), ou alors, créer tes propres fonctions pour ça ; ce qui peut se montrer compliqué et peu efficace, mais pédagogiquement intéressant.

    Amuse-toi bien

  5. #5
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Bonjour,

    il ne s'agit pas d'un problème intrinsèquement lié à la taille du type flottant employé, mais du fait que pi = sum 4*(-1)^n / (2n+1) est vrai dans le corps de réels mais pas dans l'ensemble des float, doubles, long doubles, etc. Il faut s'intéresser à d'autres développements de pi pour parvenir à avoir quelque chose qui converge. Internet regorge d'algo.
    -- Yankel Scialom

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 51
    Points : 56
    Points
    56
    Par défaut
    Ok je vais me pencher plus sur le sujet alors ^^
    Merci beaucoup !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. calcul factorielle problème
    Par marcelgore dans le forum Prolog
    Réponses: 3
    Dernier message: 12/05/2011, 09h48
  2. problème de calcul des normales par sommet
    Par captainSeb dans le forum OpenGL
    Réponses: 2
    Dernier message: 21/01/2005, 13h42
  3. Calcul dans un triggers : problème du +
    Par eXiaNazaire dans le forum Oracle
    Réponses: 3
    Dernier message: 07/01/2005, 10h14
  4. [Calendar]Problème de calcul de date
    Par valerie90 dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 08/12/2004, 12h13
  5. Problème de calcul unix_timestamp
    Par petit_stagiaire dans le forum Administration
    Réponses: 2
    Dernier message: 28/04/2004, 15h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo