problème avec evalf

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

Modérateur : xcasadmin

cdeval
Messages : 192
Inscription : mer. juin 03, 2009 4:28 pm

problème avec evalf

Message par cdeval » mer. sept. 22, 2010 8:01 pm

Salut Bernard,

j'ai rencontré un soucis dans OpenOffice avec une activité de recherche de zéros par la méthode de Newton.
J'ai cru d'abord à un problème de limitation de buffer lié à OOo car la fraction en entrée fait environ 5000 caractères. Ensuite, j'ai pu isoler le problème dans le petit programme ci-dessous.
Il s'agit de ma fonction dans OOo "evaluer(nombre,précision)" qui bogue pour cette grosse fraction lorsque je demande moins de 15 chiffres. Au dessus de 15 chiffres, ça marche.
Le morceau de code que j'utilise dans OOo vient de toi car je n'arrivais pas à faire fonctionner :

Code : Tout sélectionner

        gen e(string("pi"),0);
        a=evalf(e,30,0);
Voilà le code qui permet de voir le problème (d est une fraction qui fonctionne bien quelque soit la précision, e la grosse fraction qui bogue pour une précision <15) :

Code : Tout sélectionner

#include <giac/giac.h>

using namespace std;
using namespace giac;

int main(){
  std::string s;
  giac::context * contextptr=0;
  int save_decimal_digits=decimal_digits(contextptr);
  int precision;
  for (;;){
	std::cout << "Précision : " ;
	std::cin >> precision;
	set_decimal_digits(precision,contextptr);
	// d ne pose pas de problème
	giac::gen d(string("649752812316517452246390898690969738783311604584897041928044979034581290921163953071116219712081708762769558348014087408800363098497235406986493267598344230207/289225427923595662260667812699331079696528961066175577555362046797984657155343097436879439375528327577921689575758809902426309116079869514524775602882145681408"),contextptr);
	// std::cout << "d vaut : " << eval(d,contextptr) << std::endl;
	// e pose problème pour une précision < 15
	giac::gen e(string("9631717858165541700861120341934764501872539500602240668502133917897071171725804147032015930692016857118865259542128270663026351989465804459497150730806708788996717069028347866535537958489549157278030509461823236068139941764848142997329666085306331424373287826639522352198217277776652110164034112785169087945366789364092034645108116971370093787779506091543138678325819385712548040908769281501922017104340435866213027383602492880677163848601143986823810888355204951133284784700627367711171131869840065597808710062406533575709057481300379329458072672761978538524180841291669597197327361967172656187481205511075715330310972319082978106741744502393111455828254680264847305528341142714274506299275696475445499370975290679145809004520356864464693637036463473561848887569997622710431769289612365511711188624846872876811347965394499274193847672908420643498966377153992172508282468676526295541054720131358725197168097864525542711655119346605878566366668241482910703389052065443188666008839692434552978187451675198471672897015668633110051220720864662526886812961415173062883394198709962183099199310215330433836629571930768328992124028952374017495384981141346189421923758816140117909750778715450167627022720966966049100437978634865518532181562075728868993970134403286992887079718282640393643125834526590066910572350966673042491952527305852273303541330595850584145771378580135416013322617865728157631589915567022438129876602204832276061611261986437118745756800093065872685810251179380151134141817995223766216067223549627427251638812838228475443024430514872648229394458381891534624925487099824630963332603794074364937486456827822272457855452396869956580061732914306490124155943430896882518519527272297414995790929116568237336253643998797354484131370894892894319805011659944927163162795588118528499350830609395463746772773929968957270011128367528352047651530485642828027215718559123637105779513602738765198920270518109962976602816563135325695662553802541052326215071592997332665550648213828978661468876924993119102310149434935846689046391407986536687049797278779528536976288617252870596337015483707992318637575470858344789475487568780642619337007832144429869732622188676478632987064533230784099081880463842878349418319610030166399057600473219443458661253465341476824268556716453716258420373666331738604870445183278576471686523796990164136472602309253406861548979847828773064202342186767876268797303154957534793415958323641727732785382206073740128973456927787480104393431642057945984898130420830079955152515992063631810076890218650139159375532388054271/4287380779831448005792968699576579265212644598075105124492022994550688748828517577183378620833800271376085380726024519374181069667726022516415200729582485609758413160507762667542495727406075077136961103924972961234990220110187756647195717941009540035165076753190440795486224824794731074064090858386570694754830671985919644350499031252576217548387399196952296446948545258967183456817801655684018405268448080126186526197200060199732826152414089897213528144150460844566676946404607381369062508964680015962797809814400384247357483897099535350584878170243383298284942806650791995359462226268227734450663629098162177920385447356357754199834608974459600045781877825560269672264139164741770309536509661092293628233094412839829295715538853983615894550004003829501702108236044796695909560564026903604203809585603347391682969115282644201926688226478293565495381707816077917423977675575623239429793753943781946802337913966663434939542490303694779192138505670512031753351954333040214490361689937608479248058069139528929124675860438913302618186394031279975992215195076104199082838457919128959649497763508963513872513847702932692353284661876689942027287580044822456437809023863759704709998907179495195563665019392812485679241283525388525505501246664104131701904226923200088545922571699340728017813509964869776997994695225518894170225436607117667394710237736598532537706400298611372319313743324876761398148229195783106588036154214811503378495681382235172060336146602580357128322507374099915682375153172070225610992630590943334092095676285533213355609937956500566482741216636478832249389771004759396800049040638763330678718905157227638544985157624640087671599040016497920216397046988279762183635079948680926797709350136632883650440668496509876555904082213782581983606595429019275733119601515287138138249977935903818575152144525578381729506160442547864378953153504522354451173408454110562512404287299915439968057889905791208945904113447299611090339412817425196584786665585718248660112153560875013029939562801298304379607351555902699107420491693903973772602812537236503198361745728094924472706277683388511530978102883123207792020011653536125048924693439622644088609939957445368714238597472039318240391382718051739474084893563309021959300639297739530066829357803537101710118490790159137174204649709876016462227034704457220721518009204741798907361990134919674719867689747539755606648804060900226233856949555386515152003825999774445623283563527432043871006572457231090744397751452704811193797565320790490534500403603418953804385831973605433306843314772770816"),contextptr);
	//std::cout << "e vaut : " << eval(e,contextptr) << std::endl;
	gen f;
	try {
		// commenter une des deux lignes suivantes
		f=d.evalf(1,contextptr);
		// f=e.evalf(1,contextptr);
		std::cout << "f1 vaut : " << f << std::endl;
		if (f.type==_REAL || f.type==_CPLX) {
	       		f=accurate_evalf(f,digits2bits(precision));
		}
		std::cout << "f2 vaut : " << f << std::endl;
		set_decimal_digits(save_decimal_digits,contextptr);
	} catch (std::runtime_error & erreur){
		std::cout << "erreur : " << erreur.what() << std::endl;
	}
	if (f.type==_INT_)
	{
		std::cout << "Resultat (int) : " << ((int)f.val) << std::endl;
	} else
	{
		if (f.type==_DOUBLE_)
		{			
			double arrondi=(double) f._DOUBLE_val;
			std::cout << "f3 vaut : " << f._DOUBLE_val << std::endl;
			std::cout << "Resultat (double) : " << arrondi << std::endl;
		} else
		{
			std::cout << "Resultat (string) : " << (f.print(contextptr).c_str()) << std::endl;
		}
	}
  }
}
voilà une sortie pour e :

