Aller au contenu
  • Pas encore inscrit ?

    Pourquoi ne pas vous inscrire ? C'est simple, rapide et gratuit.
    Pour en savoir plus, lisez Les avantages de l'inscription... et la Charte de Zébulon.
    De plus, les messages que vous postez en tant qu'invité restent invisibles tant qu'un modérateur ne les a pas validés. Inscrivez-vous, ce sera un gain de temps pour tout le monde, vous, les helpeurs et les modérateurs ! :wink:

Mémoire en c++


Ikit

Messages recommandés

Bonjour, moi c'est trés simple comme problème... mais j'arrive pas à le résoudre !

 

 

 

j'aimerais savoir comment créer un programme en c++ qui calcul des factoriel... a priori, c'est simple, ça tiens en 10 lignes, mais dés que j'arrive à 200! :

 

si j'ai fait unsigned int result;

result = 200! -> j'obtient result = 0

 

et si j'ai unsigned long double result;

je pensais que ça suffira, mais pas du tout et il me met à la place de 0, l'infini

 

alors qu'un programme en scheme me calcul en 1,6 sec 7000! avec tout les chiffres les uns à la suite des autres (4 écrans 1280*1024 quand même)

 

et que ma ti-89 arrive à calculer 200! ... là aussi avec tout les chiffres ...

 

bref, je ne pense pas que c++ soit moins puissant que les autres, et j'aimerais savoir comment on fait pour allouer plus de mémoire à une variable ...

 

 

:P a+

Modifié par Ikit
Lien vers le commentaire
Partager sur d’autres sites

On utilise autre chose que des int ;-)

(unsigned long ça devrait déjà rallonger un peu la sauce, mais si tu as la possibilité de stocker tes entiers sur 64 bits ou plus, ça sera aussi bien)

 

Je suis pas certain d'avoir compris "unsigned long double" ... double c'est un type à virgule flottante, donc tu n'auras pas autant de chiffres significatifs qu'avec des entiers

 

Autre solution : faire soi-même ses fonctions de calcul d'entiers, mais en utilisant des buffers codant pour les valeurs entières. A toi de voir comment tu veux coder tes entiers (avec des chaines de caractères, en binaire, etc.)

Lien vers le commentaire
Partager sur d’autres sites

bein je pige pas non plus ce qu'il m'a expliqué ^^

 

je débute moi en c++ :P

 

Pour la remarque sur les int je suis bien d'accord...

Celle sur les floats ... c'est pour ça qu'il me mettait les soluces sous forme 1.54024 e102 ou un truc du genre...? moi je pensais que float indiquer que c'était un réel ... mais surtout on m'avait dis que c'était codé sur je sais plus... 8 octets ou un truc du genre... donc je pensais que ça irais plus loin qu'avec mes int ridicule !

 

et j'ai essayer unsigned long int, mais ça suffit pas !

 

 

 

 

j'aimerais bien comprendre la suite de ton message KewlCat :?

Autre solution : faire soi-même ses fonctions de calcul d'entiers, mais en utilisant des buffers codant pour les valeurs entières. A toi de voir comment tu veux coder tes entiers (avec des chaines de caractères, en binaire, etc.)

 

mais si tu as la possibilité de stocker tes entiers sur 64 bits ou plus, ça sera aussi bien)

ça ça m'interesse beaucoup ! ! ya un moyen de lui dire de me mettre 64bits pour tel variable ?

 

 

 

Et sinon:

Quand je clique sur m'abonner à ce sujet, il me dit que j'y suis déjà, et pourtant je n'ai reçu aucun mail pour vos réponses... (et j'ai vérifier mon email, il est bon!)

Modifié par Ikit
Lien vers le commentaire
Partager sur d’autres sites

Celle sur les floats ... c'est pour ça qu'il me mettait les soluces sous forme 1.54024 e102 ou un truc du genre...? moi je pensais que float indiquer que c'était un réel ... (...)  je pensais que ça irais plus loin qu'avec mes int ridicule !

