BastienL21
Messages postés172Date d'inscriptiondimanche 10 décembre 2000StatutMembreDernière intervention12 février 2009
-
7 mai 2008 à 22:01
cs_jfrancois
Messages postés482Date d'inscriptionvendredi 26 août 2005StatutMembreDerniè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:
// 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;
}
/*************************/
BastienL21
Messages postés172Date d'inscriptiondimanche 10 décembre 2000StatutMembreDernière intervention12 février 20092 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:
// 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);
}
cs_jfrancois
Messages postés482Date d'inscriptionvendredi 26 août 2005StatutMembreDernière intervention 5 décembre 20092 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.
BastienL21
Messages postés172Date d'inscriptiondimanche 10 décembre 2000StatutMembreDernière intervention12 février 20092 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...
cs_jfrancois
Messages postés482Date d'inscriptionvendredi 26 août 2005StatutMembreDernière intervention 5 décembre 20092 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 !?!?).
BastienL21
Messages postés172Date d'inscriptiondimanche 10 décembre 2000StatutMembreDernière intervention12 février 20092 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)