Limite Integrers en C...

Démarré par Gold-Link, 28 Janvier 2012 à 15:56

0 Membres et 1 Invité sur ce sujet

Hello!  :)

Non cette fois-ci je ne viens pas pour demander une aide sur mon jeu. En fait j'aurai besoin de quelques conseils pour du C.
Alors voila, je suis en première et dans le cadre des Travaux Personnels Encadrés (TPE) avec mon groupe j'ai décidé de faire une expérience pour créer un logiciel, un logiciel codé en C. Bon j'ai pas mal de bases en C/C++ (plus en C) et le moteur du logiciel ne repose que sur des calculs assez simples, donc pas de grosses connaissances a avoir.
Or comme je viens de l'expliquer le logiciel effectue un calcul assez complexe afin de faire ressortir un nombre qui sera traité plus tard . Tout fonctionne très bien sauf que on va être amené a faire des calculs avec des chiffres grands...et c'est que ca coince car avec les Integrers (INT) on peut aller jusqu'a 2147483647 , après l'ordi me balance des chiffres au hazard quoi...et ca serait bien de contourner cette limite...

Je demandais donc si il y avait une ruse, ou une astuce à l'aide de tableaux  ou autres afin de traiter les variables longues en C.

Merci  :)

J'ai une connaissance très basique de la programmation, mais il me semble qu'il existe effectivement des types de données qui permettent d'utiliser des variables plus longues en C/C++. Malheureusement, j'ignore lesquels.x)

Par contre, après une rapide recherche sur Google, j'ai trouvé ceci, peut-être que ça pourra t'aider. Sinon tu peux toujours chercher par toi-même, ça ne doit pas être si difficile que ça à trouver.^^

Bonne chance dans tes recherches et excuse-moi pour mon manque de connaissances en programmation, d'autres répondront sûrement mieux que moi. :)

J'avais effectivement trouvé un tableau récapitulatif dans le genre mais merci quand meme ^^
Sinon oui j'avais tenté de mettre des variables de type DOUBLE (qui son censés aller jusqu'a x10^308 mais le compilateur m'indique une erreur de type 'error C2177: constante trop grande' dans le débogueur alors que la variable ne fait que '100000000000000000000' [a titre de test] ce qui est inférieur a 10^308...  -_-
J'ai beau chercher sur google , aucun résultat qui me convient...

C'est ton '100000000000000000000' qui est trop grand, pas parce qu'il ne tient pas dans ta variable double, mais parce que le compilateur le traduit en entier avant de l'affecter.
Rajoute un .0 à la fin pour lui faire comprendre que ce n'est pas un entier. (enfin si mes souvenirs sont exacts)

En utilisant un double ou un float, tu risques de perdre en précision. Si la différence entre 100000000000000000000 et 100000000000000000001 est très importante pour ton programme n'utilise pas les nombres flottants. Si un long long ne te suffis pas, utilise une bibliothèque adaptée au traitement des grands nombre tel que http://gmplib.org/
Citation
Ash Nazg Durbatulùk, Ash Nazg Gimbatul,
Ash Nazg Thrakatulùk agh bruzum-ishi krimpatul.
The fellowship of the Ring - J.R.R. Tolkien

Je confirme ce que dit BenObiWan, les types flottants (float et double) ne sont pas adaptés au stockage de nombres entiers (tu pourrais avoir des surprises avec des tests d'égalité qui ne donnent pas le résultat attendu par exemple).

Sans aller jusqu'à gmp, tu dois sûrement pouvoir utiliser des entiers de 64 bits sur ta machine et ton compilateur, cela pourrait peut-être te suffire (c'est déjà bien gros) :) Tu peux éventuellement te fier au tableau suivant sur wikipedia (en) : http://en.wikipedia.org/wiki/Integer_(computer_science)

Déjà, si tu veux être sûr de la taille des entiers que tu utilises, tu peux utiliser un int32_t ou un int64_t si ton ordinateur les supporte. Ce sont des entiers à taille fixe (respectivement 32 et 64 bits) qui se trouvent dans le header stdint.h dont tu pourras trouver une petite description (en anglais) en suivant ce lien. Ceci dit, ce header n'est standard qu'à partir de la norme C99. Donc, tu ne pourras être sûr de l'avoir qu'en compilant avec la norme C99 (Avec gcc, il faut ajouter l'option -std=c99 au compilateur). Il me semble qu'il ait été adapté en C++, mais je ne suis pas sûr qu'il soit standard.

Certains compilateurs fournissent des entiers de 128 ou 256 bits avec typiquement les types __int128 et __int256, mais il faut bien garder en tête que ce n'est pas portable. Il me semble cependant qu'ils existent avec certaines versions de GCC.

Sinon, si tu veux travailler avec des entiers infiniment grands, il existe des bibliothèques particulières comme GMP ou OpenSSL qui te fournissent ce genre de nombres.

Merci de vos réponses. J'ai installé GMP a patir d'un tuto du site du zéro. Je pense toucher au but mais cette fois ci je rencontre une erreur de compilateur :

Citation
[Linker error] undefined reference to `std::ctype<char>::_M_widen_init() const'

A savoir que je suis sous Dev-Cpp...et toujours rien sur internet de bien convaincant, a savoir que je suis un peu un brêle ^^

Es-tu sûr d'avoir bien lié ta bibliothèque au projet ? (en plus d'inclure les entêtes)
Regarde le paragraphe "compiler notre code" du tuto :)

Il faut apparemment lier d'abord libgmpxx puis libgmp.
Marre des pavés ? Marchez dans la boue!
ハハ、あなたは私の罠に落ちた!

Oui oui y a aucun soucis a ce niveau la, je pense pas que cela vienne de gmp...

Peut être un problème de versions alors ...
As-tu bien compilé ta lib avec la même version du compilateur que tu utilises avec DevCpp ?
Marre des pavés ? Marchez dans la boue!
ハハ、あなたは私の罠に落ちた!

Bon , j ai changé d'ordi par souci de mobilité et j ai du reinstaller tout les logiciels, et miracle! Ca fonctionne ! Enfin ^^
L erreur devait probablement venir de l installation de gmp, enfin merci a tous pour m avoir aidé a resoudre ce probleme et a avancer dans mon Tpe  :)

Salut,

Content de savoir que tu as résolu ton problème !  :super:
Juste une petite précision, tu disais dans ton premier post que c'était un projet en langage C, hors j'ai cru voir que GMP était une bibliothèque C++.
Je sais pas si çà a son importance, mais si c'est pour un cours, certains profs peuvent être pointilleux...  :mrgreen:

Oui a la base c'était en C mais j'ai du effectivement passer au C++ afin d'obtenir ce que je voulais. Toutefois gmp fonctionne aussi avec des programmes en C mais je ne pense pas que tout ses fonctions également dans ce cas ^^