| 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]
`