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 :

probleme de calcul factoriel


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    1 124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 124
    Par défaut probleme de calcul factoriel
    Bonjour tout le monde

    J'ai un problème avec le calcul de la factoriel.

    Voici le code, je ne mets que la fonction où il y a la boucle.

    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
     
    int factoriel(int m)
    {
        int i;
     
        for(i=1;i<m;i++)
        {
     
        m = m*i;
     
        }
     
       printf("resulat %d\n", m); 
      return m;  
    }
    Il me sort des résultat négatif.

    Pourquoi?

    Merci.

    Cordialement

    A bientôt

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Citation Envoyé par argon
    Bonjour tout le monde

    J'ai un problème avec le calcul de la factoriel.

    Voici le code, je ne mets que la fonction où il y a la boucle.

    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
     
    int factoriel(int m)
    {
        int i;
     
        for(i=1;i<m;i++)
        {
     
        m = m*i;
     
        }
     
       printf("resulat %d\n", m); 
      return m;  
    }
    Il me sort des résultat négatif.

    Pourquoi?

    Merci.

    Cordialement

    A bientôt
    … overflow…

    un "int" est stocké sur un nombre fini de bits (8, 16, 32, 64, 128 pour les architectures les plus courantes)
    dès que le résultat est plus grand que le plus grand entier positif représentable sur le nombre de bits dédiés aux entiers "int" par votre architecture (hardware + compilateur), le résultat apparaîtra négatif…

    vous gagnerez un peu "d'espace" en déclarant i et m "unsigned int",
    ou encore "unsigned long long"…

    mais pour calculer de très grand nombres il faut utiliser une bibliothèque adhoc… voir par exemple http://www.swox.com/gmp/

  3. #3
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par JeitEmgie
    … overflow…

    un "int" est stocké sur un nombre fini de bits (8, 16, 32, 64, 128 pour les architectures les plus courantes)
    dès que le résultat est plus grand que le plus grand entier positif représentable sur le nombre de bits dédiés aux entiers "int" par votre architecture (hardware + compilateur), le résultat apparaîtra négatif…

    vous gagnerez un peu "d'espace" en déclarant i et m "unsigned int",
    ou encore "unsigned long long"…

    mais pour calculer de très grand nombres il faut utiliser une bibliothèque adhoc… voir par exemple http://www.swox.com/gmp/
    En l'occurence, il y avait overflow déjà avec l'appel factoriel(3). Le problème était un problème de logique et non d'entier signé ou non. Toutefois, il est vrai qu'on peut déclarer result comme unsigned int, celui-ci ne prenant jamais de valeur négative (c'est même préférable). En ce qui concerne i, ce n'est pas forcément nécessaire. Dans le calcul d'une factorielle, c'est surtout le résultat qui devient énorme.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    oui dans ce cas-là moi je mettrais le résultat en double....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    double factoriel(int m)
    {
        int i;
        double result = (double)m;
     
        for (i = 1; i < m; i++)
        {
            result = result * (double)i;
        }
     
        printf("resultat %g\n", result);
        return result;
    }

  5. #5
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par souviron34
    oui dans ce cas-là moi je mettrais le résultat en double....
    Heu pas plutôt unsigned long ? double étant un nombre à virgule flottante et lui il est basé sur un int au départ.
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Franck.H
    Heu pas plutôt unsigned long ? double étant un nombre à virgule flottante et lui il est basé sur un int au départ.
    et ??

    factorielle (255 ) doit bien dépasser les capacités d'un int ou long non ?
    Suivant l'architecture c'est assez facile à calculer :

    le max est soit 32 soit 64 bits pour un entier... donc 2^ 32 ou 64

    je suppose donc (en gros, je vais pas me taper le calcul) que factorielle(66) dépasse les 64 bits..

  7. #7
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Salut,

    Le problème vient du fait que tu utilises le paramètre m comme condition d'arrêt de ta boucle for, mais que m est également modifié dans le corps de ta boucle. Le code suivant fonctionne:
    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
    #include <stdio.h>
    #include <stdlib.h>
     
    int factoriel(int m)
    {
        int i;
        int result = m;
     
        for (i = 1; i < m; i++)
        {
            result = result * i;
        }
     
        printf("resulat %d\n", result);
        return result;
    }
     
    int main(void)
    {
        factoriel(3);
     
        return EXIT_SUCCESS;
    }
    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    1 124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 124
    Par défaut
    Bonjour tout le monde

    Ca fonctionne.

    Je devais le faie en itératif pas en récusif.

    Merci

    Cordialement

    A bientôt

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

Discussions similaires

  1. [Langage/Algorithme] probleme calcul Factorielle, Coefficient binomial
    Par dz_robotix dans le forum C++Builder
    Réponses: 1
    Dernier message: 15/10/2010, 10h01
  2. Probleme de calcul :S
    Par vodevil dans le forum Langage
    Réponses: 2
    Dernier message: 22/12/2005, 20h06
  3. probleme de calculs : 1-0.9 = 0.099999999999998
    Par francon81 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 30/06/2005, 14h17
  4. Petit probleme de calcul...
    Par Mistoufline dans le forum Algorithmes et structures de données
    Réponses: 18
    Dernier message: 17/05/2005, 16h52
  5. [Conversion]Probleme de calcul en double et en floatant
    Par TOPGUN89 dans le forum Général Java
    Réponses: 2
    Dernier message: 18/04/2005, 17h46

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