Partage
  • Partager sur Facebook
  • Partager sur Twitter

utiliser la fonction factorielle sans la recoder

Sujet résolu
    5 décembre 2014 à 21:16:37

    Bon,

    je pense que tout le monde connait le fonction factorielle qui peut être présenté comme cela:

    long fact(const int n)
    {
        long res = 1;
        for(int i = 2; i <= n; i++)
            res*=i;
        return res;
    }

    Elle existe aussi en version récursive.

    -----------

    Bon, maintenant, ma question: ELLE EST Où LA FONCTION FACTORIELLE DE BASE? Celle qui devrait se trouver dans <cmath>?

    Le web est inondé de tutoriel pour recoder la fonction à l'aide de la récursivité, mais je trouve aussi plein de personne qui cherche la fonction standard sans trouver de réponse.

    Ne me dites qu'en même pas qu'elle n'existe pas dans la librairie standard du langage C? alors que des fonctions comme pow(x,puissance) ont été codées.

    Merci.

    -
    Edité par argaur313 5 décembre 2014 à 21:44:48

    • Partager sur Facebook
    • Partager sur Twitter
      5 décembre 2014 à 22:02:04

      éffectivement elle n'est pas dans cmath ni dans math.h mais elle y est dans la gsl .

      bref oui, il faut soit codée soit même ses fonctions mathématique soit faire appel à d'autre lib parce que math.h n'est pas très exaustif c'est vrais .

      • Partager sur Facebook
      • Partager sur Twitter
        6 décembre 2014 à 0:38:44

        Salut, une "vraie" fonction factorielle est un peu plus compliquée que tu le penses, du coup elle n'est pas incluse dans la bibliothèque C car c'est dur de faire une version qui soit générique.

        La fonction telle que tu l'as codée serait une catastrophe pour du code professionel (même si malheureusement il y 50000 exemples sur internet avec ce code), elle ne marche que pour les valeurs jusqu'à 12 quand long est codé sur 32 bits, les résultats suivants sont complètement faux ;)

        #include <stdio.h>
        
        unsigned long int fact1(const int n)
        {
            unsigned long int res = 1;
            for(int i = 2; i <= n; i++)
                res*=i;
            return res;
        }
        
        unsigned long long fact2(const int n)
        {
            unsigned long long res = 1;
            for(int i = 2; i <= n; i++)
                res*=i;
            return res;
        }
        
        int main(void) {
        	for (int i = 0; i < 20; i++) {
        		printf("fact1(%d): %lu\n", i, fact1(i) );
        		printf("fact2(%d): %llu\n", i, fact2(i) );
        	}
        	return 0;
        }
        
        
        Résultat:
        fact1(0): 1
        fact2(0): 1
        fact1(1): 1
        fact2(1): 1
        fact1(2): 2
        fact2(2): 2
        fact1(3): 6
        fact2(3): 6
        fact1(4): 24
        fact2(4): 24
        fact1(5): 120
        fact2(5): 120
        fact1(6): 720
        fact2(6): 720
        fact1(7): 5040
        fact2(7): 5040
        fact1(8): 40320
        fact2(8): 40320
        fact1(9): 362880
        fact2(9): 362880
        fact1(10): 3628800
        fact2(10): 3628800
        fact1(11): 39916800
        fact2(11): 39916800
        fact1(12): 479001600
        fact2(12): 479001600
        fact1(13): 1932053504
        fact2(13): 6227020800
        



        -
        Edité par Asteba 6 décembre 2014 à 0:42:12

        • Partager sur Facebook
        • Partager sur Twitter
          7 décembre 2014 à 23:36:58

          Bon bah merci,

          Je trouve ça vraiment étrange.

          Finalement je retourne un double.

          • Partager sur Facebook
          • Partager sur Twitter
            8 décembre 2014 à 0:33:50

            Asteba a écrit:

            elle ne marche que pour les valeurs jusqu'à 12 quand long est codé sur 32 bits

            Et ta fonction fac2 va jusqu’à combien?

            • Partager sur Facebook
            • Partager sur Twitter

            GZE, un moteur multiplateforme, adapté pour de la 2D, 3D et création de logiciels.

              8 décembre 2014 à 12:33:33

              Maeiky a écrit:

              Asteba a écrit:

              elle ne marche que pour les valeurs jusqu'à 12 quand long est codé sur 32 bits

              Et ta fonction fac2 va jusqu’à combien?


              Fact2 ne marche que jusqu'à 20, pour 21 elle retourne une valeur fausse ;-) Cette fonction fact2 sert juste à montrer que fact1 ne marche pas, mais fact2 a le même problème : elle ne détecte pas les overflow et retourne des valeurs fausses au delà d'une certaine valeur.

              -
              Edité par Asteba 8 décembre 2014 à 12:36:40

              • Partager sur Facebook
              • Partager sur Twitter
                8 décembre 2014 à 12:53:55

                elle ne détecte pas les overflow et retourne des valeurs fausses au delà d'une certaine valeur.





                Edit: max-om-93 Pas de pub!

                -
                Edité par max-om-93 8 décembre 2014 à 13:22:09

                • Partager sur Facebook
                • Partager sur Twitter

                utiliser la fonction factorielle sans la recoder

                × 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