CodingTeam dans votre langue
frFrançais enEnglish
Ajouter votre projet 

[métaprogrammation en C++] Problème fonction Sinus

Programmation - Répondre

blend

avatar
Membre

31/10/2007 - 11:41:36   - Citer ce message

Bonjour,
Je suis nouveau sur CodingTeam et j'ai l'impression que je ne vais plus pouvoir m'en passer , il est trop pratique :P

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

avatar
Membre

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 :p

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

avatar
Membre

30/04/2008 - 21:51:40   - Citer ce message 

Merci beaucoup pour la réponse et pour le code :D
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) ^^


- Répondre à ce sujet

 

Visiter CodingTeam via l'accès sécurisé (SSL)