Suite de Fibonacci

Résolu
BastienL21 Messages postés 172 Date d'inscription dimanche 10 décembre 2000 Statut Membre Dernière intervention 12 février 2009 - 7 mai 2008 à 22:01
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 - 8 mai 2008 à 21:26
Bonjour à tous, débutant en C,
j'ai écris un code permettant d'éxecuter la suite de Fibonacci en additionnant les deux nombres précédant, stockés dans deux variables.
Tout à l'air correct juqu'à environ la 70~80e ligne ou le programme m'affiche:

5527939700884757
8944394323791464
14472334024676220
OR 5527939700884757+8944394323791464 n'est pas égale à 14472334024676220 mais à 14472334024676221, ce qui fausse tout le reste de la suite. Je ne comprend pas pourquoi il y a cette erreur et encore moins pourquoi elle se manifeste si loin dans la boucle...
Si quelqu'un peu m'aider à trouver d'où vien l'erreur, voici mon code:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#include <time.h>
#include <dos.h>
#include <sys\timeb.h>
#include
#include <dirent.h>
#include
#include
#include <stddef.h>
#include <winsock.h>
#include <string.h>


#define STDOUT GetStdHandle(STD_OUTPUT_HANDLE)

// Renvoie la ligne sur la quelle se trouve le curseur
int WhereY( void )
{
CONSOLE_SCREEN_BUFFER_INFO coninfo;
GetConsoleScreenBufferInfo (STDOUT, &coninfo);
return coninfo.dwCursorPosition.Y;
}

// Renvoie la colonne sur laquelle se trouve le curseur
int WhereX( void )
{
CONSOLE_SCREEN_BUFFER_INFO coninfo;
GetConsoleScreenBufferInfo (STDOUT, &coninfo);
return coninfo.dwCursorPosition.X;
}

// Positionne le curseur sur la colonne x
void GotoX(int x)
{
int y = WhereY();
COORD dwCursorPosition = { x, y };
SetConsoleCursorPosition (STDOUT, dwCursorPosition);
}
void Color(int couleurDuTexte, int couleurDeFond) // fonction d'affichage de couleurs
{
HANDLE H = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(H, couleurDeFond*16+couleurDuTexte);
}



int main(int argc, char *argv[])

{
system("mode con: cols=155 lines=200");
SetConsoleTitle("Suite de Fibonacci");

double p = 0;
double a = 1;
double ap = 0;
long X = 0;
double i = 0;
printf("Appuyer sur une touche pour arreter le boucle\n");
sleep(1200);
printf("[Pause] pour la mettre en pause et [Entrer] pour reprendre\n");
sleep(1500);

while ( !kbhit() )
{
GotoX(WhereX() - 7);
Color(8,0);
printf("\n - ");
Color(15,0);
printf("%lf", a + p);
GotoX(WhereX() - 6);
printf(" ");
ap = a;
a = p;
p = a + ap;
sleep(25);
}
getch();
getch();
return 0;
}
/*************************/


                                 Cordialement,
                                             Bastien
javascript:Insert_Emoticon('/imgs2/smile.gif');</string.h></winsock.h></stddef.h></dirent.h></sys\timeb.h></dos.h></time.h></windows.h></conio.h></stdlib.h></stdio.h>

12 réponses

cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
8 mai 2008 à 12:00
Vous utilisez quel compilateur ?

J'ai testé comme ça sous Microsoft Visual C++ 6.0 (ça marche jusqu'à 92 itérations, au-delà il faut passer à des entiers encore plus longs) :

#include <stdio.h>
#include <stdlib.h>




int main(void)
{
   unsigned __int64 a = 1;
   unsigned __int64 p = 0;
   unsigned __int64 ap = 0;



   for (int i=0 ; i<92 ; ++i)
   {
      printf("%02d: %19I64d + %19I64d = %19I64d\n",i + 1,a,p,a + p);
      ap = a;
      a = p;
      p = a + ap;
   }
   return 0;
}


Ce qui donne :