Code : Tout sélectionner

Précision : 10
f1 vaut : undef
f2 vaut : undef
f3 vaut : nan
Resultat (double) : nan
Précision : 14
f1 vaut : undef
f2 vaut : undef
f3 vaut : nan
Resultat (double) : nan
Précision : 15
f1 vaut : 2.246527274524983
f2 vaut : 2.246527274524983
Resultat (string) : 2.246527274524983
Précision : 30
f1 vaut : 2.246527274524983608529120008571
f2 vaut : 2.246527274524983608529120008571
Resultat (string) : 2.246527274524983608529120008571
je ne sais pas si c'est un bug....
A+

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

Re: problème avec evalf

Message par parisse » jeu. sept. 23, 2010 7:07 am

salut!

c'est un probleme de depassement de capacite de l'exposant avec les flottants double precision. Le probleme a ete corrige pour les fractions, au moins dans la version 0.9.0 (ca te donnera une raison pour l'essayer! Une autre raison c'est que je suis en train d'ajouter le no de colonne pour les erreurs de syntaxe).

cdeval
Messages : 192
Inscription : mer. juin 03, 2009 4:28 pm

Re: problème avec evalf

Message par cdeval » jeu. sept. 23, 2010 12:42 pm

ok, pas de contournement possible avec la version 0.8.6 ?

Sinon, il faudra que je passe en 0.9 mais un peu plus tard parce que j'aurai 4 giac + 4 librairies CmathOOoCAS à recompiler (win, linux32, linux64, Mac) ! Heureusement que je prends des notes, je commence à m'y perdre dans mes procédures de compilation !
C'est pour quand giac en java ??? :wink:
A+

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

Re: problème avec evalf

Message par parisse » jeu. sept. 23, 2010 2:27 pm

cdeval a écrit :ok, pas de contournement possible avec la version 0.8.6 ?
il me semble que le code est le même dans les 2 versions pour ça, fonction gen::in_evalf de gen.cc pour le type _FRAC

Code : Tout sélectionner

    case _FRAC:
      if (decimal_digits(contextptr)<=14)
	evaled=set_precision(re(contextptr),60).evalf_double(1,contextptr)+cst_i*set_precision(im(contextptr),60).evalf_double(1,contextptr);
      else
	evaled=rdiv(_FRACptr->num.evalf(level,contextptr),_FRACptr->den.evalf(level,contextptr));
Sinon, il faudra que je passe en 0.9 mais un peu plus tard parce que j'aurai 4 giac + 4 librairies CmathOOoCAS à recompiler (win, linux32, linux64, Mac) ! Heureusement que je prends des notes, je commence à m'y perdre dans mes procédures de compilation !
Ben ça doit être pareil si tu modifies la version 0.8.6, il faut bien que tu recompiles non?
C'est pour quand giac en java ??? :wink:
A+
Bonne question! Avis aux amateurs, on cherche quelqu'un pour faire une interface java (JNI), qui pourrait servir sur les tablettes android par exemple.

cdeval
Messages : 192
Inscription : mer. juin 03, 2009 4:28 pm

Re: problème avec evalf

Message par cdeval » jeu. sept. 23, 2010 3:00 pm

oui, si je change le code de la 0.8.6 il faudra que je recompile mais je pensais à un contournement sans changer le source de giac.

Par exemple :

Code : Tout sélectionner

#include <giac/giac.h>

using namespace std;
using namespace giac;

    int main(){
	giac::context * contextptr=0;
        gen e(string("evalf(9631717858165541700861120341934764501872539500602240668502133917897071171725804147032015930692016857118865259542128270663026351989465804459497150730806708788996717069028347866535537958489549157278030509461823236068139941764848142997329666085306331424373287826639522352198217277776652110164034112785169087945366789364092034645108116971370093787779506091543138678325819385712548040908769281501922017104340435866213027383602492880677163848601143986823810888355204951133284784700627367711171131869840065597808710062406533575709057481300379329458072672761978538524180841291669597197327361967172656187481205511075715330310972319082978106741744502393111455828254680264847305528341142714274506299275696475445499370975290679145809004520356864464693637036463473561848887569997622710431769289612365511711188624846872876811347965394499274193847672908420643498966377153992172508282468676526295541054720131358725197168097864525542711655119346605878566366668241482910703389052065443188666008839692434552978187451675198471672897015668633110051220720864662526886812961415173062883394198709962183099199310215330433836629571930768328992124028952374017495384981141346189421923758816140117909750778715450167627022720966966049100437978634865518532181562075728868993970134403286992887079718282640393643125834526590066910572350966673042491952527305852273303541330595850584145771378580135416013322617865728157631589915567022438129876602204832276061611261986437118745756800093065872685810251179380151134141817995223766216067223549627427251638812838228475443024430514872648229394458381891534624925487099824630963332603794074364937486456827822272457855452396869956580061732914306490124155943430896882518519527272297414995790929116568237336253643998797354484131370894892894319805011659944927163162795588118528499350830609395463746772773929968957270011128367528352047651530485642828027215718559123637105779513602738765198920270518109962976602816563135325695662553802541052326215071592997332665550648213828978661468876924993119102310149434935846689046391407986536687049797278779528536976288617252870596337015483707992318637575470858344789475487568780642619337007832144429869732622188676478632987064533230784099081880463842878349418319610030166399057600473219443458661253465341476824268556716453716258420373666331738604870445183278576471686523796990164136472602309253406861548979847828773064202342186767876268797303154957534793415958323641727732785382206073740128973456927787480104393431642057945984898130420830079955152515992063631810076890218650139159375532388054271/4287380779831448005792968699576579265212644598075105124492022994550688748828517577183378620833800271376085380726024519374181069667726022516415200729582485609758413160507762667542495727406075077136961103924972961234990220110187756647195717941009540035165076753190440795486224824794731074064090858386570694754830671985919644350499031252576217548387399196952296446948545258967183456817801655684018405268448080126186526197200060199732826152414089897213528144150460844566676946404607381369062508964680015962797809814400384247357483897099535350584878170243383298284942806650791995359462226268227734450663629098162177920385447356357754199834608974459600045781877825560269672264139164741770309536509661092293628233094412839829295715538853983615894550004003829501702108236044796695909560564026903604203809585603347391682969115282644201926688226478293565495381707816077917423977675575623239429793753943781946802337913966663434939542490303694779192138505670512031753351954333040214490361689937608479248058069139528929124675860438913302618186394031279975992215195076104199082838457919128959649497763508963513872513847702932692353284661876689942027287580044822456437809023863759704709998907179495195563665019392812485679241283525388525505501246664104131701904226923200088545922571699340728017813509964869776997994695225518894170225436607117667394710237736598532537706400298611372319313743324876761398148229195783106588036154214811503378495681382235172060336146602580357128322507374099915682375153172070225610992630590943334092095676285533213355609937956500566482741216636478832249389771004759396800049040638763330678718905157227638544985157624640087671599040016497920216397046988279762183635079948680926797709350136632883650440668496509876555904082213782581983606595429019275733119601515287138138249977935903818575152144525578381729506160442547864378953153504522354451173408454110562512404287299915439968057889905791208945904113447299611090339412817425196584786665585718248660112153560875013029939562801298304379607351555902699107420491693903973772602812537236503198361745728094924472706277683388511530978102883123207792020011653536125048924693439622644088609939957445368714238597472039318240391382718051739474084893563309021959300639297739530066829357803537101710118490790159137174204649709876016462227034704457220721518009204741798907361990134919674719867689747539755606648804060900226233856949555386515152003825999774445623283563527432043871006572457231090744397751452704811193797565320790490534500403603418953804385831973605433306843314772770816,5)"),0);
	std::cout << "Résultat : " << eval(e,contextptr) << std::endl;
        return 0;
      }
fonctionne parfaitement.
Je pourrais utiliser cette méthode dans OOo en créant une chaine du genre "evalf(nombre,précision)" et l'évaluer ensuite. Ça m'emballe pas mais ça contournerait le problème non ?

cdeval
Messages : 192
Inscription : mer. juin 03, 2009 4:28 pm

Re: problème avec evalf

Message par cdeval » ven. sept. 24, 2010 12:03 pm

cdeval a écrit : Je pourrais utiliser cette méthode dans OOo en créant une chaine du genre "evalf(nombre,précision)" et l'évaluer ensuite. Ça m'emballe pas mais ça contournerait le problème non ?
j'ai changé mon code en suivant ce modèle et réglé le problème tout en restant avec giac 0.8.6
(je suis flemmard et puis quand je passerai en 0.9 il faudra que je fasse des tests pour m'assurer que tout ce que j'ai mis en place fonctionne (récupération du flux de la compilation d'une fonction par exemple : je cherche dans le flux certains mots-clés qui me permettent de récupérer le nom de la fonction, le nombre d'argument, etc... si des petites choses changent, il faudra que je revois mon code en OOoBasic.) Donc je me contente de régler les petits bugs par ci par là pour le moment...)
Mais j'y viendrai, c'est sûr. La partie gestion des erreurs de syntaxe m'intéresse. Je vais regarder dans xcas ce que tu as fait.
A+

Répondre