/ et approx

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 :

/ et approx

Message par frederic han » ven. oct. 11, 2013 4:54 pm

Salut j'ai des soucis en cython avec / et les flottants:

un truc du genre: giac(7).approx(100) /3 se trompe au 12ieme chiffre

apres inspection si par exemple j'utilise les fonctions C++ suivantes:

gen giacmul(gen & a, gen & b, const context * context_ptr){
return a*b;
}

gen giacdiv(gen & a, gen & b, const context * context_ptr){
cout<<" a:"<<a<<" b :"<<b<<" a/b: "<<a/b<<endl;
return a/b;
}


je recupere:

Code : Tout sélectionner

>>> giac(7).approx(50)/3
 a:7.0000000000000000000000000000000000000000000000000 
b :3 
a/b: 2.3333333333333250436680827988311648368835449218750
alors que:

Code : Tout sélectionner

>>> giac(7).approx(50)*'1/3'
2.3333333333333333333333333333333333333333333333333
idem

Code : Tout sélectionner

>>> giac(7).approx(50)/giac(3).approx(50)
est bien en 50 chiffres corrects.
(de plus, pas de probleme avec ^(-1) au lieu de diviser mais j'aimerai autant eviter ca).

pourtant de mon cote j'ai l'impression d'avoir fait la meme chose pour * et / dans giacpy.
est ce que je dois m'y prendre autrement ou bien reste t'il un petit bout de code en 12 chiffres quelque part dans giac?

Fred

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

Re: / et approx

Message par parisse » sam. oct. 12, 2013 8:08 am

Essaie d'appeler la fonction rdiv au lieu de /, comme ca tu peux lui passer la variable de contexte:

Code : Tout sélectionner

gen giacdiv(gen & a, gen & b, const context * context_ptr){
return rdiv(a,b,context_ptr);
}

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

Re: / et approx

Message par frederic han » sam. oct. 12, 2013 9:38 am

Le proges est que catient compte de DIGITS, mais si DIGITS est inferieur a la valeur donnee par approx alors ca ne marche plus apres la precision de DIGITS.

Code : Tout sélectionner

In [2]: giac('DIGITS:=30')
Out[2]: 30

In [3]: giac(7).approx(200)/3
Out[3]: 2.33333333333333333333333333334

Répondre