01:                   1 +                   0 =                   1
02:                   0 +                   1 =                   1
03:                   1 +                   1 =                   2
04:                   1 +                   2 =                   3
05:                   2 +                   3 =                   5
06:                   3 +                   5 =                   8
07:                   5 +                   8 =                  13
08:                   8 +                  13 =                  21
09:                  13 +                  21 =                  34
10:                  21 +                  34 =                  55
11:                  34 +                  55 =                  89
12:                  55 +                  89 =                 144
13:                  89 +                 144 =                 233
14:                 144 +                 233 =                 377
15:                 233 +                 377 =                 610
16:                 377 +                 610 =                 987
17:                 610 +                 987 =                1597
18:                 987 +                1597 =                2584
19:                1597 +                2584 =                4181
20:                2584 +                4181 =                6765
21:                4181 +                6765 =               10946
22:                6765 +               10946 =               17711
23:               10946 +               17711 =               28657
24:               17711 +               28657 =               46368
25:               28657 +               46368 =               75025
26:               46368 +               75025 =              121393
27:               75025 +              121393 =              196418
28:              121393 +              196418 =              317811
29:              196418 +              317811 =              514229
30:              317811 +              514229 =              832040
31:              514229 +              832040 =             1346269
32:              832040 +             1346269 =             2178309
33:             1346269 +             2178309 =             3524578
34:             2178309 +             3524578 =             5702887
35:             3524578 +             5702887 =             9227465
36:             5702887 +             9227465 =            14930352
37:             9227465 +            14930352 =            24157817
38:            14930352 +            24157817 =            39088169
39:            24157817 +            39088169 =            63245986
40:            39088169 +            63245986 =           102334155
41:            63245986 +           102334155 =           165580141
42:           102334155 +           165580141 =           267914296
43:           165580141 +           267914296 =           433494437
44:           267914296 +           433494437 =           701408733
45:           433494437 +           701408733 =          1134903170
46:           701408733 +          1134903170 =          1836311903
47:          1134903170 +          1836311903 =          2971215073
48:          1836311903 +          2971215073 =          4807526976
49:          2971215073 +          4807526976 =          7778742049
50:          4807526976 +          7778742049 =         12586269025
51:          7778742049 +         12586269025 =         20365011074
52:         12586269025 +         20365011074 =         32951280099
53:         20365011074 +         32951280099 =         53316291173
54:         32951280099 +         53316291173 =         86267571272
55:         53316291173 +         86267571272 =        139583862445
56:         86267571272 +        139583862445 =        225851433717
57:        139583862445 +        225851433717 =        365435296162
58:        225851433717 +        365435296162 =        591286729879
59:        365435296162 +        591286729879 =        956722026041
60:        591286729879 +        956722026041 =       1548008755920
61:        956722026041 +       1548008755920 =       2504730781961
62:       1548008755920 +       2504730781961 =       4052739537881
63:       2504730781961 +       4052739537881 =       6557470319842
64:       4052739537881 +       6557470319842 =      10610209857723
65:       6557470319842 +      10610209857723 =      17167680177565
66:      10610209857723 +      17167680177565 =      27777890035288
67:      17167680177565 +      27777890035288 =      44945570212853
68:      27777890035288 +      44945570212853 =      72723460248141
69:      44945570212853 +      72723460248141 =     117669030460994
70:      72723460248141 +     117669030460994 =     190392490709135
71:     117669030460994 +     190392490709135 =     308061521170129
72:     190392490709135 +     308061521170129 =     498454011879264
73:     308061521170129 +     498454011879264 =     806515533049393
74:     498454011879264 +     806515533049393 =    1304969544928657
75:     806515533049393 +    1304969544928657 =    2111485077978050
76:    1304969544928657 +    2111485077978050 =    3416454622906707
77:    2111485077978050 +    3416454622906707 =    5527939700884757
78:    3416454622906707 +    5527939700884757 =    8944394323791464
79:    5527939700884757 +    8944394323791464 =   14472334024676221
80:    8944394323791464 +   14472334024676221 =   23416728348467685
81:   14472334024676221 +   23416728348467685 =   37889062373143906
82:   23416728348467685 +   37889062373143906 =   61305790721611591
83:   37889062373143906 +   61305790721611591 =   99194853094755497
84:   61305790721611591 +   99194853094755497 =  160500643816367088
85:   99194853094755497 +  160500643816367088 =  259695496911122585
86:  160500643816367088 +  259695496911122585 =  420196140727489673
87:  259695496911122585 +  420196140727489673 =  679891637638612258
88:  420196140727489673 +  679891637638612258 = 1100087778366101931
89:  679891637638612258 + 1100087778366101931 = 1779979416004714189
90: 1100087778366101931 + 1779979416004714189 = 2880067194370816120
91: 1779979416004714189 + 2880067194370816120 = 4660046610375530309
92: 2880067194370816120 + 4660046610375530309 = 7540113804746346429



