Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
855 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Xint : nouvelle bibliothèque C++ pour très grands entiers.

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Xint : nouvelle bibliothèque C++ pour très grands entiers.

n°1179252
Jeam
Posté le 18-08-2005 à 23:46:54  profilanswer
 

Bonjour !
 
J'ai fait une bibliothèque, Xint, C++ (en fait un fichier .cpp en include) qui ajoute à votre code source le type "Xint". "X" pour extensible, "int" pour entier. (sans blague)
 
Donc voilà :
 
au type Xint peut être assigné n'importe quel entier (signé) de moins de 2 milliards de chiffres. (ça, c'est la théorie, car en fait, il vaut mieux rester sous 50 000 chiffres, raison de processeur oblige ! )
 
J'ai surchargé la majorité des opérateurs au type Xint, ce qui fait que toutes les opérations sont simples à écrire.
 
Exemple :

Code :
  1. using namespace std
  2. Xint A,B,C,D,E,F;
  3. A="-123456789101112131415161718192021222324";  //définition par chaîne
  4. B= -12345678;  //définition par long.
  5. cout << "Entrez un nombre (Xint) : ";
  6. cin >> C;
  7. cout << "Vous avez entré : " << C << ". " << endl;
  8. D = A*B+C;
  9. E = C/A;  //division euclidienne comme pour le type int
  10. F = C%A;  //modulo
  11. cout << "2000! = " << factorielle( Xint(2000) );


 
Quand j'ai fait la bibliothèque, je ne connaissait pas de bibliothèque qui puisse faire ceci (peut-être ai-je trop peu cherché... :) ). Mais j'ai fait en sorte que la manipulation des Xint soit le plus simple possible.
 
