=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2018/builtin/parif.c,v retrieving revision 1.3 retrieving revision 1.5 diff -u -p -r1.3 -r1.5 --- OpenXM_contrib2/asir2018/builtin/parif.c 2019/05/07 02:09:50 1.3 +++ OpenXM_contrib2/asir2018/builtin/parif.c 2020/11/10 04:48:49 1.5 @@ -1,4 +1,4 @@ -/* $OpenXM: OpenXM_contrib2/asir2018/builtin/parif.c,v 1.2 2018/09/28 08:20:27 noro Exp $ */ +/* $OpenXM: OpenXM_contrib2/asir2018/builtin/parif.c,v 1.4 2020/08/26 06:40:36 noro Exp $ */ #include "ca.h" #include "parse.h" #include "ox.h" @@ -20,10 +20,13 @@ void Pmpfr_floor(), Pmpfr_round(), Pmpfr_ceil(); void Pox_shutdown(NODE arg,Q *rp); void Pox_launch_nox(NODE arg,Obj *rp); +void Pox_launch(NODE arg,Obj *rp); void Pox_push_cmo(NODE arg,Obj *rp); void Pox_pop_cmo(NODE arg,Obj *rp); void Pox_execute_function(NODE arg,Obj *rp); +int debug_pari; + struct mpfr_tab_rec { char *name; mpfr_func func; @@ -107,9 +110,28 @@ void reset_ox_pari() } } +void pari_setprec(long n) +{ + struct oFUNC f; + Z z; + NODE arg; + + f.name = f.fullname = "pari_setprec"; + f.id = A_PARI; + f.argc = 1; + f.f.binf = 0; + STOZ(n,z); + arg = mknode(1,z); + evalparif(&f,arg); +} + +/* decimal precision */ +long mpfrprec = 0; + pointer evalparif(FUNC f,NODE arg) { - int ac,intarg,opt,prec; + long prec; + int ac,intarg,opt; Q q,r,cmd; Z narg; Real sec; @@ -139,7 +161,10 @@ pointer evalparif(FUNC f,NODE arg) #if !defined(VISUAL) MKSTR(name,"ox_pari"); nd = mknode(2,NULL,name); - Pox_launch_nox(nd,(Obj *)&r); + if ( debug_pari ) + Pox_launch(nd,(Obj *)&r); + else + Pox_launch_nox(nd,(Obj *)&r); #else error("Please load names.rr from latest asir-contrib library before using pari functions."); #endif @@ -148,6 +173,11 @@ pointer evalparif(FUNC f,NODE arg) ox_pari_stream_initialized = 1; } + prec = mpfr_get_default_prec()*0.30103+1; + if ( prec != mpfrprec ) { + mpfrprec = prec; + pari_setprec(prec); + } ac = argc(arg); /* reverse the arg list */ for ( n = arg, t = 0; n; n = NEXT(n) ) {