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 :

Erreur de Calcul sur le programme de calcul du nombre de neper e


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Manager
    Inscrit en
    Avril 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Gabon

    Informations professionnelles :
    Activité : Manager

    Informations forums :
    Inscription : Avril 2009
    Messages : 25
    Points : 22
    Points
    22
    Par défaut Erreur de Calcul sur le programme de calcul du nombre de neper e
    Bonsoir à tous !
    J'écrit un programme en C, qui me permet de calculer le nombre de Neper e,
    mais lors de l'exécution du progrmme, un mauvais résultat s'affiche, or nous savons tous que: e=2.71.....

    J'écrit au préalable une fonction facto(factorielle d'un nombre entier) qui marche très bien.
    Quelqu'un pourrez m’orienter où se trouverait l'erreur , s'il vous plait.
    Merci

    Mon 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
     
    int main()
    {
        int k, m;
        float neper=0;
        long int tmp;
     
        printf("Entrer le nombre de terme : ");
        scanf("\t%d", &m);
     
        for(k=0; k<=m; k++){
            tmp=facto(k);
            neper=neper+(1/tmp);
        }
     
       printf("\nLe nombre de  Népere e = %f", neper);
     
        do{}while(kbhit()==0);
        return 0;
    }

  2. #2
    Membre émérite
    Avatar de supersnail
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 719
    Points : 2 793
    Points
    2 793
    Par défaut
    Bonjour,

    Que renvoie facto(0) ? (et surtout quel résultat obtiens-tu )

    Sinon, faire un appel à la fonction facto à chaque tour de boucle n'est pas vraiment optimisé, vu que à une étape n, tu recalcules (n-1)! pour calculer n! alors que (n-1)! a déjà été calculé au tour de boucle précédent
    Toute question technique envoyée en MP ira directement à la poubelle

    Un code ne marchera jamais, il n'a jamais reçu la capacité de se déplacer.
    Inutile donc de dire "ça marche pas", donnez plutôt des informations précises afin de mieux pouvoir vous aider.


    Grand gourou de la -attitude

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 369
    Points : 23 623
    Points
    23 623
    Par défaut
    Bonsoir,

    À la ligne 13, essaie d'écrire ceci :

    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
    
    int main()
    {
        int k, m;
        float neper=0;
        long int tmp;
    
        printf("Entrer le nombre de terme : ");
        scanf("\t%d", &m);
    
        for(k=0; k<=m; k++){
            tmp=facto(k);
            neper=neper+(1.0/tmp);
        }
    
       printf("\nLe nombre de  Népere e = %f", neper);
    
        do{}while(kbhit()==0);
        return 0;
    }
    Écrits de cette façon, « 1 » et « tmp » sont tous deux des entiers, et la division se fait alors sur ce même format. « 1÷1 » vaut 1 et le résultat de la division entière de 1 par tout entier supérieur à 1 est forcément nul.

    Écrire « 1.0 » force le compilateur à considérer cette constante comme une valeur en virgule flottante. Lors d'une opération à deux opérandes au moins, le C promeut les deux parties vers le type le plus « fort », donc ici les flottants. Le reste de l'expression peut alors être calculé sans encombre. Mais tu aurais pu tout aussi bien utiliser explicitement un transtypage (cast) vers « (float) » ou « (double) ».

    C'est un piège assez classique du C et, par extension, de nombreux autres langages qui ont suivi, qu'ils soient compilés ou interprétés. Même Gnuplot est sensible à ce phénomène.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Manager
    Inscrit en
    Avril 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Gabon

    Informations professionnelles :
    Activité : Manager

    Informations forums :
    Inscription : Avril 2009
    Messages : 25
    Points : 22
    Points
    22
    Par défaut Erreur de Calcul sur le programme de calcul du nombre de neper e
    Bonjour !
    supersnail : Ma fonction a en effet un problème dont je viens juste de m'en apercevoir !
    facto(0), telle que j'ai l'écrit me renvoi 1, ce qui n'est pas faux, mais facto(5) me renvoi aussi 1. C'est donc pas du bon !
    Et je ne te comprend pas très bien, quand tu me dis que ce n'est pas bien optimisé de mettre la fonction dans la boucle, hors je vois que ça marche.
    Aurais-tu une autre solution ?

    En réécrivant facto() ainsi : (N*facto(N-1)), ça va

    Aussi, Obsidian a bien raison sur (1.0/tmp) !.

    A présent j'obtient : e=2.716667
    Mais avec (1/tmp) j'obtenait e=2.000

    ça, c'est vraiment un piège. Je vais fouiller sur, le transtypage !

    Merci à tous les deux !

  5. #5
    Membre émérite
    Avatar de supersnail
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 719
    Points : 2 793
    Points
    2 793
    Par défaut
    Bonjour,

    J'ai pas dit qu'appeler facto() ne marchait pas, j'ai juste dit que tu refaisais inutilement des calculs déjà faits alors que tu peux simplement stocker les calculs précédents dans une variable et les réutiliser pour calculer l'étape suivante de la factorielle
    Toute question technique envoyée en MP ira directement à la poubelle

    Un code ne marchera jamais, il n'a jamais reçu la capacité de se déplacer.
    Inutile donc de dire "ça marche pas", donnez plutôt des informations précises afin de mieux pouvoir vous aider.


    Grand gourou de la -attitude

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 685
    Points : 30 974
    Points
    30 974
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par thima137 Voir le message
    Et je ne te comprend pas très bien, quand tu me dis que ce n'est pas bien optimisé de mettre la fonction dans la boucle, hors je vois que ça marche.
    Bonjour

    Quand k vaut (par exemple) 4, tu calcules facto(4) en faisant 1x2x3x4.
    Au tour de boucle suivant, quand k passe à 5, tu calcules facto(5) en faisant 1x2x3x4x5. Tu vois bien que tu as fait 2 fois les mêmes opérations. Et etc etc etc quand k passe à 6, 7, 8, . Le "ça marche" n'est pas le seul critère. T'as aussi le "ça marche plus vite chez-moi que chez les autres" qui peut être décisif...

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    neper=1;
    for(k=1, tmp=1; k<=m; k++){
            tmp=tmp * k;
            neper=neper+(1.0/tmp);
    }
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. [XL-2003] programme de calcul sur VBA excel
    Par guytri dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 31/05/2012, 10h03
  2. Erreur de compilation sur un calcul de temps de diaporama
    Par epenede dans le forum VBA PowerPoint
    Réponses: 4
    Dernier message: 03/11/2009, 12h35
  3. Comment calculer et afficher des champs calculés sur les états ?
    Par babez dans le forum Bases de données
    Réponses: 8
    Dernier message: 05/06/2008, 21h51
  4. Réponses: 12
    Dernier message: 31/03/2006, 20h02

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