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

  FORUM HardWare.fr
  Programmation
  C++

  fonction template d'une classe template

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

fonction template d'une classe template

n°1431861
lautaro
Posté le 26-08-2006 à 15:26:03  profilanswer
 

Bonjour,
 
J'ai une classe template Fraction<class T> ayant un constructeur

Code :
  1. template<int precision>Fraction<T>(double r)

permettant de creer une fraction dont les membres numerateur et denominateur sont de type T à partir d'un flottant r avec une precision de calcul à 10e-precision.  
Je n'arrive pas à instancier une Fraction à l'aide de ce constructeur. Pourriez-vous m'indiquer la syntaxe à utiliser SVP. J'ai essayé les syntaxes suivantes :  

Code :
  1. Fraction<long><2>(3.14)
  2. Fraction<long>(3.14)<2>
  3. Fraction<long, 2>(3.14)

et aucune ne marche.

mood
Publicité
Posté le 26-08-2006 à 15:26:03  profilanswer
 

n°1431884
Joel F
Real men use unique_ptr
Posté le 26-08-2006 à 17:36:55  profilanswer
 

Je pense pas que ca puisse passé.
Essaye plutot de mettre le paramètre Precision dans la liste des paramétres tempalte de la classe, et mets lui une valeur par défaut.
 

Code :
  1. template<class T, int PREC=4> class Fraction
  2. {
  3.    // ...
  4.    Fraction(double r) { ... }
  5. };
  6. Fraction<double> d(1) // precision a 10e-4
  7. Fraction<double,9> d(1) // precision a 10e-9


n°1431977
nargy
Posté le 26-08-2006 à 23:58:21  profilanswer
 

Note que si tu choisis la solution de Joel, il te faut aussi un constructeur (et/ou opérateur de cast) pour transformer des Fraction<T,prec> en Fraction<T>.
 
Une autre solution plus simple finalement est de rendre template une fonction set<T prec>(double).
 
Enfin, si ton compilateur accepte très bien le mot-clé inline, alors n'hésite pas à utiliser inline Fraction(double, const T prec) qui est équivalent.

n°1431986
Joel F
Real men use unique_ptr
Posté le 27-08-2006 à 00:37:50  profilanswer
 

nargy a écrit :


Note que si tu choisis la solution de Joel, il te faut aussi un constructeur (et/ou opérateur de cast) pour transformer des Fraction<T,prec> en Fraction<T>.


Ce qui n'est pas une difficulté en soit ;)
 

nargy a écrit :


Une autre solution plus simple finalement est de rendre template une fonction set<T prec>(double).


 
Et la RAII mon cher :o
 

nargy a écrit :


