factor et / sqrt

Librairie C++ de calcul formel/ C++ symbolic computation library

Modérateur : xcasadmin

frederic han
Messages : 1137
Inscription : dim. mai 20, 2007 7:09 am
Localisation : Paris
Contact :

factor et / sqrt

Message par frederic han » jeu. juin 18, 2015 7:10 pm

je tombe sur ce bug en compilant ce code avec giac 1.2.0-13

Code : Tout sélectionner

#include <giac/giac.h>

using namespace std;
using namespace giac;

int main(){
string s("sqrt(5)");
string s2("x");
giac::context ct;
gen c(s,&ct);
gen cc(s2,&ct);
 cout << "Factor Eval :" << _factor(eval(c/cc,&ct),&ct) << endl;
cout << "Factor :" << _factor(c/cc,&ct) << endl;
return 0;
}
donne:

Code : Tout sélectionner

Factor Eval :sqrt(5)/x
Factor :0


parisse
Messages : 5740
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: factor et / sqrt

Message par parisse » jeu. juin 18, 2015 7:20 pm

C'est normal, il faut evaluer apres avoir parse, sinon certains operateurs (sqrt en fait partie) ne sont pas remplaces par la valeur utilisee en interne. Ou alors il faut construire les expressions depuis des chaines parsees plus simples en appliquant les fonctions en C++.

frederic han
Messages : 1137
Inscription : dim. mai 20, 2007 7:09 am
Localisation : Paris
Contact :

Re: factor et / sqrt

Message par frederic han » jeu. juil. 02, 2015 2:00 pm

pour finir je ne comprend pas trop comment je peux evaluer sans avoir pleins d'effets de bords.

par exemple si j'evalue les arguments des fonctions ou lors de la creation du gen les choses du genre 'x>0' pour assume ou x=0..5 pour plot ... auront des problemes.
de plus en python je n'ai pas de difference de type entre "x" et 'x'


Ca n'est pas plutot factor qui devrait savoir qu'il doit evaluer ses arguments? par exemple je peux reproduire le pb sous icas:

Code : Tout sélectionner

factor(quote(sqrt(5))/x)
donne 0

parisse
Messages : 5740
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: factor et / sqrt

Message par parisse » jeu. juil. 02, 2015 2:30 pm

SI tu fais string s("factor(sqrt(5)/x)"); puis gen g(s,&ct); et g=eval(g,1,&ct); ca marche aussi. Quand tu tapes une ligne de commande dans xcas ou icas, ca donne une chaine qui est parse en un gen puis evalue exactement comme dans l'exemple ci-dessus.
Le principe general c'est que les fonctions C ne doivent pas evaluer leurs arguments, car ils sont deja evalues. Sinon, on evaluerait plusieurs fois les memes objets. L'exception, ce sont les fonctions qui auto-quotent certains arguments (par exemple := ou solve ...).
Je ne sais pas trop pour python, mais ne peux-tu pas adopter le meme principe, evaluer systematiquement les gen cree a partir de chaines de caracteres, et ensuite appeler les fonctions C sans evaluer quoi que ce soit? Ca devrait donner le meme comportement que dans Xcas il me semble.

frederic han
Messages : 1137
Inscription : dim. mai 20, 2007 7:09 am
Localisation : Paris
Contact :

Re: factor et / sqrt

Message par frederic han » jeu. juil. 02, 2015 2:46 pm

non je ne peux pas evaluer toutes les chaines de caracteres au moment de leur creation par exemple a cause de la creation de x>0 pour
ou d'autres arguements tels que 'x=0..5'

En revanche je peux evaluer a*b et a/b ca semble resoudre le pb.

Répondre