Karim Belabas on Fri, 10 Oct 2014 07:43:20 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: experimental localprec() feature |
* Loïc Grenié [2014-10-09 22:41]: > 2014-10-09 17:37 GMT+02:00 Bill Allombert <Bill.Allombert@math.u-bordeaux.fr>: >> I have created an experimental git branch bill-localprec that adds a command >> localprec() which allow to set the real precision locally: >> >> Consider the function: >> f(s)=Pi^s >> and >> s=precision(1.,100) >> >> Pi is computed using the current precision. >> If we want the resut to be correct to the precision of s, >> we could do >> >> g(s)= >> { my(prec=default(realprecision)); >> default(realprecision,precision(s)); >> my(r=Pi^s); >> default(realprecision,prec); >> r; >> } >> >> which is rather cumbersome. Using localprec() it is sufficient to say: >> >> g(s)=localprec(precision(s));Pi^s >> >> Also it is safer since the value of realprecision is restored even if an >> error occurs. > > Nice! Thanks! That's something that I have dreamed for a long time. BTW, some precisions: 1) as Bill's original save/restore example suggests, it is really a 'localprec' with the semantics of 'local' (dynamic scoping); not a 'myprec' with the semantics of 'my' (lexical scoping). I.e. \p38 g()=Pi; f()=localprec(100);g(s); Then f() does compute Pi with 100 decimals, even though the call to 'Pi' itself occurs outside of the body of f. Note that \p38 g=Pi; f()=localprec(100);g; returns a result with 38 decimals of accuracy since g in that case is a constant that was previously computed and not a function evaluated when f() is called, while localprec is in effect. 2) 'realprecision' itself is unaffected by localprec settings ? localprec(100);default(realprecision); %1 = 38 Conversely, changing 'realprecision' from within a localprec() scope is a local no-op. The new accuracy is overriden by localprec settings in that scope: ? \p100 ? localprec(57); default(realprecision,38); precision(Pi) %2 = 57 It does become the new default precision, of course ? default(realprecision) %3 = 38 Thus one should no longer change default(realprecision,) in new scripts: it will interact with localprec() in confusing ways. This changes for the better: 'realprecision' becomes a true global "default" corresponding to user's preferences in a given context. Cheers, K.B. -- Karim Belabas, IMB (UMR 5251) Tel: (+33) (0)5 40 00 26 17 Universite de Bordeaux Fax: (+33) (0)5 40 00 69 50 351, cours de la Liberation http://www.math.u-bordeaux1.fr/~kbelabas/ F-33405 Talence (France) http://pari.math.u-bordeaux1.fr/ [PARI/GP] `