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

  1. #21
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Citation Envoyé par millie
    Ici, ça va qu'il est peu probable que l'on fasse un appel avec une grosse valeur. Mais faire un nombre d'appel important (à cause de la définition récursive) peut être dangereux car il peut vite y avoir des dépassements de piles.
    Citation Envoyé par Médinoc
    Pouquoi encore plus
    Mais c'est sur qu'avec n'importe quelle fonction en ne pourra jamais calculer 1.000.000! sinon donnez-moi un exemple. Même la fonction fact() de math.h ne peut pas. Pour faire de pareils calculs on utilise même pas des PC mais des supercalculateurs. Mettez double factorielle(int n) ou même double factorielle(char n) si vous en avez envi. Mais moi je trouve que pour une fonction récursive qu'est factorielle, un code récursif c'est plus adapté, plus concis et plus lisible. Donc puisque ce n'est pas du code optimisé qu'on recherche, c'est plus efficace! Et avec des valeurs raisonnables passées e argument, il n'y aura pas de débodement de pile. Sinon prévenez-moi.

  2. #22
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Citation Envoyé par Melem
    moi je trouve que pour une fonction récursive qu'est factorielle, un code récursif c'est plus adapté, plus concis et plus lisible.
    Pas moi. C'est un exemple d'école de calcul récursif, mais l'algorithme itératif est tout aussi simple, voire plus.

    Là où la récursivité est plus évidente, c'est pour des fonctions comme le parcours d'arbre sans chaînage double, où l'algorithme est forcément récursif (une implémentation "itérative avec une pile" reste du récursif pour moi, puisqu'on utilise toujours une pile).

  3. #23
    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 : 47
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par souviron34
    euhhh...

    testez ce petit prog. et dites-moi ce qui se passe :

    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 <stdio.h>
    #include <stdlib.h>
     
     
     
    static double MaFonction ( double Val )
    {
      Val = Val + 1.0 ;
      fprintf ( stderr, "\r%g", Val );
      return ( MaFonction(Val) );
    } 
     
     
     
    /*
    *********************
          main routine
     
    *********************
    */
    int main (int argc, char **argv)
    {
      double d, d1=0.0 ;
     
     
      d=MaFonction(d1);
     
       return 0 ;
    }
    Erreur de segmentation à Val = 261637!!! Il est possible qu'avec certaines options d'optimisation, une fonction aussi simple soit dérécursifiée, ce qui expliquerait pourquoi tu n'obtient pas d'explosion de la pile. En compilant avec gcc -Wall -O2, pas d'explosion de la pile (j'ai arrêté vers 10^7).

    Thierry

  4. #24
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Citation Envoyé par mujigka
    Erreur de segmentation à Val = 261637!!! Il est possible qu'avec certaines options d'optimisation, une fonction aussi simple soit dérécursifiée, ce qui expliquerait pourquoi tu n'obtient pas d'explosion de la pile. En compilant avec gcc -Wall -O2, pas d'explosion de la pile (j'ai arrêté vers 10^7).

    Thierry
    Pour ceux que ca interesse (j'ai retire le printf).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    static double MaFonction ( double Val )
    {
      return ( MaFonction(Val+1.0) );
    }
    (pas d'explosion de pile)

    Avec -O3 -S (sur un x86):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    MaFonction:
            pushl   %ebp
            movl    %esp, %ebp
    .L3:
            jmp     .L3
    Avec -O0 -S :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    MaFonction:
            pushl   %ebp
            movl    %esp, %ebp
            subl    $16, %esp
            movl    8(%ebp), %eax
            movl    %eax, -8(%ebp)
            movl    12(%ebp), %eax
            movl    %eax, -4(%ebp)
            fldl    -8(%ebp)
            fld1
            faddp   %st, %st(1)
            fstpl   (%esp)
            call    MaFonction
            leave
    La fonction a ete derecursifiee.

  5. #25
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par souviron34
    euhhh...

    testez ce petit prog. et dites-moi ce qui se passe :

    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 <stdio.h>
    #include <stdlib.h>
     
     
     
    static double MaFonction ( double Val )
    {
      Val = Val + 1.0 ;
      fprintf ( stderr, "\r%g", Val );
      return ( MaFonction(Val) );
    } 
     
     
     
    /*
    *********************
          main routine
     
    *********************
    */
    int main (int argc, char **argv)
    {
      double d, d1=0.0 ;
     
     
      d=MaFonction(d1);
     
       return 0 ;
    }
    [EDIT]
    Bon pour faire propre et correct j'aurais dû passer par adresse.. Ne faites pas la remarque ...

    Mais il n'empêche que ça ne plante pas (modification "down"), et que je n'ai pas réussi à faire craquer .... (bon j'ai arrêté à 12 10^7... Mais bon ça m'étonnerait que la pile fasse autant )

    [/EDIT]

    Chez moi, la pile a explosé à Val=65074

  6. #26
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    ben moi sur un Acer Aspire 1362 256 M de RAM Linux Redhat 7.3 jamais explosé..... Sans optimisation.. cc -Wall ...


  7. #27
    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 : 47
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par souviron34
    ben moi sur un Acer Aspire 1362 256 M de RAM Linux Redhat 7.3 jamais explosé..... Sans optimisation.. cc -Wall ...

    Soit, mais c'est osé du point de vue portabilité de parier dessus... As-tu essayée avec l'option -O0 pour être certain que le compilateur ne réalise pas des optimisation par défaut?

    Thierry

  8. #28
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 723
    Points
    5 723
    Par défaut
    Citation Envoyé par crocodilex
    Chez moi, la pile a explosé à Val=65074
    C'est quoi ton système ?

    Je suis allé jusqu'a 14.68658e+006 et ca tourne encore

    Systéme windows 2000 SP4 Intel celeron 2.7Ghz 515mo de ram

  9. #29
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Comme je l'ai indique avec mon exemple, le code peut etre optimise, et il y aura seulement une boucle infinie sans avoir de call a la fonction (desole, toujours sous qwerty). Donc, on empile par l'adresse de retour, et la base et le sommet de la pile ne bougent plus.

    Il faut (je repete ce qu'a dit mujigka), il faut compiler avec -O0. Et normalement, il fera un depassement de pile.

    Pour indication, je suis sur un serveur sun :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     74821 Segmentation Fault (core dumped)
    Mais il est possible de modifier la taille de la pile.

  10. #30
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    bon j'ai fini par le faire planter

    Quelques explications théoriques s'imposent, et non du tatonnement...

    Et je crois que j'ai compris, car j'ai fait quelques petits tests et réflexions....


    1) ça plante vers 1.7 E+07 appels...

    Ce qui correspond à (en gros) 2^24 ...

    Donc la taille de la pile est de 24 bits....

    On peut donc si on le désire (et donc si les prévisions d'imbrications sont inférieures à ceci) monter jusqu'à 24 bits de pile.

    2) le nombre maximum pour lequel une factorielle peut être calculé dépend de l'architecture, bien sûr, et directement du nombre de bits : la place prise par un double.

    Un petit test rapide (machine 32 bits donc double = 64 bits) indique que l'on peut calculer jusqu'à: factorielle(1.97969 e+308)

    ça vous suffit ??

  11. #31
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Citation Envoyé par souviron34
    Ce qui correspond à (en gros) 2^24 ...

    Donc la taille de la pile est de 24 bits....
    Et non, sinon ca planterait beaucoup plus vite

    Citation Envoyé par souviron34
    le nombre maximum pour lequel une factorielle peut être calculé dépend de l'architecture, bien sûr, et directement du nombre de bits : la place prise par un double.

    En fait, sur un systeme UNIX, on peut changer la taille de la pile avec ulimit -s:

    Un oeil dans le man donne : -s maximum size of stack segment (in kbytes)

  12. #32
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par millie
    En fait, sur un systeme UNIX, on peut changer la taille de la pile avec ulimit -s:

    Un oeil dans le man donne : -s maximum size of stack segment (in kbytes)
    ok donc disons que par défaut la taille est de 24 bits d'adressage.. C'est bon comme ça ?

  13. #33
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par souviron34
    ok donc disons que par défaut la taille est de 24 bits d'adressage.. C'est bon comme ça ?
    24 bits cela fait 16 Mo. Une pile allouée à un processus dépasse rarement les quelques kilo octets. Donc je suis assez surpris par cette valeur que tu avances. Ou alors je n'ai rien compris à ton raisonnement...

  14. #34
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    je fais juste un petit calcul :

    ça plante à 2^24 appels...

    Donc il me semble que au minimum (sans compter l'adresse de la variable) il y a 2^24 emplacements sur la pile... (par défaut), c'est tout ce que je dis.. (sans doute au moins 2 fois plus, à cause de l'adresse de la variable).

    j'ai essayé côté Linux et côté Windows avec cygwin. Même résultat. hegros a sans doute eu le même résultalt.

    j'essaye de trouver une explication mesurable car il doit y en avoir une..

    mais comme je suis nul en calcul de bits etc.. peut-être me trompe-je..

    Et pour le nombre maximal pour la factorielle, ça doit suffire dans la quasi-totalité des cas, non ?

  15. #35
    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 : 47
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par souviron34
    je fais juste un petit calcul :

    ça plante à 2^24 appels...

    Donc il me semble que au minimum (sans compter l'adresse de la variable) il y a 2^24 emplacements sur la pile... (par défaut), c'est tout ce que je dis.. (sans doute au moins 2 fois plus, à cause de l'adresse de la variable).

    j'ai essayé côté Linux et côté Windows avec cygwin. Même résultat. hegros a sans doute eu le même résultalt.

    j'essaye de trouver une explication mesurable car il doit y en avoir une..

    mais comme je suis nul en calcul de bits etc.. peut-être me trompe-je..

    Et pour le nombre maximal pour la factorielle, ça doit suffire dans la quasi-totalité des cas, non ?
    J'aimerais bien voir le code assembleur généré pour MaFonction(), chez toi.

    Thierry

  16. #36
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    je posterais ça demain ;-)

  17. #37
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 958
    Points : 4 387
    Points
    4 387
    Par défaut
    la taille du stack par défaut sur la plupart des U*x 32 bits est 8192 Kb (soit 8 Mb… (= 2^23)…
    c'est un paramètre la plupart du temps modifiable via ulimit.

    le coût sur la pile d'un appel récursif dépend de l'ABI de l'OS sur le processeur cible, du compilateur choisi et des optimisations demandées…

    discuter de la profondeur de récusion que l'on atteindre dans le contexte de la fonction factorielle dont les résultats intermédiaires dépassent rapidement la taille des nombres que le processeur peut gérer en natif, a-t-il un grand intérêt ?

    comme déjà dit plus haut, si vous avez besoin de très grands nombres, utilisez une bibliothèque adhoc :

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <gmp.h>
     
    // cc -o fact -I/opt/local/include -L/opt/local/lib -lgmp fact.c
     
    char *fact(unsigned long int inNumber, char *inBuffer, size_t inMaxBufSize)
    {
        mpz_t r ;
     
        if (inBuffer == NULL) {
           inBuffer = calloc(inMaxBufSize, sizeof(char)) ;
           if (inBuffer == NULL) 
               return NULL ;
        }
     
        mpz_init(r) ;
        mpz_fac_ui (r, inNumber) ;
     
        gmp_snprintf (inBuffer, inMaxBufSize, "%Zd", r) ;
     
        return inBuffer ;
    }
     
    #define BSIZE (100000000)
     
    int main(int argc,char **argv)
    {
    	char *buffer = calloc( BSIZE, sizeof(char)) ;
     
    	char *s ;
     
    	if (argc > 1)	{
    		--argc ;
    		while (*++argv) {
    			unsigned int n = atoi(*argv) ;
    			s = fact(n, buffer, BSIZE) ;
    			printf("%d!= %s\n",n,s) ;
    		}
    	}
    	else {
    		char line[32] ;
     
    		while (fgets(line, 32, stdin)) {
    			if (0 == strcmp(line,".\n"))
    				break ;
     
    			unsigned int n = atoi(line) ;
    			s = fact(n, buffer, BSIZE) ;
    			printf("%d!= %s\n",n,s) ;
    		}
    	}
    	return 0 ;
    }
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    % cc -o fact -I/opt/local/include -L/opt/local/lib -lgmp fact.c
    % time jot 40 1 | ./fact 
    1!= 1
    2!= 2
    3!= 6
    4!= 24
    5!= 120
    6!= 720
    7!= 5040
    8!= 40320
    9!= 362880
    10!= 3628800
    11!= 39916800
    12!= 479001600
    13!= 6227020800
    14!= 87178291200
    15!= 1307674368000
    16!= 20922789888000
    17!= 355687428096000
    18!= 6402373705728000
    19!= 121645100408832000
    20!= 2432902008176640000
    21!= 51090942171709440000
    22!= 1124000727777607680000
    23!= 25852016738884976640000
    24!= 620448401733239439360000
    25!= 15511210043330985984000000
    26!= 403291461126605635584000000
    27!= 10888869450418352160768000000
    28!= 304888344611713860501504000000
    29!= 8841761993739701954543616000000
    30!= 265252859812191058636308480000000
    31!= 8222838654177922817725562880000000
    32!= 263130836933693530167218012160000000
    33!= 8683317618811886495518194401280000000
    34!= 295232799039604140847618609643520000000
    35!= 10333147966386144929666651337523200000000
    36!= 371993326789901217467999448150835200000000
    37!= 13763753091226345046315979581580902400000000
    38!= 523022617466601111760007224100074291200000000
    39!= 20397882081197443358640281739902897356800000000
    40!= 815915283247897734345611269596115894272000000000
     
    real    0m0.028s
    user    0m0.003s
    sys     0m0.018s
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    time ./fact 10000
     
    10000!= 2846259680917054518906413212119868890 ...
    ... un nombre de + de 35600 chiffres
    ...
    0000000000000000000000000000
     
    real    0m0.042s
    user    0m0.025s
    sys     0m0.011s

  18. #38
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    La taille de pile par défaut est d'1Mo sous Windows (source : MSDN)

  19. #39
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par JeitEmgie
    la taille du stack par défaut sur la plupart des U*x 32 bits est 8192 Kb (soit 8 Mb… (= 2^23)…
    c'est un paramètre la plupart du temps modifiable via ulimit.
    OK c'est donc ça...

    mujigka a écrit :

    J'aimerais bien voir le code assembleur généré pour MaFonction(), chez toi.
    OK voilà (j'ai enlevé le printf) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cc ./Test.c -S -o ./test1
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    	.file	"Test.c"
    	.version	"01.01"
    gcc2_compiled.:
    .text
    	.align 4
    	.type	 MaFonction,@function
    MaFonction:
    	pushl	%ebp
    	movl	%esp, %ebp
    	subl	$8, %esp
    	movl	8(%ebp), %eax
    	movl	12(%ebp), %edx
    	movl	%eax, -8(%ebp)
    	movl	%edx, -4(%ebp)
    	fldl	-8(%ebp)
    	fld1
    	faddp	%st, %st(1)
    	fstpl	-8(%ebp)
    	subl	$8, %esp
    	pushl	-4(%ebp)
    	pushl	-8(%ebp)
    	call	MaFonction
    	addl	$16, %esp
    	leave
    	ret
    .Lfe1:
    	.size	 MaFonction,.Lfe1-MaFonction
    	.align 4
    .globl main
    	.type	 main,@function
    main:
    	pushl	%ebp
    	movl	%esp, %ebp
    	subl	$24, %esp
    	movl	$0, -8(%ebp)
    	movl	$1072693248, -4(%ebp)
    	subl	$8, %esp
    	pushl	-4(%ebp)
    	pushl	-8(%ebp)
    	call	MaFonction
    	addl	$16, %esp
    	fstpl	-16(%ebp)
    	movl	$0, %eax
    	leave
    	ret
    .Lfe2:
    	.size	 main,.Lfe2-main
    	.ident	"GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.3 2.96-110)"

  20. #40
    Débutant  
    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
    Points : 193
    Points
    193
    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.
Page 2 sur 2 PremièrePremière 12

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