begin process at 2008 07 06 00:17:38
1 205 404 membres
370 nouveaux aujourd'hui
14 119 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Suite de Fibonacci [ Algorithme / Maths ] (BastienL21)

Suite de Fibonacci le 07/05/2008 22:01:11

BastienL21
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 #include #include #include #include #include #include #include #include #include #include #include #include #include #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');

Re : Suite de Fibonacci le 07/05/2008 22:06:52

BastienL21
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 <unistd.h>
#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

Re : Suite de Fibonacci le 07/05/2008 23:57:28

jfrancois
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


Re : Suite de Fibonacci le 08/05/2008 11:23:43

BastienL21
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,
            Bastien
                    

Re : Suite de Fibonacci le 08/05/2008 11:45:17

jfrancois
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


Re : Suite de Fibonacci le 08/05/2008 11:51:31

BastienL21
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,
                    Bastien

Re : Suite de Fibonacci le 08/05/2008 12:00:11

jfrancois
Réponse acceptée !

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


Re : Suite de Fibonacci le 08/05/2008 12:06:09

jfrancois
!!! 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


Re : Suite de Fibonacci le 08/05/2008 20:36:32

BastienL21
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,
             Bastien
 

Re : Suite de Fibonacci le 08/05/2008 20:44:54

BastienL21
Finalement j'ai trouvé, il faut déclarer:
#define sleep(x) Sleep(x)

Cordialement,
             Bastien
 


[Page 1 Page 2]
Classé sous : int, printf, include, suite, coninfo

Participer à cet échange

Pub



Appels d'offres

Plugin Dialer outlook
Budget : 2 000€
Travail graphique- ill...
Budget : 1 000€
creation de marque et ...
Budget : 1 000€

Snippets en rapport

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Téléchargements

Boutique

Boutique de goodies CodeS-SourceS