=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/builtin/bfaux.c,v retrieving revision 1.12 retrieving revision 1.14 diff -u -p -r1.12 -r1.14 --- OpenXM_contrib2/asir2000/builtin/bfaux.c 2016/03/14 04:15:05 1.12 +++ OpenXM_contrib2/asir2000/builtin/bfaux.c 2017/03/29 01:15:14 1.14 @@ -1,4 +1,4 @@ -/* $OpenXM: OpenXM_contrib2/asir2000/builtin/bfaux.c,v 1.11 2015/08/25 18:41:03 ohara Exp $ */ +/* $OpenXM: OpenXM_contrib2/asir2000/builtin/bfaux.c,v 1.13 2017/03/09 00:46:44 noro Exp $ */ #include "ca.h" #include "parse.h" @@ -11,6 +11,9 @@ void Pmpfr_y0(), Pmpfr_y1(); void Pmpfr_gamma(), Pmpfr_lngamma(), Pmpfr_digamma(); void Pmpfr_floor(), Pmpfr_round(), Pmpfr_ceil(); void Prk_ratmat(); +void mp_sin(),mp_cos(),mp_tan(),mp_asin(),mp_acos(),mp_atan(); +void mp_sinh(),mp_cosh(),mp_tanh(),mp_asinh(),mp_acosh(),mp_atanh(); +void mp_exp(),mp_log(),mp_pow(); struct ftab bf_tab[] = { {"eval",Peval,-2}, @@ -18,6 +21,21 @@ struct ftab bf_tab[] = { {"setbprec",Psetbprec,-1}, {"setround",Psetround,-1}, {"todouble",Ptodouble,1}, + {"mpfr_sin",mp_sin,-2}, + {"mpfr_cos",mp_cos,-2}, + {"mpfr_tan",mp_tan,-2}, + {"mpfr_asin",mp_asin,-2}, + {"mpfr_acos",mp_acos,-2}, + {"mpfr_atan",mp_atan,-2}, + {"mpfr_sinh",mp_sinh,-2}, + {"mpfr_cosh",mp_cosh,-2}, + {"mpfr_tanh",mp_tanh,-2}, + {"mpfr_asinh",mp_asinh,-2}, + {"mpfr_acosh",mp_acosh,-2}, + {"mpfr_atanh",mp_atanh,-2}, + {"mpfr_exp",mp_exp,-2}, + {"mpfr_log",mp_log,-2}, + {"mpfr_pow",mp_pow,-3}, {"mpfr_ai",Pmpfr_ai,-2}, {"mpfr_zeta",Pmpfr_zeta,-2}, {"mpfr_j0",Pmpfr_j0,-2}, @@ -624,9 +642,9 @@ void Prk_ratmat(NODE arg,LIST *rp) n = fv->len; d = mat->len; - num = (struct smat *)MALLOC(n*sizeof(struct smat)); + num = (struct smat *)MALLOC(d*sizeof(struct smat)); for ( i = 0; i < d; i++ ) { - num[i].rlen = (int *)MALLOC(n*sizeof(int)); + num[i].rlen = (int *)MALLOC_ATOMIC(n*sizeof(int)); num[i].row = (struct jv **)MALLOC(n*sizeof(struct jv *)); mati = (MAT)mat->body[i]; b = (Obj **)mati->body; @@ -634,24 +652,28 @@ void Prk_ratmat(NODE arg,LIST *rp) for ( len = k = 0; k < n; k++ ) if ( b[j][k] ) len++; num[i].rlen[j] = len; - num[i].row[j] = (struct jv *)MALLOC(len*sizeof(struct jv)); - for ( s = k = 0; k < n; k++ ) - if ( b[j][k] ) { - num[i].row[j][s].j = k; - num[i].row[j][s].v = ToReal((Num)b[j][k]); - s++; - } + if ( !len ) + num[i].row[j] = 0; + else { + num[i].row[j] = (struct jv *)MALLOC_ATOMIC((len)*sizeof(struct jv)); + for ( s = k = 0; k < n; k++ ) + if ( b[j][k] ) { + num[i].row[j][s].j = k; + num[i].row[j][s].v = ToReal((Num)b[j][k]); + s++; + } + } } } - f = (double *)MALLOC(n*sizeof(double)); + f = (double *)MALLOC_ATOMIC(n*sizeof(double)); for ( j = 0; j < n; j++ ) f[j] = ToReal((Num)fv->body[j]); - w = (double *)MALLOC(n*sizeof(double)); - k1 = (double *)MALLOC(n*sizeof(double)); - k2 = (double *)MALLOC(n*sizeof(double)); - k3 = (double *)MALLOC(n*sizeof(double)); - k4 = (double *)MALLOC(n*sizeof(double)); - k5 = (double *)MALLOC(n*sizeof(double)); + w = (double *)MALLOC_ATOMIC(n*sizeof(double)); + k1 = (double *)MALLOC_ATOMIC(n*sizeof(double)); + k2 = (double *)MALLOC_ATOMIC(n*sizeof(double)); + k3 = (double *)MALLOC_ATOMIC(n*sizeof(double)); + k4 = (double *)MALLOC_ATOMIC(n*sizeof(double)); + k5 = (double *)MALLOC_ATOMIC(n*sizeof(double)); k6 = (double *)MALLOC(n*sizeof(double)); nd = 0; switch ( ord ) {