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++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre averti
    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
    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 averti
    Homme Profil pro
    Lyc�en
    Inscrit en
    Juillet 2010
    Messages
    46
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 29
    Localisation : France

    Informations professionnelles :
    Activit� : Lyc�en

    Informations forums :
    Inscription : Juillet 2010
    Messages : 46
    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 averti
    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
    Par d�faut
    Merci beaucoup pour ta r�ponse !

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

  4. #4
    Membre averti
    Homme Profil pro
    Lyc�en
    Inscrit en
    Juillet 2010
    Messages
    46
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 29
    Localisation : France

    Informations professionnelles :
    Activit� : Lyc�en

    Informations forums :
    Inscription : Juillet 2010
    Messages : 46
    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 Expert
    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 : 38
    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
    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.

  6. #6
    Membre averti
    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
    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