Enfin, si ton compilateur accepte très bien le mot-clé inline, alors n'hésite pas à utiliser inline Fraction(double, const T prec) qui est équivalent.


 
Non, les paramétres template entiers permettent de faire plus, bien plus (detection de valeur erronée a la compilation, arithmetique statique, selection d'algo a la compilation etc ...)

n°1431990
nargy
Posté le 27-08-2006 à 00:53:02  profilanswer
 

> Et la RAII mon cher :o
Ok dac, dommage que tu ne puisse écrire:
Fraction<long> f=<2>3.14;
 
Sinon, tu peut faire une classe PFraction<T,prec> qui hérite de Fraction<T>, avec les casts nécessaires, et notamment un constructeur Fraction<T>(const PFraction<T,prec>& ).
 
Fraction<long> f=PFraction<2>(3.14);

n°1431995
nargy
Posté le 27-08-2006 à 01:16:38  profilanswer
 

PS: a oui j'oubliais.... il y a un algo qui existe et qui est assez sympa pour avoir une fraction à partir d'un nombre flottant.
 
Je ne m'en souvient pas entièrement, mais la méthode consiste à prendre l'inverse de la partie fractionnaire, et garder la partie entière, jusqu'à obtenir une erreur de calcul (nombre trop petit ou trop grand).
 
3.14: 3 + 0.14
1/0.14= 7 + 0.14286
 
donc 3.14~=~ 3+1/7 = 22/7
 
On peut continuer avec 0.14286-0.14, et jusqu'à obtenir une partie fractionnaire 0 ou un overflow sur les nombres entiers de la fraction.
 
3.14 ~=~ 3 + 1/7 - 1/350 = (22*350-7)/7/50 = 7693/2450

n°1431999
lautaro
Posté le 27-08-2006 à 01:31:42  profilanswer
 

C'est bien cet algo que j'utilise. En fait je cherche le meilleur moyen de définir l'arrêt du calcul, dans le cas de pi par exemple. Peut-on savoir si on arrive a un overflow sur un type parametre entier (dans mon cas T) ?

n°1432026
nargy
Posté le 27-08-2006 à 09:41:29  profilanswer
 

Quand tu calcule PI, tu ajoute dans une boucle les nombres d'une série. Donc dans ce cas il est plus facile de repérer l'arrondi de calcul sur les flottants:

Code :
  1. // ...
  2. nouveau_pi=ancien_pi+delta;
  3. ratio=ancien_pi/nouveau_pi;
  4. if(ratio>1-epsilon && ratio<1+epsilon)
  5.   break;
  6. // ...


En constante tu peut mettre un epsilon petit et contrôler la précision, ou carrément:

Code :
  1. if(ancien_pi/nouveau_pi==1) break;


Pour la précision max.
 
Pour detecter un overflow sur un entier de type T, tu vérifie que le résultat est cohérent: par exemple si tu ajoute deux nombres positifs le résultat doit être plus grand que les deux nombres de départ.

n°1432044
Joel F
Real men use unique_ptr
Posté le 27-08-2006 à 10:23:26  profilanswer
 
n°1432085
lautaro
Posté le 27-08-2006 à 13:10:53  profilanswer
 

Merci beaucoup pour vos reponses. Je n'avais pensé à utiliser, dans une classe/fonction template, les std::numeric_limits. Je crois que je vais utiliser

Code :
  1. template<class I, class F> class Fraction<I,F>


avec I le type entier des numerateur et denominateur et F le type flottant servant à definir la precision des conversions Fraction<--> flottant.

mood
Publicité
Posté le 27-08-2006 à 13:10:53  profilanswer
 

n°1432116
Joel F
Real men use unique_ptr
Posté le 27-08-2006 à 14:47:44  profilanswer
 

nargy a écrit :


Sinon, tu peut faire une classe PFraction<T,prec> qui hérite de Fraction<T>, avec les casts nécessaires, et notamment un constructeur Fraction<T>(const PFraction<T,prec>& ).
 
Fraction<long> f=PFraction<2>(3.14);


 
C'est laid et ca enleve tout interet à la version tempalte qui ici fait office
de polymorphisme statique.

n°1432124
nargy
Posté le 27-08-2006 à 15:06:07  profilanswer
 

> C'est laid et ca enleve tout interet à la version tempalte qui ici fait office de polymorphisme statique.
 
ça correspond au moins au modèle mathématique, alors que dans:

Code :
  1. Fraction<double> d(1) // precision a 10e-4


...la precision a 10e-4 est tout à fait arbitraire -- sortirai-t-elle du chapeau du C++ien?
D'où ma proposition d'algorithme pour une précision maximale par défaut, permettant de ne pas obtenir de résultats mathématiques abbérants.

n°1432163
Joel F
Real men use unique_ptr
Posté le 27-08-2006 à 18:23:56  profilanswer
 

ca se defend, mais autant rester en statqiue et propsoer une startegie modifiable a la compilation et non une hierarchie dynamique.

n°1432194
Taz
bisounours-codeur
Posté le 27-08-2006 à 19:00:24  profilanswer
 

tu ferais sans doute bien de faire des traits.


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

  fonction template d'une classe template

 

Sujets relatifs
fonction ( titre austère s'il en est )probleme avec la fonction socket_send
[VBA] [Résolu] Appel foireux d'une classe d'arbre binaire{resolu}[access] bloquer la fonction d'insertion dans un formulaire
Optimiser une fonction [RESOLU][C/GTK++]Paramètre d'une fonction appeler par un G_CALLBACK
fonction mail()Fonction de pop-up
fonction retournant une instance de classe templatefonction template dans une classe template
Plus de sujets relatifs à : fonction template d'une classe template


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