Toujours est-il que je voudrais avoir l'avis d'autres utilisateurs que moi pour cette bibliothèque. Notamment sur son comportement intrinsèque (qui est un tableau d'entiers long, nécessaire au fonctionnement mais pas forcément très performant :sarcastic:).
 
la bibliothèque est sous licence GNU GPL (et non pas LGPL)

mood
Publicité
Posté le 18-08-2005 à 23:46:54  profilanswer
 

n°1179267
Profil sup​primé
Posté le 19-08-2005 à 00:33:12  answer
 

Je te confirme (sans grande surprise ?) que ça existe déjà : http://www.swox.com/gmp/.
 
Si tu veux comparer ta bibliothèque à une autre, le critère qui fait foi c'est la rapidité, je pense. :D


Message édité par Profil supprimé le 19-08-2005 à 00:33:29
n°1179375
Jeam
Posté le 19-08-2005 à 10:13:18  profilanswer
 

Effectivement, sans grande surprise, mais je ne connaissais pas avant de faire ma propre bibliothèque.
 
Bon, alors forcément, moi je demande si ma bibliothèque est bien, et je ne donne pas de lien vers elle.
 
http://xint.ehia.org
 
Maintenant, c'est fait.

n°1179653
Profil sup​primé
Posté le 19-08-2005 à 15:05:41  answer
 

Ton programme ne compile pas :
 

$ g++ Exemple.cpp
In file included from Exemple.cpp:1:
Xint 0.1.cpp: Dans function « void sleep(long int) »:
Xint 0.1.cpp:89: error: `CLK_TCK' undeclared (first use this function)
Xint 0.1.cpp:89: error: (Each undeclared identifier is reported only once for
   each function it appears in.)


 
Sinon à en croire ta doc :
 

Citation :


      factorielle(N) ( = factorial(N) )
renvoie la factorielle de N. (La notation N! est impossible.) Il est alors possible de calculer factorielle(5000)
sans arrondir. Chose impossible avec les types normaux du c++. Chose faîte avec Xint en environ 1 minute.
(pour 16326 chiffres)
Remarque : factorielle(N) = 1*2*3*4*5*6*...*(N-3)*(N-2)*(N-1)*N


 
Y'a sûrement un effort à faire au niveau des performances. Mon interpréteur Lisp prend environ 0.2 secondes pour calculer 5000!...
 
 
 
 

n°1179730
Taz
bisounours-codeur
Posté le 19-08-2005 à 16:37:40  profilanswer
 

/me vient de zieuter le code ...
 
Y a des antécédents cardiaques dans ma famille je rappelle.
 
Petite phrase assassine : c'est du très très mauvais C++, tout au mieux du C with classes, pas extensible, mal implémenté, avec assurément des performances exécrables. On voit que tu ne maîtrises absolument pas C++ et que tu n'as fait _aucune_ recherche dans le domaine.
 
Commence par écrire une classe Fraction...
 
La cerise sur le gateau, c'est la fonction factorielle, je trouve plus les mots.
 
 
(Et non, je ne fais pas le méchant, je suis juste)

n°1179736
Taz
bisounours-codeur
Posté le 19-08-2005 à 16:39:54  profilanswer
 

je rajoute, n'essayer même pas de compiler, ça ne marche pas.
 

Code :
  1. class Xint;
  2. short signediff (Xint,Xint,bool);


 
en voilà une forward declaration bien singulière ... on y croit très fort mais ça ne marche pas hein :o

n°1179790
HelloWorld
Salut tout le monde!
Posté le 19-08-2005 à 17:16:15  profilanswer
 

Bienvenue parmi nous Jeam!


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°1179818
Ummon
Posté le 19-08-2005 à 17:54:53  profilanswer
 

Code :
  1. Xint factorielle(Xint nombre) {return(   (nombre<=Xint(0)) ?  Xint(1) :  nombre * factorielle(nombre-Xint(1))  );}


à chaque recursion il construit un nouveau 'Xint' !?

n°1179824
Taz
bisounours-codeur
Posté le 19-08-2005 à 18:01:06  profilanswer
 

il en construit bien plus d'un ! et surtout le problème, c'est d'implémenter une factorielle pour grands entiers avec une récursion ... y a beaucoup de réflexion derrière.

n°1179874
Jeam
Posté le 19-08-2005 à 19:03:39  profilanswer
 

Soyons clair : le but n'étais pas de supplanter une bibliothèque déjà existante, mais de voir ce que je pouvais faire en C++.  
 
Evidemment, les performances sont donc exécrables, ce code n'a jamais été optimisé, et il n'a pas été fait dans cet esprit non plus. (lisp fait 5000! en 0.2 secondes sans arrondir ? ... ah bon.) J'ai fait ça juste pour que "ça marche".
 
Non, je ne maîtrise pas le C++. Je débute. (J'ai commencé le C++ il y a environ un mois)
 
Par contre, pourquoi la compilation ne marcherait-elle pas ? ça marche pourtant chez moi ... (Dev-C++, Windows Xp et 98)
 
Je ne vois pas pourquoi la "forward declaration" (je ne connaissait pas ce terme, je suppose que ça montre mon niveau) ne marcherait pas. (Je ne contredit pas, je demande, mais pour moi ça compile)
 
Et il est vrai que la récursivité de la factorielle, c'est n'importe quoi. Pour ce coup là c'est de la fénéantise.
 
(Taz, tu es peut-être juste, mais c'est quand même méchant ...)
 
Pour CLK_TCK, il est possible de supprimer la fonction sleep. Elle n'était définie que pour les tests.
 
Bon, quoi qu'il en soit, merci d'avoir testé.
 
Jeam... un peu déçu  :)

mood
Publicité
Posté le 19-08-2005 à 19:03:39  profilanswer
 

n°1179893
Profil sup​primé
Posté le 19-08-2005 à 19:21:23  answer
 

Jeam a écrit :

Soyons clair : le but n'étais pas de supplanter une bibliothèque déjà existante, mais de voir ce que je pouvais faire en C++.  


 
Ben c'est bien, t'as vu (enfin on t'a fait voir) que tu pouvais pondre les pires atrocités. :D
 

Citation :

Evidemment, les performances sont donc exécrables, ce code n'a jamais été optimisé, et il n'a pas été fait dans cet esprit non plus. (lisp fait 5000! en 0.2 secondes sans arrondir ? ... ah bon.) J'ai fait ça juste pour que "ça marche".


 
"sans arrondir" ça veut dire quoi ? :??:  
 

Citation :

Non, je ne maîtrise pas le C++. Je débute. (J'ai commencé le C++ il y a environ un mois)


 
T'es peut-être pas parti sur les bonnes bases...

n°1179907
Jeam
Posté le 19-08-2005 à 19:53:41  profilanswer
 

Citation :

"sans arrondir" ça veut dire quoi ? :??:


"sans arrondir" ... ça veut juste dire que ce n'est pas sous forme 4,2285779266 e16325 ... mais je connais lisp juste de nom et de "genre".
 

Citation :

Ben c'est bien, t'as vu (enfin on t'a fait voir) que tu pouvais pondre les pires atrocités. :D  
 
[...]
 
T'es peut-être pas parti sur les bonnes bases...


C'est mauvais à ce point, même seulement au bout d'un mois ? (pas à temps plein, s'entend)

n°1179914
docmaboul
Posté le 19-08-2005 à 20:07:43  profilanswer
 

Taz a écrit :

/me vient de zieuter le code ...
 
Y a des antécédents cardiaques dans ma famille je rappelle.


 
Justement, faudrait penser à te faire soigner un de ces quatre [:rhetorie du chaos]
 

Citation :

(Et non, je ne fais pas le méchant, je suis juste)


 
Qo3.16 J'ai encore vu sous le soleil qu'au siège du jugement, là était la méchanceté, et qu'au siège de la justice, là était la méchanceté.

n°1180049
el muchach​o
Comfortably Numb
Posté le 20-08-2005 à 00:58:07  profilanswer
 

Moi, je trouve que c'est pas mal du tout, après un mois de C++. Ca manque un peu de const tout de même.
Bon ,évidemment, GMP calcule 5000! en 0ms 50000! en 65ms, mais là n'est pas la question...
 
(je me souviens du temps où je calculais 100! en Basic sur mon Mac+ :p )


Message édité par el muchacho le 20-08-2005 à 01:02:06
n°1180074
Jeam
Posté le 20-08-2005 à 09:22:46  profilanswer
 

Merci... :)
 

Citation :

(je me souviens du temps où je calculais 100! en Basic sur mon Mac+ :p )

par contre, je ne savais pas que le basic (c'est le même que MS Quick Basic ?) pouvais avoir une précision de 158 chiffres ... (il faut que je revois mes classiques)
 

Citation :

Ca manque un peu de const tout de même.

(les const, tu veux dire avec les références dans les fonctions, où je suis complètement à côté ? ce qui ne m'étonnerait pas d'ailleurs ...  :( )
 
Si vous avez du temps à perdre :
Je sais maintenant que ma bibliothèque est construite en très mauvais C++. Je suis fixé. Par contre, j'aimerais bien savoir quelles sont les plus grosses erreurs (à part la factorielle) ? Je parle au niveau de la technique et du principe.
 
Pour que, la prochaine fois, je ne reproduise pas les mêmes erreurs (ne vous inquiétez pas, je ne refais pas de bibliothèque pour grands nombres ...)

n°1180129
el muchach​o
Comfortably Numb
Posté le 20-08-2005 à 12:10:50  profilanswer
 

Jeam a écrit :

Merci... :)
 

Citation :

(je me souviens du temps où je calculais 100! en Basic sur mon Mac+ :p )

par contre, je ne savais pas que le basic (c'est le même que MS Quick Basic ?) pouvais avoir une précision de 158 chiffres ... (il faut que je revois mes classiques)
 
Si vous avez du temps à perdre :
Je sais maintenant que ma bibliothèque est construite en très mauvais C++. Je suis fixé. Par contre, j'aimerais bien savoir quelles sont les plus grosses erreurs (à part la factorielle) ? Je parle au niveau de la technique et du principe.
 
Pour que, la prochaine fois, je ne reproduise pas les mêmes erreurs (ne vous inquiétez pas, je ne refais pas de bibliothèque pour grands nombres ...)


 
Non, le Basic ne faisait pas du calcul multiprécision, j'avais juste écrit des routines pour ça.
Bof, ton C++ n'est pas extraordinaire, mais on a vu pire ici (et ailleurs). Au bout d'un mois, ça n'a rien d'étonnant. Je n'ai pas vraiment regardé, vu que c'est assez bateau, mais ce qui m'a immédiatement frappé, c'est l'absence du mot-clé déclaratif const, eet bcp (trop) de friend.


Message édité par el muchacho le 20-08-2005 à 12:11:08
n°1181016
HelloWorld
Salut tout le monde!
Posté le 22-08-2005 à 09:46:15  profilanswer
 

C'est en faisant des erreurs qu'on apprend. Tu as ton code qui est lent. Tu as le code de GMP qui est rapide. Etudie le code de GMP, compare le avec le tiens, corrige, ... et progresse!
Pour Taz ne fait pas attention. Le forum te remercie, grâce à toi il a déchargé tout son fouttre, on est tranquilles quelques jours.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°1182046
_p1c0_
Posté le 23-08-2005 à 10:27:29  profilanswer
 

el muchacho a écrit :

mais ce qui m'a immédiatement frappé, c'est l'absence du mot-clé déclaratif const


 
Petite question au passage : faut en mettre le plus possible des const? Enfin à chaque fois qu'on passe une variable qui n'a pas à être modifiée en paramètre ?

n°1182744
el muchach​o
Comfortably Numb
Posté le 23-08-2005 à 20:28:30  profilanswer
 

Demande à Taz  :whistle:  
Il faut en mettre, disons, "raisonnablement". Ceci dit, là où il n'y a pas de pointeur, références et/ou de membres de classes, il n'y a pas trop besoin de const. Dans le cas contraire, c'est utile et une habitude à prendre.


Message édité par el muchacho le 23-08-2005 à 20:29:43
n°1183018
_p1c0_
Posté le 24-08-2005 à 09:21:08  profilanswer
 

el muchacho a écrit :

Demande à Taz  :whistle:


 :sweat: J'ai déjà fait sa connaissance sur un autre topic, je vais me renseigner un peu ailleurs avant de lui demander!!  :)  

n°1183653
Jeam
Posté le 24-08-2005 à 19:23:41  profilanswer
 

Citation :

Etudie le code de GMP, compare le avec le tiens, corrige, ... et progresse!


Je pense que cela ne servirait à rien d'améliorer mon code. Si je veux faire quelquechose de plus rapide, je dois tout refaire, repenser tout le principe. (Ou optimiser mon code, mais ça ne sert à rien non plus ;) )
 
Et puis, comparer le code de GMP avec le mien ... euh ... Mais étudier le code de GMP, c'est surement très instructif. Mais je vais d'abord m'attaquer à quelque chose de plus "abordable". (Les tutoriaux de C++ par exemple ...:) )
 
Bon, et bien merci tout de même d'avoir testé.
 

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Xint : nouvelle bibliothèque C++ pour très grands entiers.

 

Sujets relatifs
Ouvrir un lien php dans une nouvelle fenêtre[JS] Bug très étrange... Comprends pas !
"explorer" une bibliothèque sous linuxapplication très pointue VB ou autre...
c++ bibliothequeNouvelle boite de dialogue
Bibliothèque traitement d'images[VBA EXCEL] fonction très simple qui renvoie #VALEUR...
Importer une bibliothèque de classesDesign Patterns - Une bibliothéque serait elle viable ?
Plus de sujets relatifs à : Xint : nouvelle bibliothèque C++ pour très grands entiers.


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR