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

```