Annotation of OpenXM_contrib2/asir2000/builtin/bfaux.c, Revision 1.4
1.4 ! noro 1: /* $OpenXM: OpenXM_contrib2/asir2000/builtin/bfaux.c,v 1.3 2015/08/05 01:23:02 noro Exp $ */
1.1 noro 2: #include "ca.h"
3: #include "parse.h"
4:
1.4 ! noro 5: void Peval(), Psetprec(), Psetbprec(), Ptodouble(), Psetround();
1.1 noro 6:
7: struct ftab bf_tab[] = {
8: {"eval",Peval,-2},
9: {"setprec",Psetprec,-1},
1.3 noro 10: {"setbprec",Psetbprec,-1},
1.4 ! noro 11: {"setround",Psetround,-1},
1.1 noro 12: {"todouble",Ptodouble,1},
13: {0,0,0},
14: };
15:
1.4 ! noro 16: int mpfr_roundmode = MPFR_RNDN;
! 17:
1.1 noro 18: void Ptodouble(NODE arg,Num *rp)
19: {
20: double r,i;
21: Real real,imag;
22: Num num;
23:
24: asir_assert(ARG0(arg),O_N,"todouble");
25: num = (Num)ARG0(arg);
26: if ( !num ) {
27: *rp = 0;
28: return;
29: }
30: switch ( NID(num) ) {
31: case N_R: case N_Q: case N_B:
32: r = ToReal(num);
33: MKReal(r,real);
34: *rp = (Num)real;
35: break;
36: case N_C:
37: r = ToReal(((C)num)->r);
38: i = ToReal(((C)num)->i);
39: MKReal(r,real);
40: MKReal(i,imag);
41: reimtocplx((Num)real,(Num)imag,rp);
42: break;
43: default:
44: *rp = num;
45: break;
46: }
47: }
48:
1.4 ! noro 49: void Peval(NODE arg,Obj *rp)
1.1 noro 50: {
51: int prec;
52:
53: asir_assert(ARG0(arg),O_R,"eval");
54: if ( argc(arg) == 2 ) {
1.3 noro 55: prec = QTOS((Q)ARG1(arg))*3.32193;
1.1 noro 56: if ( prec < MPFR_PREC_MIN ) prec = MPFR_PREC_MIN;
57: else if ( prec > MPFR_PREC_MAX ) prec = MPFR_PREC_MAX;
58: } else
59: prec = 0;
1.2 noro 60: evalr(CO,(Obj)ARG0(arg),prec,rp);
1.1 noro 61: }
62:
1.3 noro 63: /* set/get decimal precision */
1.1 noro 64:
65: void Psetprec(NODE arg,Obj *rp)
66: {
67: int p;
68: Q q;
1.3 noro 69: int prec,dprec;
70:
71: prec = mpfr_get_default_prec();
72: /* decimal precision */
73: dprec = prec*0.30103;
74: STOQ(dprec,q); *rp = (Obj)q;
75: if ( arg ) {
76: asir_assert(ARG0(arg),O_N,"setprec");
77: prec = QTOS((Q)ARG0(arg))*3.32193;
78: if ( p > 0 )
79: prec = p;
80: }
81: if ( prec < MPFR_PREC_MIN ) prec = MPFR_PREC_MIN;
82: else if ( prec > MPFR_PREC_MAX ) prec = MPFR_PREC_MAX;
83: mpfr_set_default_prec(prec);
84: }
1.1 noro 85:
1.3 noro 86: /* set/get bit precision */
1.1 noro 87:
1.3 noro 88: void Psetbprec(NODE arg,Obj *rp)
89: {
90: int p;
91: Q q;
92: int prec;
93:
94: prec = mpfr_get_default_prec();
95: STOQ(prec,q); *rp = (Obj)q;
1.1 noro 96: if ( arg ) {
1.3 noro 97: asir_assert(ARG0(arg),O_N,"setbprec");
98: prec = QTOS((Q)ARG0(arg));
1.1 noro 99: if ( p > 0 )
100: prec = p;
101: }
102: if ( prec < MPFR_PREC_MIN ) prec = MPFR_PREC_MIN;
103: else if ( prec > MPFR_PREC_MAX ) prec = MPFR_PREC_MAX;
104: mpfr_set_default_prec(prec);
105: }
106:
1.4 ! noro 107: void Psetround(NODE arg,Q *rp)
! 108: {
! 109: int round;
! 110:
! 111: STOQ(mpfr_roundmode,*rp);
! 112: if ( arg ) {
! 113: asir_assert(ARG0(arg),O_N,"setround");
! 114: round = QTOS((Q)ARG0(arg));
! 115: switch ( round ) {
! 116: case 0:
! 117: mpfr_roundmode = MPFR_RNDN;
! 118: break;
! 119: case 1:
! 120: mpfr_roundmode = MPFR_RNDZ;
! 121: break;
! 122: case 2:
! 123: mpfr_roundmode = MPFR_RNDU;
! 124: break;
! 125: case 3:
! 126: mpfr_roundmode = MPFR_RNDD;
! 127: break;
! 128: case 4:
! 129: mpfr_roundmode = MPFR_RNDA;
! 130: break;
! 131: case 5:
! 132: mpfr_roundmode = MPFR_RNDF;
! 133: break;
! 134: case 6:
! 135: mpfr_roundmode = MPFR_RNDNA;
! 136: break;
! 137: default:
! 138: error("setround : invalid rounding mode");
! 139: break;
! 140: }
! 141: }
! 142: }
! 143:
1.1 noro 144: Num tobf(Num a,int prec);
145:
146: void mp_pi(NODE arg,BF *rp)
147: {
148: int prec;
149: BF r;
150:
151: prec = arg ? QTOS((Q)ARG0(arg)) : 0;
152: NEWBF(r);
153: prec ? mpfr_init2(r->body,prec) : mpfr_init(r->body);
1.4 ! noro 154: mpfr_const_pi(r->body,mpfr_roundmode);
1.1 noro 155: *rp = r;
156: }
157:
158: void mp_e(NODE arg,BF *rp)
159: {
160: int prec;
161: mpfr_t one;
162: BF r;
163:
164: prec = arg ? QTOS((Q)ARG0(arg)) : 0;
165: NEWBF(r);
166: prec ? mpfr_init2(r->body,prec) : mpfr_init(r->body);
167: mpfr_init(one);
1.4 ! noro 168: mpfr_set_ui(one,1,mpfr_roundmode);
! 169: mpfr_exp(r->body,one,mpfr_roundmode);
1.1 noro 170: *rp = r;
171: }
172:
173: void mp_sin(NODE arg,BF *rp)
174: {
175: Num a;
176: int prec;
177: BF r;
178:
179: prec = NEXT(arg) ? QTOS((Q)ARG1(arg)) : 0;
180: a = tobf(ARG0(arg),prec);
181: NEWBF(r);
182: prec ? mpfr_init2(r->body,prec) : mpfr_init(r->body);
1.4 ! noro 183: mpfr_sin(r->body,((BF)a)->body,mpfr_roundmode);
1.1 noro 184: *rp = r;
185: }
186:
187: void mp_cos(NODE arg,BF *rp)
188: {
189: Num a;
190: int prec;
191: BF r;
192:
193: prec = NEXT(arg) ? QTOS((Q)ARG1(arg)) : 0;
194: a = tobf(ARG0(arg),prec);
195: NEWBF(r);
196: prec ? mpfr_init2(r->body,prec) : mpfr_init(r->body);
1.4 ! noro 197: mpfr_cos(r->body,((BF)a)->body,mpfr_roundmode);
1.1 noro 198: *rp = r;
199: }
200:
201: void mp_tan(NODE arg,BF *rp)
202: {
203: Num a;
204: int prec;
205: BF r;
206:
207: prec = NEXT(arg) ? QTOS((Q)ARG1(arg)) : 0;
208: a = tobf(ARG0(arg),prec);
209: NEWBF(r);
210: prec ? mpfr_init2(r->body,prec) : mpfr_init(r->body);
1.4 ! noro 211: mpfr_tan(r->body,((BF)a)->body,mpfr_roundmode);
1.1 noro 212: *rp = r;
213: }
214:
215: void mp_asin(NODE arg,BF *rp)
216: {
217: Num a;
218: int prec;
219: BF r;
220:
221: prec = NEXT(arg) ? QTOS((Q)ARG1(arg)) : 0;
222: a = tobf(ARG0(arg),prec);
223: NEWBF(r);
224: prec ? mpfr_init2(r->body,prec) : mpfr_init(r->body);
1.4 ! noro 225: mpfr_asin(r->body,((BF)a)->body,mpfr_roundmode);
1.1 noro 226: *rp = r;
227: }
228: void mp_acos(NODE arg,BF *rp)
229: {
230: Num a;
231: int prec;
232: BF r;
233:
234: prec = NEXT(arg) ? QTOS((Q)ARG1(arg)) : 0;
235: a = tobf(ARG0(arg),prec);
236: NEWBF(r);
237: prec ? mpfr_init2(r->body,prec) : mpfr_init(r->body);
1.4 ! noro 238: mpfr_acos(r->body,((BF)a)->body,mpfr_roundmode);
1.1 noro 239: *rp = r;
240: }
241: void mp_atan(NODE arg,BF *rp)
242: {
243: Num a;
244: int prec;
245: BF r;
246:
247: prec = NEXT(arg) ? QTOS((Q)ARG1(arg)) : 0;
248: a = tobf(ARG0(arg),prec);
249: NEWBF(r);
250: prec ? mpfr_init2(r->body,prec) : mpfr_init(r->body);
1.4 ! noro 251: mpfr_atan(r->body,((BF)a)->body,mpfr_roundmode);
1.1 noro 252: *rp = r;
253: }
254:
255: void mp_sinh(NODE arg,BF *rp)
256: {
257: Num a;
258: int prec;
259: BF r;
260:
261: prec = NEXT(arg) ? QTOS((Q)ARG1(arg)) : 0;
262: a = tobf(ARG0(arg),prec);
263: NEWBF(r);
264: prec ? mpfr_init2(r->body,prec) : mpfr_init(r->body);
1.4 ! noro 265: mpfr_sinh(r->body,((BF)a)->body,mpfr_roundmode);
1.1 noro 266: *rp = r;
267: }
268:
269: void mp_cosh(NODE arg,BF *rp)
270: {
271: Num a;
272: int prec;
273: BF r;
274:
275: prec = NEXT(arg) ? QTOS((Q)ARG1(arg)) : 0;
276: a = tobf(ARG0(arg),prec);
277: NEWBF(r);
278: prec ? mpfr_init2(r->body,prec) : mpfr_init(r->body);
1.4 ! noro 279: mpfr_cosh(r->body,((BF)a)->body,mpfr_roundmode);
1.1 noro 280: *rp = r;
281: }
282:
283: void mp_tanh(NODE arg,BF *rp)
284: {
285: Num a;
286: int prec;
287: BF r;
288:
289: prec = NEXT(arg) ? QTOS((Q)ARG1(arg)) : 0;
290: a = tobf(ARG0(arg),prec);
291: NEWBF(r);
292: prec ? mpfr_init2(r->body,prec) : mpfr_init(r->body);
1.4 ! noro 293: mpfr_tanh(r->body,((BF)a)->body,mpfr_roundmode);
1.1 noro 294: *rp = r;
295: }
296:
297: void mp_asinh(NODE arg,BF *rp)
298: {
299: Num a;
300: int prec;
301: BF r;
302:
303: prec = NEXT(arg) ? QTOS((Q)ARG1(arg)) : 0;
304: a = tobf(ARG0(arg),prec);
305: NEWBF(r);
306: prec ? mpfr_init2(r->body,prec) : mpfr_init(r->body);
1.4 ! noro 307: mpfr_asinh(r->body,((BF)a)->body,mpfr_roundmode);
1.1 noro 308: *rp = r;
309: }
310: void mp_acosh(NODE arg,BF *rp)
311: {
312: Num a;
313: int prec;
314: BF r;
315:
316: prec = NEXT(arg) ? QTOS((Q)ARG1(arg)) : 0;
317: a = tobf(ARG0(arg),prec);
318: NEWBF(r);
319: prec ? mpfr_init2(r->body,prec) : mpfr_init(r->body);
1.4 ! noro 320: mpfr_acosh(r->body,((BF)a)->body,mpfr_roundmode);
1.1 noro 321: *rp = r;
322: }
323: void mp_atanh(NODE arg,BF *rp)
324: {
325: Num a;
326: int prec;
327: BF r;
328:
329: prec = NEXT(arg) ? QTOS((Q)ARG1(arg)) : 0;
330: a = tobf(ARG0(arg),prec);
331: NEWBF(r);
332: prec ? mpfr_init2(r->body,prec) : mpfr_init(r->body);
1.4 ! noro 333: mpfr_atanh(r->body,((BF)a)->body,mpfr_roundmode);
1.1 noro 334: *rp = r;
335: }
336:
337: void mp_exp(NODE arg,BF *rp)
338: {
339: Num a;
340: int prec;
341: BF r;
342:
343: prec = NEXT(arg) ? QTOS((Q)ARG1(arg)) : 0;
344: a = tobf(ARG0(arg),prec);
345: NEWBF(r);
346: prec ? mpfr_init2(r->body,prec) : mpfr_init(r->body);
1.4 ! noro 347: mpfr_exp(r->body,((BF)a)->body,mpfr_roundmode);
1.1 noro 348: *rp = r;
349: }
350:
351: void mp_log(NODE arg,BF *rp)
352: {
353: Num a;
354: int prec;
355: BF r;
356:
357: prec = NEXT(arg) ? QTOS((Q)ARG1(arg)) : 0;
358: a = tobf(ARG0(arg),prec);
359: NEWBF(r);
360: prec ? mpfr_init2(r->body,prec) : mpfr_init(r->body);
1.4 ! noro 361: mpfr_log(r->body,((BF)a)->body,mpfr_roundmode);
1.1 noro 362: *rp = r;
363: }
364:
365: void mp_pow(NODE arg,BF *rp)
366: {
367: Num a,e;
368: int prec;
369: BF r;
370:
371: prec = NEXT(NEXT(arg)) ? QTOS((Q)ARG2(arg)) : 0;
372: a = tobf(ARG0(arg),prec);
373: e = tobf(ARG1(arg),prec);
374: NEWBF(r);
375: prec ? mpfr_init2(r->body,prec) : mpfr_init(r->body);
1.4 ! noro 376: mpfr_pow(r->body,((BF)a)->body,((BF)e)->body,mpfr_roundmode);
1.1 noro 377: *rp = r;
378: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>