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);
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;
}
}
}
}
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
A+