Compilation code xcas sous c++
Modérateur : xcasadmin
Compilation code xcas sous c++
Bonjour,
j'ai un petit soucis avec la fonction pow() qui ne prend comme argument que des types float.
Exemple: j'ai besoin d'obtenir pow(a,1.0/2)(pour le c++ par la suite) alors que le seul résultat que j'obtiens est pow(a,1/2) ou bien que le résultat passe au format exp (0.5 ln..
est ce qu'il y a moyen de remedier à ça ?
Cordialement.
j'ai un petit soucis avec la fonction pow() qui ne prend comme argument que des types float.
Exemple: j'ai besoin d'obtenir pow(a,1.0/2)(pour le c++ par la suite) alors que le seul résultat que j'obtiens est pow(a,1/2) ou bien que le résultat passe au format exp (0.5 ln..
est ce qu'il y a moyen de remedier à ça ?
Cordialement.
Re: Compilation code xcas sous c++
Si vous voulez juste la forme inerte de pow, sans evaluation sur a (de type gen), vous pouvez construire l'objet a^0.5 "quote" avec
symb_pow(a,0.5);
Si a est lui-meme un double, utilisez std::pow(a,0.5) pour appeler la fonction de la libc.
symb_pow(a,0.5);
Si a est lui-meme un double, utilisez std::pow(a,0.5) pour appeler la fonction de la libc.
Re: Compilation code xcas sous c++
Bonjour,
le problème est que j'ai un calcul des dérivées partielles par la suite donc si je change pow par symb_pow, le résultat ne sera pas correct.
d'une autre part, j'obtiens avec xcas 1/(exp(0.5*ln(q[1]*q[1]+q[2]*q[2]))) au lieu de 1/pow(q[1]*q[1]+q[2]*q[2],0.5) ou bien 1/pow(q[1]*q[1]+q[2]*q[2],1.0/2).
même en essayant evalf(1/(symb_pow(q[1]*q[1]+q[2]*q[2],1/2))) j'obtiens 1.0/(symb_pow(q[1]*q[1]+q[2]*q[2],1/2)) ; mais le 1/2 reste inchangé.
Cordialement.
le problème est que j'ai un calcul des dérivées partielles par la suite donc si je change pow par symb_pow, le résultat ne sera pas correct.
d'une autre part, j'obtiens avec xcas 1/(exp(0.5*ln(q[1]*q[1]+q[2]*q[2]))) au lieu de 1/pow(q[1]*q[1]+q[2]*q[2],0.5) ou bien 1/pow(q[1]*q[1]+q[2]*q[2],1.0/2).
même en essayant evalf(1/(symb_pow(q[1]*q[1]+q[2]*q[2],1/2))) j'obtiens 1.0/(symb_pow(q[1]*q[1]+q[2]*q[2],1/2)) ; mais le 1/2 reste inchangé.
Cordialement.
Re: Compilation code xcas sous c++
je suis perdu, est-ce que vous avez essaye symb_pow dans xcas ou dans du code C++? Parce que symb_pow est une fonction C++ pas une fonction xcas. Sinon, il est exact que a^b est converti en exp(b*ln(a)) lorsque b est un flottant, mais ca ne devrait pas gener un calcul ulterieur puisque c'est precisement comme ca qu'on definit a^b lorsque b n'est pas rationnel. Si vous preferez des puissances, vous pouvez utiliser la fonction xcas exp2pow (correspondant a _exp2pow en C++) pour reconvertir en puissance.
Re: Compilation code xcas sous c++
Bonjour,
je n'arrive pas à trouver la fonction symb_pow pour le c++ (c'est dans quelle library). Si vous voulez voilà le code que je génère avec xcas
/----------------------------------------------------
void ComputeMotion()
{
// Dependant variables
p[0] = 0.01-0.0025*cos(q[0]) ;
pd[0] = 0.0025*qd[0]*sin(q[0]) ;
pdd[0] = 0.0025*qdd[0]*sin(q[0])+0.0025*cos(q[0])*pow(qd[0],1/2) ;
p[1] = atan((p[0]-0.0075)/0.06) ;
...
le problème est dans le pow(qd[0],1/2) dans la compilation du code sous gcc le 1/2 sera évaluée 0. Est ce possible d'avoir l'écriture pow(qd[0],1.0/2) ou bien pow(qd[0],0.5) et non pas exp(0.5ln(qd[0])) (il faut déjà remplacer ln par log pour le c++)
Merci pour toutes les réponses précedentes.
Cordialement.
je n'arrive pas à trouver la fonction symb_pow pour le c++ (c'est dans quelle library). Si vous voulez voilà le code que je génère avec xcas
/----------------------------------------------------
void ComputeMotion()
{
// Dependant variables
p[0] = 0.01-0.0025*cos(q[0]) ;
pd[0] = 0.0025*qd[0]*sin(q[0]) ;
pdd[0] = 0.0025*qdd[0]*sin(q[0])+0.0025*cos(q[0])*pow(qd[0],1/2) ;
p[1] = atan((p[0]-0.0075)/0.06) ;
...
le problème est dans le pow(qd[0],1/2) dans la compilation du code sous gcc le 1/2 sera évaluée 0. Est ce possible d'avoir l'écriture pow(qd[0],1.0/2) ou bien pow(qd[0],0.5) et non pas exp(0.5ln(qd[0])) (il faut déjà remplacer ln par log pour le c++)
Merci pour toutes les réponses précedentes.
Cordialement.
Re: Compilation code xcas sous c++
oui, 1/2 sera forcement evalue en 0 en C (quotient euclidien entier), vous pouvez utiliser a la place plus_one_half qui renvoie le gen 1/2.
Sinon symb_pow est declare dans usual.h, donc devrait etre vu si vous faites #include<giac/giac/h>
Pour le ln, giac accpete les 2 syntaxes ln(x,contextptr) ou log(x,contextptr).
S'il s'agit d'utiliser l'impression d'une expression contenant des ln dans un autre source C travaillant avec des doubles, vous pouvez faire un define
#define ln(x) log(x)
Sinon symb_pow est declare dans usual.h, donc devrait etre vu si vous faites #include<giac/giac/h>
Pour le ln, giac accpete les 2 syntaxes ln(x,contextptr) ou log(x,contextptr).
S'il s'agit d'utiliser l'impression d'une expression contenant des ln dans un autre source C travaillant avec des doubles, vous pouvez faire un define
#define ln(x) log(x)
Re: Compilation code xcas sous c++
Bonjour,
j'essayé d'intégrer la fonction sym_pow(), le problème pendant la compilation le fichier gmp.h est manquant.
message d'erreur:
/usr/include/giac/first.h:75:17: error: gmp.h: Aucun fichier ou dossier de ce type
Bien cordialement.
j'essayé d'intégrer la fonction sym_pow(), le problème pendant la compilation le fichier gmp.h est manquant.
message d'erreur:
/usr/include/giac/first.h:75:17: error: gmp.h: Aucun fichier ou dossier de ce type
Bien cordialement.
Re: Compilation code xcas sous c++
Oui, vous devez installer gmp pour pouvoir utiliser giac. Cf. http://gmplib.org/