Jean-François
3
BastienL21 Messages postés 172 Date d'inscription dimanche 10 décembre 2000 Statut Membre Dernière intervention 12 février 2009 2
7 mai 2008 à 22:06
Désolé pour le 1er message mais je suis nouveau sur le site et visiblement Opéra n'aime pas les retours à la ligne...
en espérant que FireFox fonctionne...

Bonjour à tous, débutant en C,
 j'ai écris un code permettant d'éxecuter la suite de Fibonacci en additionnant les deux nombres précédant, stockés dans deux variables.
Tout à l'air correct juqu'à environ la 70~80e ligne ou le programme m'affiche:
5527939700884757
8944394323791464
14472334024676220
 OR 5527939700884757+8944394323791464 n'est pas égale à
14472334024676220 mais à
14472334024676221, ce qui fausse tout le reste de la suite. Je ne comprend pas pourquoi il y a cette erreur et encore moins pourquoi elle se manifeste si loin dans la boucle...
 Si quelqu'un peu m'aider à trouver d'où vient l'erreur, voici mon code:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#include <time.h>
#include <dos.h>
#include <sys\timeb.h>
#include <sys/types.h>
#include <dirent.h>
#include <sys/stat.h>
#include
#include <stddef.h>
#include <winsock.h>
#include <string.h>

#define STDOUT  GetStdHandle(STD_OUTPUT_HANDLE)

// Renvoie la ligne sur la quelle se trouve le curseur
int WhereY( void )
{
    CONSOLE_SCREEN_BUFFER_INFO coninfo;
    GetConsoleScreenBufferInfo (STDOUT, &coninfo);
    return coninfo.dwCursorPosition.Y;
}

// Renvoie la colonne sur laquelle se trouve le curseur
int WhereX( void )
{
    CONSOLE_SCREEN_BUFFER_INFO coninfo;
    GetConsoleScreenBufferInfo (STDOUT, &coninfo);
    return coninfo.dwCursorPosition.X;
}

// Positionne le curseur sur la colonne x
void GotoX(int x)
{
    int y = WhereY();
    COORD dwCursorPosition = { x, y };
    SetConsoleCursorPosition (STDOUT, dwCursorPosition);
}
void Color(int couleurDuTexte, int couleurDeFond) // fonction d'affichage de couleurs
{
        HANDLE H = GetStdHandle(STD_OUTPUT_HANDLE);
        SetConsoleTextAttribute(H, couleurDeFond*16+couleurDuTexte);
}

int main(int argc, char *argv[])
{
       system("mode con: cols=155 lines=200");
SetConsoleTitle("Suite de Fibonacci");
 double p = 0;
 double a = 1;
 double ap = 0;
 long X = 0;
 double i = 0;
printf("Appuyer sur une touche pour arreter le boucle\n");
sleep(1200);
printf("[Pause] pour la mettre en pause et [Entrer] pour reprendre\n");
    while ( !kbhit() )
    {
        GotoX(WhereX() - 7);
Color(8,0);
printf("\n - ");
Color(15,0);
printf("%lf", a + p);
GotoX(WhereX() - 6);
printf("       ");
ap = a;
a = p;
p = a + ap;
sleep(25);
}

                                 Cordialement,
                                             Bastien[javascript:Insert_Emoticon('/imgs2/smile_big.gif'); ]
0
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
7 mai 2008 à 23:57
Bonsoir,

C'est déjà pas mal qu'il ait été aussi loin en gardant tous les chiffres ! Il ne faut surtout pas passer par des flottants pour faire ce genre de calcul : Utiliser des entiers longs sur 64 bits par exemple (19 chiffres de précision) ou une classe de gestion d'entiers longs.

En remplaçant double (pour a, p et ap) par __int64 (entier 64 bits, spécifique Microsoft), j'ai le bon résultat.

Jean-François
0
BastienL21 Messages postés 172 Date d'inscription dimanche 10 décembre 2000 Statut Membre Dernière intervention 12 février 2009 2
8 mai 2008 à 11:23
Merci,
 cette fois ca fonctionne mais au bout du 30~40e calcul, il m'affiche des nombres négatifs :cela vient il du type de variable qui ne peu stocker des nombres plus grands??

Console:
- 701408733
- 1134903170
- 1836311903
- -1323752223         //ici
- 512559680
- -811192543           //ici
- -298632863...        //ici...
Car au final, avec des doubles, je vais plus loin dans la suite...

Désolé je débute :-)

