addtion - C - Programmation
Marsh Posté le 31-01-2007 à 15:01:53
Salut,
Code :
|
Ca serait pas plutôt fibo=temp ?
Sinon, je pense que c'est bien un dépassement de capacité sachant que int = long sous système 32 bits et qu'on ne peut pas additionner des nombres indéfiniment.
Marsh Posté le 31-01-2007 à 15:13:55
2^32 = 4 294 967 296 alors que le résultat de l'opération demandé boucle 44 (où ça bug) est
1836311903 +1134903170 = 2 971 215 073
edit : même une calculatrice sait le faire
Marsh Posté le 31-01-2007 à 15:29:24
ouais, mais 2^31=2 147 483 648
Donc pour peu que tu sois en signed long, ça passe plus.
Pour faire le test, essaie de voir ce que donne 2^32 + (le nombre négatif que tu obtiens)
Marsh Posté le 31-01-2007 à 17:07:21
Exact, et vu que le printf affiche des valeurs signées :
Code :
|
On obtient des valeurs négatives. Mais bon afficher des entiers non signés ne changent pas grand chose et on doit gagner une itération supplémentaire avant le débordement :
fibo= 1836311903+1134903170=2971215073;
fibo= 2971215073+1836311903=512559680;
Edit:
nicodu95 a écrit : 2^32 = 4 294 967 296 alors que le résultat de l'opération demandé boucle 44 (où ça bug) est |
Ah, j'avais pas capté que c'est toi qui a créé le topic. Sympa ta façon de remercier ceux qui prennent la peine de répondre à tes questions...
Marsh Posté le 31-01-2007 à 17:12:58
dans mon printf j'ai remplacé le %d par %u et plus de problème
Citation : Ah, j'avais pas capté que c'est toi qui a créé le topic. Sympa ta façon de remercier ceux qui prennent la peine de répondre à tes questions... |
si c'est à ça que tu répond (anordem) :
Citation : edit : même une calculatrice sait le faire |
sache que je voulais juste dire que comme une calculatrice sait le faire , sa serait étrange qu'un ordinateur ne le puisse pas
merci à tous pour votre aide
Marsh Posté le 31-01-2007 à 17:25:48
nicodu95 a écrit : dans mon printf j'ai remplacé le %d par %u et plus de problème |
Permet moi d'en douter. Tu as simplement supprimer le signe négatif mais tes valeurs sont fausses car
2.971.215.073 + 1.836.311.903 = 4.807.526.976 et pas 512.559.680
PS : l'humilité ne tue pas et être débutant n'est pas une tare.
Marsh Posté le 31-01-2007 à 19:40:01
ReplyMarsh Posté le 31-01-2007 à 22:05:13
nicodu95 a écrit : effectivement , tu as raison , le max que je peux faire est 44 boucle |
Utilises des "double" => tu passeras de 4 octets à 8. Et si ton compilo l'accepte, tente le "long double" et t'auras 10 octets pour t'amuser (de quoi aller probablement jusqu'à 50 boucles...)
Au fait, pourquoi tu fais un calloc de 2 puis du realloc à chaque boucle ? Tu pourrais pas faire directement un calloc de "limite" ??? Et d'ailleurs, pourquoi "calloc" alors que les seules valeurs que t'as besoin d'initialiser sont "fibo[0]" et "fibo[1]" ???
Fais donc un simple malloc !!!!
Marsh Posté le 31-01-2007 à 22:46:19
Sve@r a écrit : Utilises des "double" => tu passeras de 4 octets à 8. Et si ton compilo l'accepte, tente le "long double" et t'auras 10 octets pour t'amuser (de quoi aller probablement jusqu'à 50 boucles...) |
Sauf que c'est des flottants...
Par contre en C99 y'a les long long (et sur la plupart des compilos pas-c99 y'a des __int64 qui trainent ou des trucs du genre)
Marsh Posté le 31-01-2007 à 23:07:26
Mouais, enfin, toutes ces bidouilles ne résolvent pas vraiment le problème.
Une méthode plus élégante serait d'utiliser une biliothèque de BigNums, telle que Miracl par exemple http://www.shamus.ie/
Marsh Posté le 01-02-2007 à 16:03:51
0x90 a écrit : Sauf que c'est des flottants... |
Ben t'as quand-même le droit d'additionner des flottants, même si leur partie décimale est toujours à 0...
Marsh Posté le 10-02-2007 à 12:34:56
nicodu95 a écrit :
|
a l'envers, ça tue...
Essaye ça
Code :
|
Marsh Posté le 11-02-2007 à 12:55:37
Emmanuel Delahaye a écrit :
|
Faire rentrer 16 caractères (plus le '\0') dans un char[8]... Alors là, je pige que dalle sauf s'il sagit d'une erreur d'inattention comme ça arrive à tous => il n'y a pas longtemps, je voulais calculer la longueur d'une chaîne et rajouter 1 au résultat. Et j'ai tapé
Code :
|
et j'ai galéré au-moins un quart d'heure à essayer de comprendre pourquoi mon programme plantait !!!
Sinon je ne trouve pas dans l'algo le test sur "q" pour quitter. Apparemment si on tape "q" (ou toute autre lettre), alors sscanf renverra 0 et il sortira sur le "input error : bye" non ???
Marsh Posté le 11-02-2007 à 15:18:58
Sve@r a écrit : Faire rentrer 16 caractères (plus le '\0') dans un char[8]... Alors là, je pige que dalle sauf s'il sagit d'une erreur d'inattention comme ça arrive à tous |
Bah, j'ai réduit la taille du tableau sans modifier le commentaire. Shame on me...
Citation : |
Oui, je n'ai pas dit que seul 'q' permettait de sortir. Ne pas confondre l'absence de spèc avec l'aide à utilisateur !
Marsh Posté le 31-01-2007 à 14:41:57
bonjour,
pour m'amuser j'ai fais un programme ,qui calcule la suite de fibonnaci,dont voici le code :
sauf que à la 44ème boucle, le programme ne sais plus faire une addition !! il me sort un résultat négatif alors que les deux termes sont positifs ! puis alterne positif/négatif comme bon lui semble
donc j'ai remplacé tous les [i]int par des unsigned int que j'ai remplacer par des long puis par des unsigned long.
je ne vois pas dutout d'où vient ce problème !!
merci d'avance
Message édité par nicodu95 le 31-01-2007 à 14:54:18