Oui, lorsque tu bosses avec des float tu travailles avec des réels, donc nombres à virgule flottante, donc nombre de chiffres significatifs limités (c'est à dire qu'à partir d'un moment, il n'y a plus de différence entre le codage d'un réel et le codage de ce même réel + 1).

Tu pourras effectivement coder des nombres plus grands, mais tu n'obtiendras qu'une approximation (i.e. si tu fais afficher les 100 chiffres de ton 1,234e100 tu n'auras pas la vraie valeur entière)

 

Si tu veux utiliser des int sur 64 bits, regarde dans la doc de ton environnement de développement (tu n'as pas précisé). Si tu es sous Windows, peut-être que tu peux utiliser des Int64 (ou un truc comme ça), et si tu es sous Unix tu peux utiliser des "unsigned long long" ou "uint64_t" en fonction de ce que peut comprendre ton compilo...

 

Avant d'aller plus loin... C'est quoi qui t'interesse ? L'ordre de grandeur de ta factorielle, ou la valeur exacte entière ?

Lien vers le commentaire
Partager sur d’autres sites

Pour faire des calculs sur de grands nombres aucun type prédéfini n'existe en C / C++.

Heureusement il existe des bibliotheque "big_integer" ou "multi precision" ki te permettent de declarer des entiers tres grands et les manipuler :-(

 

Pour ma part j'avais deja bossé avec GMP (Gnu multi precision) http://www.swox.com/gmp !

 

C'est une librairie vraiment tres simple a utiliser et tres rapide :-P

 

La liste des fonctions est disponible ici : http://www.swox.com/gmp/manual/Integer-Fun...ger%20Functions

 

Juste une petite liste de fonctions utiles :

 

#include <gmp.h>

mpz_t  a; // pour declarer un grand entier
mpz_init (a); // pour allouer la memoire necessaire a cet entier

void mpz_set (b,a); // on copie a dans b
mpz_init_set_str (a, "123456", 10); // on rentre le nombre 123456 dans a (10 etant la base de calcul)

mpz_add (c,a,b); // c = a + b

gmp_printf ("%Zd\n",a); // afficher le grand entier a

mpz_clear(a); // liberer l'espace allouer a a !

 

Voila ... bon code :P

Lien vers le commentaire
Partager sur d’autres sites

Excellent....

http://www.swox.com/gmp/manual/Integer-Int...ger%20Internals

(c'était ce genre de feinte qui était incluse dans le "plus loin") :-)

 

Cela dit, c'est vrai que si la bibliothèque de fonctions existe déjà, inutile d'approfondir le "comment ça marche" et plutôt se concentrer sur "comment on l'utilise"...

Lien vers le commentaire
Partager sur d’autres sites

C'est bien gmp.h qui est fourni avec GMP

 

Pour info, un unsigned long c'est comme un unsigned int (sur nos PC)

Il est juste garanti que long int >= int (manque de bol, ici c'est = )

 

Pour des entiers sur 64 bits, c'est __int64 dans stdlib.h

En C on a unsigned long long

et uint64_t dans stdint.h

(mais ce sont des nouveautés du C99, donc si tu as un vieux compilateur, oublie)

 

Mais un entier même non signé sur 64 bits ( = au maximum 18 trillions et des poussières) ne permet pas de monter jusqu'à 7000!, ni même à 200!

 

Donc fonce chez GMP, tu as une fonction factorielle dedans (et très rapide :P )

Si tu as pas envie d'installer MSYS ou Cygwin (en supposant que tu bosses sous windows) il y a une version déjà compilée sur le net (avec libgmp.a, libgmp.la, gmp.h)

Modifié par leneuf22
Lien vers le commentaire
Partager sur d’autres sites

oui mais moi ce qui m'interesse c'est de la programmer la fonction factorielle :P

 

sinon je n'aurais pas posté, vu qu'avec scheme j'ai toutes les précisions que je veux, j'ai même fait 50 000!, et je peux vous dire qu'il fait 290 267 chiffres (à peux prés) je me souviens plus ...

 

 

et sinon, je travail sous windows XP

 

 

 

 

 

Et a ce propos, j'arrive à rien avec mes logiciels de développpement...

 

j'ai essayer visual studio 6 ... marche pas ... il ne connait pas certaines des fonctions notament geninterrupt ( )...

(je l'ai utilisé en suivant un cours, mais alors que c t censé marché, moi il me mettait des millions d'erreurs de ce type là, (et j'ai bien vérifier les include etc ...)

 

là je suis sous devc++ 4, pareil, il ne reconnais pas conio.h

 

 

 

 

:'( !

 

comment on fait pour faire marcher ces logiciels ?!

lequel est bien pour commencer

Modifié par Ikit
Lien vers le commentaire
Partager sur d’autres sites

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.
Remarque : votre message nécessitera l’approbation d’un modérateur avant de pouvoir être visible.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

  • En ligne récemment   0 membre est en ligne

    • Aucun utilisateur enregistré regarde cette page.
×
×
  • Créer...