Cordialement,[Insert_Emoticon%28%27/imgs2/smile.gif%27%29; ]
            Bastien
                    
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
8 mai 2008 à 11:45
1134903170 + 1836311903 = 2971215073 = -1323752223 avec un entier long de 32 bits signés ! (2971215073 - 2^32 = -1323752223)

Je ne sais pas ce que vous avez mis à la place de double mais ce n'est pas un entier 64 bits !
Si vous avez Microsoft C++ il y a __int64 (et même unsigned __int64 pour aller 2 fois plus loin !).
Si vous n'avez pas Microsoft C++, regardez dans la doc du compilateur s'il a un type d'entier sur 64 bits (du genre longlong ou huge !?!?).

Jean-François
0
BastienL21 Messages postés 172 Date d'inscription dimanche 10 décembre 2000 Statut Membre Dernière intervention 12 février 2009 2
8 mai 2008 à 11:51
bonjour,
J'ai mis les variables en __int64.
Voici les déclarations de mon code :
 __int64 p = 0;
 __int64 a = 1;
 __int64 ap = 0;

Cordialement,[Insert_Emoticon%28%27/imgs2/smile.gif%27%29; ]
                    Bastien
0
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
8 mai 2008 à 12:06
!!! Et en mettant les formats corrects dans le printf() c'est à dire %20I64u à la place de %19I64d on a une 93ème itération !!!

Jean-François
0
BastienL21 Messages postés 172 Date d'inscription dimanche 10 décembre 2000 Statut Membre Dernière intervention 12 février 2009 2
8 mai 2008 à 20:36
Merci beaucoup Jean-François,
ca fonctionne mais, j'ai télécharger C::B 8.02 (Par rapport à l'autre post "heure d'été") mais cette version bug dès que l'on met un "sleep(x);" dans le code :
 savez-vous pourquoi? (sachant que vous posséder cette version, je me permet de vous poser cette question)

Cordialement,[Insert_Emoticon%28%27/imgs2/smile.gif%27%29; ]
             Bastien
 
0
BastienL21 Messages postés 172 Date d'inscription dimanche 10 décembre 2000 Statut Membre Dernière intervention 12 février 2009 2
8 mai 2008 à 20:44
Finalement j'ai trouvé, il faut déclarer:
#define sleep(x) Sleep(x)

Cordialement,[Insert_Emoticon%28%27/imgs2/smile.gif%27%29; ]
             Bastien
 
0
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
8 mai 2008 à 21:14
Non ! c'est Sleep() avec une majuscule, tout simplement ! ça sert à rien de créer un synonyme.

Jean-François
0
BastienL21 Messages postés 172 Date d'inscription dimanche 10 décembre 2000 Statut Membre Dernière intervention 12 février 2009 2
8 mai 2008 à 21:20
Exact mais j'avais l'habitude de sleep sous C::B 1.0 RC2
MERCI

Cordialement,[Insert_Emoticon%28%27/imgs2/smile.gif%27%29; ]
             Bastien
 
0
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
8 mai 2008 à 21:26
Ah ! Visiblement ils ont repris la syntaxe Microsoft (et des types spécifiques comme __int64).

Jean-François
0
Rejoignez-nous