[métaprogrammation en C++] Problème fonction Sinus
Programmation - Répondre
| blend |
31/10/2007 - 11:41:36
- Citer ce message Je suis nouveau sur CodingTeam et j'ai l'impression que je ne vais plus pouvoir m'en passer , il est trop pratique ![]() Je suis en train de me plonger dans la métaprogrammation en C++ (je l'ai découvert grâce à ce tuto: http://loulou.developpez.com/tutoriels/cpp/metaprog/ qui est très bien). Alors j'ai essayé de me lancer dans la ré-écriture de fonctions trigonométriques optimisées (tant qu'a faire), mais j'ai un petit problème avec la fonction Sinus (pour rappel, voir ici: http://fr.wikipedia.org/wiki/Fonction_trigonom%C3%A9trique ^^): elle retourne une valeur 10X trop grande! Mon code:
template<int N>
inline double Sin(double x) { return Sin<N-1>(x)+(N%2 ? -1 : 1)*Pow<2*N+1>(x)/ Factorial<2*N+1>(); } template<> inline double Sin<0>(double x) { return 0.0; } N est l'ordre de précision. Pow calcule x à la puissance donnée (2*N+1 ici), Factorial retourne la factorielle (ici de 2*N+1) Merci pour votre aide. |
| nicolas66 |
26/04/2008 - 02:35:33 - Citer ce message Salut,Comme toute chose nouvelle qu'on trouve cool et qu'on vient d'apprendre, on a tout de suite envie d'en mettre partout. La métaprogrammation c'est plutôt bien, mais les temps de compilation peuvent parfois s'allonger fortement. A méditer ![]() Concernant ton problème : as-tu pensé à convertir la valeur d'entrée en radians ? A titre d'aide, je te file mes fonctions sin et cos qui fonctionnent correctement : template<unsigned int I> static inline float Sinus( const float Value ) { if( !(I % 2) ) return Sinus<(!(I % 2)) ? I - 1 : 0>(Value); return Sinus<(I % 2) ? I - 2 : 0>(Value) + ((((I - 1) / 2) % 2) ? -1 : 1) * Power<(I % 2) ? I : 0, float>(Value) / Factorial<(I % 2) ? I : 0>(); } template<unsigned int I> static inline float Cosinus( const float Value ) { if( I % 2 ) return Cosinus<(I % 2) ? I - 1 : 0>(Value); return Cosinus<(I % 2) ? 0 : I - 2>(Value) + (((I / 2) % 2) ? -1 : 1) * Power<(I % 2) ? 0 : I, float>(Value) / Factorial<(I % 2) ? 0 : I>(); } Voilà, bon courage ^^ |
| blend |
30/04/2008 - 21:51:40 - Citer ce message Merci beaucoup pour la réponse et pour le code![]() Entre temps je me suis calmé sur la métaprog (j'ai juste refait memset(), memcpy() optimisés, une classe de vecteurs 4D, de matrices 16x16 et de quaternions) ^^ |



