Annotation of OpenXM_contrib2/asir2000/engine/f-itv.c, Revision 1.10
1.1 saito 1: /*
1.10 ! kondoh 2: * $OpenXM: OpenXM_contrib2/asir2000/engine/f-itv.c,v 1.9 2019/06/04 07:11:22 kondoh Exp $
1.1 saito 3: */
4: #if defined(INTERVAL)
5: #include "ca.h"
6: #include "base.h"
1.9 kondoh 7: #if 0
1.3 ohara 8: #if defined(PARI)
1.1 saito 9: #include "genpari.h"
10: #include "itv-pari.h"
1.7 ohara 11: long get_pariprec();
1.1 saito 12: #endif
13:
14: void ToBf(Num a, BF *rp)
15: {
1.8 noro 16: GEN pa, pb, pc;
17: BF bn, bd;
18: BF c;
19: long ltop, lbot;
20:
21: if ( ! a ) {
22: *rp = 0;
23: }
24: else switch ( NID(a) ) {
25: case N_Q:
26: ltop = avma;
27: ritopa_i(NM((Q)a), SGN((Q)a), &pa);
28: pb = cgetr(get_pariprec());
29: mpaff(pa, pb);
30: if ( INT((Q)a) ) {
31: lbot = avma;
32: pb = gerepile(ltop, lbot, pb);
33: patori(pb, &c);
34: cgiv(pb);
35: *rp = c;
36: } else {
37: patori(pb, &bn);
38: ritopa_i(DN((Q)a), 1, &pa);
39: pb = cgetr(get_pariprec());
40: mpaff(pa, pb);
41: lbot = avma;
42: pb = gerepile(ltop, lbot, pb);
43: patori(pb, &bd);
44: cgiv(pb);
45: divbf((Num)bn,(Num)bd, (Num *)&c);
46: *rp = c;
47: }
48: break;
49: case N_R:
50: pb = dbltor(BDY((Real)a));
51: patori(pb, &c);
52: cgiv(pb);
53: *rp = c;
54: break;
55: case N_B:
56: *rp = (BF)a;
57: break;
58: default:
59: error("ToBf : not implemented");
60: break;
61: }
1.1 saito 62: }
63:
64: void double2bf(double d, BF *rp)
65: {
1.8 noro 66: GEN p;
1.1 saito 67:
1.8 noro 68: p = dbltor(d);
69: patori(p, rp);
70: cgiv(p);
1.1 saito 71: }
72:
1.8 noro 73: double bf2double(BF a)
1.1 saito 74: {
1.8 noro 75: GEN p;
1.1 saito 76:
1.8 noro 77: ritopa(a, &p);
78: return rtodbl(p);
1.1 saito 79: }
80:
81: void getulp(BF a, BF *au)
82: {
1.8 noro 83: GEN b, c;
84: long lb, i;
1.1 saito 85:
1.8 noro 86: ritopa(a, &b);
87: lb = lg(b);
88: c = cgetr(lb);
89: c[1] = b[1];
90: for (i=2;i<lb-1;i++) c[i] = 0;
91: c[i] = 1;
92: setsigne(c, 1);
93: patori(c,au);
94: cgiv(c);
95: cgiv(b);
1.1 saito 96: }
97:
1.2 kondoh 98: void addulp(IntervalBigFloat a, IntervalBigFloat *c)
1.1 saito 99: {
1.8 noro 100: Num ai, as, aiu, asu, inf, sup;
1.1 saito 101:
1.8 noro 102: itvtois((Itv)a,&ai,&as);
103: if ( ai ) {
104: getulp((BF)ai, (BF *)&aiu);
105: subbf(ai,aiu,&inf);
106: } else inf = ai;
107: if ( as ) {
108: getulp((BF)as, (BF *)&asu);
109: addbf(as,asu,&sup);
110: } else sup = as;
111: istoitv(inf,sup, (Itv *)c);
1.1 saito 112: }
1.9 kondoh 113: #endif
114:
115: // in builtin/bfaux.c
116: extern int mpfr_roundmode;
117:
118: // in engine/bf.c
119: Num tobf(Num,int);
120:
121: #define BFPREC(a) (((BF)(a))->body->_mpfr_prec)
1.1 saito 122:
1.10 ! kondoh 123: double mpfr2dblDown(mpfr_t a)
! 124: {
! 125: return mpfr_get_d(a,MPFR_RNDD);
! 126: }
! 127:
! 128: double mpfr2dblUp(mpfr_t a)
! 129: {
! 130: return mpfr_get_d(a,MPFR_RNDU);
! 131: }
! 132:
! 133:
! 134: void toInterval(Num a, int prec, int type, Num *rp)
! 135: {
! 136: if ( ! a ) {
! 137: *rp = 0;
! 138: } else if (type == EvalIntervalDouble) {
! 139: if (NID(a)==N_C) {
! 140: double inf,sup;
! 141: C z;
! 142: IntervalDouble re, im;
! 143:
! 144: if ( ! ((C)a)->r ) {
! 145: re = 0;
! 146: } else {
! 147: inf = toRealDown(((C)a)->r);
! 148: sup = toRealUp(((C)a)->r);
! 149: MKIntervalDouble(inf,sup,re);
! 150: }
! 151: if ( ! ((C)a)->i ) {
! 152: im = 0;
! 153: } else {
! 154: inf = toRealDown(((C)a)->i);
! 155: sup = toRealUp(((C)a)->i);
! 156: MKIntervalDouble(inf,sup,im);
! 157: }
! 158: if ( !re && !im )
! 159: z = 0;
! 160: else
! 161: reimtocplx((Num)re,(Num)im,(Num *)&z);
! 162: *rp = (Num)z;
! 163: } else {
! 164: double inf,sup;
! 165: IntervalDouble c;
! 166:
! 167: inf = toRealDown(a);
! 168: sup = toRealUp(a);
! 169:
! 170: MKIntervalDouble(inf,sup,c);
! 171: *rp = (Num) c;
! 172: }
! 173: } else if (type == EvalIntervalBigFloat) {
! 174: if (NID(a)==N_C) {
! 175: Num ai,as;
! 176: Num inf,sup;
! 177: C z;
! 178: IntervalBigFloat re, im;
! 179: int current_roundmode;
! 180:
! 181: current_roundmode = mpfr_roundmode;
! 182:
! 183: if ( ! ((C)a)->r )
! 184: re = 0;
! 185: else {
! 186: itvtois((Itv)((C)a)->r,&ai,&as);
! 187: mpfr_roundmode = MPFR_RNDD;
! 188: inf = tobf(ai, prec);
! 189: mpfr_roundmode = MPFR_RNDU;
! 190: sup = tobf(as, prec);
! 191: istoitv(inf,sup,(Itv *)&re);
! 192: }
! 193:
! 194: if ( ! ((C)a)->i )
! 195: im = 0;
! 196: else {
! 197: itvtois((Itv)((C)a)->i,&ai,&as);
! 198: mpfr_roundmode = MPFR_RNDD;
! 199: inf = tobf(ai, prec);
! 200: mpfr_roundmode = MPFR_RNDU;
! 201: sup = tobf(as, prec);
! 202: istoitv(inf,sup,(Itv *)&im);
! 203: }
! 204:
! 205: mpfr_roundmode = current_roundmode;
! 206: reimtocplx((Num)re,(Num)im,(Num *)&z);
! 207: *rp = (Num)z;
! 208: } else {
! 209: Num ai,as;
! 210: Num inf,sup;
! 211: IntervalBigFloat c;
! 212: int current_roundmode;
! 213:
! 214: itvtois((Itv)a,&ai,&as);
! 215:
! 216: current_roundmode = mpfr_roundmode;
! 217: mpfr_roundmode = MPFR_RNDD;
! 218: inf = tobf(ai, prec);
! 219: mpfr_roundmode = MPFR_RNDU;
! 220: sup = tobf(as, prec);
! 221: istoitv(inf,sup,(Itv *)&c);
! 222: mpfr_roundmode = current_roundmode;
! 223: *rp = (Num) c;
! 224: }
! 225: } else {
! 226: error("toInterval: not supported types.");
! 227: *rp = 0;
! 228: }
! 229: }
! 230:
1.9 kondoh 231:
232: void additvf(IntervalBigFloat a, IntervalBigFloat b, IntervalBigFloat *rp)
1.1 saito 233: {
1.9 kondoh 234: Num ai,as,bi,bs;
235: IntervalBigFloat c;
236: //,mas,mbs;
237: //,tmp;
1.8 noro 238: Num inf,sup;
1.9 kondoh 239: //GEN pa, pb, z;
240: //long ltop, lbot;
241: int current_roundmode;
1.8 noro 242:
243: if ( !a )
1.9 kondoh 244: *rp = b;
1.8 noro 245: else if ( !b )
1.9 kondoh 246: *rp = a;
1.8 noro 247: else if ( (NID(a) <= N_B) && (NID(b) <= N_B ) )
1.9 kondoh 248: addnum(0,(Num)a,(Num)b,(Num *)rp);
1.8 noro 249: else {
1.9 kondoh 250: itvtois((Itv)a,&ai,&as);
251: itvtois((Itv)b,&bi,&bs);
252:
253: current_roundmode = mpfr_roundmode;
254:
255: mpfr_roundmode = MPFR_RNDD;
256: ai = tobf(ai, DEFAULTPREC);
257: bi = tobf(bi, DEFAULTPREC);
258: //addnum(0,ai,bi,&inf);
259: addbf(ai,bi,&inf);
260:
261: mpfr_roundmode = MPFR_RNDU;
262: as = tobf(as, DEFAULTPREC);
263: bs = tobf(bs, DEFAULTPREC);
264: //addnum(0,as,bs,&sup);
265: addbf(as,bs,&sup);
266:
267: istoitv(inf,sup,(Itv *)&c);
268: mpfr_roundmode = current_roundmode;
269: //MKIntervalBigFloat((BF)inf, (BF)sup, c);
270: *rp = c;
1.1 saito 271: #if 0
272: printexpr(CO, ai);
273: printexpr(CO, as);
274: printexpr(CO, bi);
275: printexpr(CO, bs);
276: #endif
1.8 noro 277: return;
278: }
1.1 saito 279: }
280:
1.9 kondoh 281: void subitvf(IntervalBigFloat a, IntervalBigFloat b, IntervalBigFloat *rp)
1.1 saito 282: {
1.9 kondoh 283: Num ai,as,bi,bs;
284: IntervalBigFloat c;
285: //,mas, mbs;
286: Num inf,sup;
287: //,tmp;
288: //GEN pa, pb, z;
289: //long ltop, lbot;
290: int current_roundmode;
1.8 noro 291:
292: if ( !a )
1.9 kondoh 293: chsgnnum((Num)b,(Num *)rp);
1.8 noro 294: else if ( !b )
1.9 kondoh 295: *rp = a;
296: else if ( (NID(a) < N_IntervalBigFloat) && (NID(b) < N_IntervalBigFloat ) )
297: subnum(0,(Num)a,(Num)b,(Num *)rp);
1.8 noro 298: else {
1.9 kondoh 299: itvtois((Itv)a,&ai,&as);
300: itvtois((Itv)b,&bi,&bs);
301:
302: current_roundmode = mpfr_roundmode;
303:
304: mpfr_roundmode = MPFR_RNDD;
305: ai = tobf(ai, DEFAULTPREC);
306: bi = tobf(bi, DEFAULTPREC);
307:
308: mpfr_roundmode = MPFR_RNDU;
309: as = tobf(as, DEFAULTPREC);
310: bs = tobf(bs, DEFAULTPREC);
311: //subnum(0,as,bi,&sup);
312: subbf(as,bi,&sup);
313:
314: mpfr_roundmode = MPFR_RNDD;
315: //subnum(0,ai,bs,&inf);
316: subbf(ai,bs,&inf);
317:
318: istoitv(inf,sup,(Itv *)&c);
319: mpfr_roundmode = current_roundmode;
320: //MKIntervalBigFloat((BF)inf, (BF)sup, c);
321: *rp = c;
322:
323: //addulp((IntervalBigFloat)tmp, c);
1.8 noro 324: }
1.1 saito 325: }
326:
1.2 kondoh 327: void mulitvf(IntervalBigFloat a, IntervalBigFloat b, IntervalBigFloat *c)
1.1 saito 328: {
1.8 noro 329: Num ai,as,bi,bs,a1,a2,b1,b2,c1,c2,p,t,tmp;
330: Num inf, sup;
331: int ba,bb;
1.9 kondoh 332: int current_roundmode;
1.8 noro 333:
334: if ( !a || !b )
335: *c = 0;
336: else if ( (NID(a) <= N_B) && (NID(b) <= N_B ) )
337: mulnum(0,(Num)a,(Num)b,(Num *)c);
338: else {
1.9 kondoh 339: itvtois((Itv)a,&ai,&as);
340: itvtois((Itv)b,&bi,&bs);
341:
342: current_roundmode = mpfr_roundmode;
343:
344: mpfr_roundmode = MPFR_RNDU;
345: as = tobf(as, DEFAULTPREC);
346: bs = tobf(bs, DEFAULTPREC);
347:
348: mpfr_roundmode = MPFR_RNDD;
349: ai = tobf(ai, DEFAULTPREC);
350: bi = tobf(bi, DEFAULTPREC);
351:
352: // itvtois((Itv)a,&inf,&sup);
353: // ToBf(inf, (BF *)&ai); ToBf(sup, (BF *)&as);
354: // itvtois((Itv)b,&inf,&sup);
355: // ToBf(inf, (BF *)&bi); ToBf(sup, (BF *)&bs);
1.8 noro 356:
357: /* MUST check if ai, as, bi, bs are bigfloat. */
358: chsgnnum(as,&a2);
359: chsgnnum(bs,&b2);
360:
361:
362: if ( ba = (compnum(0,0,a2) > 0) ) {
363: a1 = ai;
364: } else {
365: a1 = a2;
366: a2 = ai;
367: }
368: if ( bb = (compnum(0,0,b2) > 0) ) {
369: b1 = bi;
370: } else {
371: b1 = b2;
372: b2 = bi;
373: }
374: mulnum(0,a2,b2,&t);
375: subnum(0,0,t,&c2);
376: if ( compnum(0,0,b1) > 0 ) {
377: mulnum(0,a2,b1,&t);
378: subnum(0,0,t,&c1);
379: if ( compnum(0,0,a1) > 0 ) {
380: mulnum(0,a1,b2,&t);
381: subnum(0,0,t,&p);
382: if ( compnum(0,c1,p) > 0 ) c1 = p;
383: mulnum(0,a1,b1,&t);
384: subnum(0,0,t,&p);
385: if ( compnum(0,c2,p) > 0 ) c2 = p;
386: }
387: } else {
388: if ( compnum(0,0,a1) > 0 ) {
389: mulnum(0,a1,b2,&t);
390: subnum(0,0,t,&c1);
391: } else {
392: mulnum(0,a1,b1,&c1);
393: }
394: }
395: if ( ba == bb ) {
396: subnum(0,0,c2,&t);
1.9 kondoh 397: istoitv(c1,t,(Itv *)c);
1.8 noro 398: } else {
399: subnum(0,0,c1,&t);
1.9 kondoh 400: istoitv(c2,t,(Itv *)c);
1.8 noro 401: }
1.9 kondoh 402: //addulp((IntervalBigFloat)tmp, c);
1.8 noro 403: }
1.9 kondoh 404: mpfr_roundmode = current_roundmode;
1.1 saito 405: }
406:
407: int initvf(Num a, Itv b)
408: {
1.8 noro 409: Num inf, sup;
1.1 saito 410:
1.8 noro 411: itvtois(b, &inf, &sup);
412: if ( compnum(0,inf,a) > 0 ) return 0;
413: else if ( compnum(0,a,sup) > 0 ) return 0;
414: else return 1;
1.1 saito 415: }
416:
417: int itvinitvf(Itv a, Itv b)
418: {
1.8 noro 419: Num ai,as,bi,bs;
1.1 saito 420:
1.8 noro 421: itvtois(a, &ai, &as);
422: itvtois(b, &bi, &bs);
423: if ( compnum(0,ai,bi) >= 0 && compnum(0,bs,as) >= 0 ) return 1;
424: else return 0;
1.1 saito 425: }
426:
1.2 kondoh 427: void divitvf(IntervalBigFloat a, IntervalBigFloat b, IntervalBigFloat *c)
1.1 saito 428: {
1.8 noro 429: Num ai,as,bi,bs,a1,a2,b1,b2,c1,c2,t,tmp;
430: Num inf, sup;
431: int ba,bb;
1.9 kondoh 432: int current_roundmode;
1.8 noro 433:
434: if ( !b )
435: error("divitv : division by 0");
436: else if ( !a )
437: *c = 0;
438: else if ( (NID(a) <= N_B) && (NID(b) <= N_B ) )
439: divnum(0,(Num)a,(Num)b,(Num *)c);
440: else {
1.9 kondoh 441: itvtois((Itv)a,&ai,&as);
442: itvtois((Itv)b,&bi,&bs);
443:
444: current_roundmode = mpfr_roundmode;
445:
446: mpfr_roundmode = MPFR_RNDU;
447: as = tobf(as, DEFAULTPREC);
448: bs = tobf(bs, DEFAULTPREC);
449:
450: mpfr_roundmode = MPFR_RNDD;
451: ai = tobf(ai, DEFAULTPREC);
452: bi = tobf(bi, DEFAULTPREC);
453:
454: // itvtois((Itv)a,&inf,&sup);
455: // ToBf(inf, (BF *)&ai); ToBf(sup, (BF *)&as);
456: // itvtois((Itv)b,&inf,&sup);
457: // ToBf(inf, (BF *)&bi); ToBf(sup, (BF *)&bs);
1.1 saito 458: /* MUST check if ai, as, bi, bs are bigfloat. */
1.8 noro 459: chsgnnum(as,&a2);
460: chsgnnum(bs,&b2);
461: if ( ba = (compnum(0,0,a2) > 0) ) {
462: a1 = ai;
463: } else {
464: a1 = a2;
465: a2 = ai;
466: }
467: if ( bb = (compnum(0,0,b2) > 0) ) {
468: b1 = bi;
469: } else {
470: b1 = b2;
471: b2 = bi;
472: }
473: if ( compnum(0,0,b1) >= 0 ) {
474: error("divitv : division by interval including 0.");
475: } else {
476: divnum(0,a2,b1,&c2);
477: if ( compnum(0,0,a1) > 0 ) {
478: divnum(0,a1,b1,&c1);
479: } else {
480: divnum(0,a1,b2,&t);
481: subnum(0,0,t,&c1);
482: }
483: }
484: if ( ba == bb ) {
485: subnum(0,0,c2,&t);
1.9 kondoh 486: istoitv(c1,t,(Itv *)c);
1.8 noro 487: } else {
488: subnum(0,0,c1,&t);
1.9 kondoh 489: istoitv(c2,t,(Itv *)c);
1.8 noro 490: }
1.9 kondoh 491: //addulp((IntervalBigFloat)tmp, c);
1.8 noro 492: }
1.9 kondoh 493: mpfr_roundmode = current_roundmode;
1.1 saito 494: }
495:
496: void pwritvf(Itv a, Num e, Itv *c)
497: {
1.8 noro 498: int ei;
499: Itv t;
1.1 saito 500:
1.8 noro 501: if ( !e )
502: *c = (Itv)ONE;
503: else if ( !a )
504: *c = 0;
505: else if ( NID(a) <= N_B )
506: pwrnum(0,(Num)a,e,(Num *)c);
507: else if ( !INT(e) ) {
1.3 ohara 508: #if defined(PARI) && 0
1.8 noro 509: gpui_ri((Obj)a,(Obj)c,(Obj *)c);
1.1 saito 510: #else
1.9 kondoh 511: error("pwritvf() : can't calculate a fractional power");
1.1 saito 512: #endif
1.8 noro 513: } else {
514: ei = QTOS((Q)e);
1.9 kondoh 515: if (ei<0) ei = -ei;
1.8 noro 516: pwritv0f(a,ei,&t);
517: if ( SGN((Q)e) < 0 )
1.9 kondoh 518: divitvf((IntervalBigFloat)ONE,(IntervalBigFloat)t,(IntervalBigFloat *)c); /* bug ?? */
1.8 noro 519: else
520: *c = t;
521: }
1.1 saito 522: }
523:
524: void pwritv0f(Itv a, int e, Itv *c)
525: {
1.8 noro 526: Num inf, sup;
527: Num ai,Xmin,Xmax;
528: IntervalBigFloat tmp;
529: Q ne;
1.9 kondoh 530: int current_roundmode;
1.8 noro 531:
532: if ( e == 1 )
533: *c = a;
534: else {
535: STOQ(e,ne);
536: if ( !(e%2) ) {
537: if ( initvp(0,a) ) {
538: Xmin = 0;
539: chsgnnum(INF(a),&ai);
540: if ( compnum(0,ai,SUP(a)) > 0 ) {
541: Xmax = ai;
542: } else {
543: Xmax = SUP(a);
544: }
545: } else {
546: if ( compnum(0,INF(a),0) > 0 ) {
547: Xmin = INF(a);
548: Xmax = SUP(a);
549: } else {
550: Xmin = SUP(a);
551: Xmax = INF(a);
552: }
553: }
554: } else {
555: Xmin = INF(a);
556: Xmax = SUP(a);
557: }
1.9 kondoh 558:
559: current_roundmode = mpfr_roundmode;
1.8 noro 560: if ( ! Xmin ) inf = 0;
1.9 kondoh 561: else {
562: mpfr_roundmode = MPFR_RNDD;
563: pwrbf(Xmin,(Num)ne,&inf);
564: }
1.8 noro 565: if ( ! Xmax ) sup = 0;
1.9 kondoh 566: else {
567: mpfr_roundmode = MPFR_RNDU;
568: pwrbf(Xmax,(Num)ne,&sup);
569: }
1.8 noro 570: istoitv(inf,sup,(Itv *)&tmp);
1.9 kondoh 571: mpfr_roundmode = current_roundmode;
572: *c = (Itv)tmp;
573: // addulp(tmp, (IntervalBigFloat *)c);
1.8 noro 574: }
1.1 saito 575: }
576:
1.9 kondoh 577: void chsgnitvf(IntervalBigFloat a, IntervalBigFloat *rp)
1.1 saito 578: {
1.8 noro 579: Num inf,sup;
1.9 kondoh 580: IntervalBigFloat c;
581: int current_roundmode;
1.1 saito 582:
1.8 noro 583: if ( !a )
1.9 kondoh 584: *rp = 0;
585: else if ( NID(a) < N_IntervalBigFloat )
586: chsgnnum((Num)a,(Num *)rp);
1.8 noro 587: else {
1.9 kondoh 588: current_roundmode = mpfr_roundmode;
589:
590: mpfr_roundmode = MPFR_RNDU;
591: chsgnnum((Num)INF(a),&sup);
592: mpfr_roundmode = MPFR_RNDD;
593: chsgnnum((Num)SUP(a),&inf);
594: //MKIntervalBigFloat((BF)inf,(BF)sup,c);
595: istoitv(inf,sup,(Itv *)&c);
596: *rp = c;
597: mpfr_roundmode = current_roundmode;
1.8 noro 598: }
1.1 saito 599: }
600:
601: int cmpitvf(Itv a, Itv b)
602: {
1.8 noro 603: Num ai,as,bi,bs;
604: int s,t;
1.1 saito 605:
1.8 noro 606: if ( !a ) {
607: if ( !b || (NID(b)<=N_B) ) {
608: return compnum(0,(Num)a,(Num)b);
609: } else {
610: itvtois(b,&bi,&bs);
611: if ( compnum(0,(Num)a,bs) > 0 ) return 1;
612: else if ( compnum(0,bi,(Num)a) > 0 ) return -1;
613: else return 0;
614: }
615: } else if ( !b ) {
616: if ( !a || (NID(a)<=N_B) ) {
617: return compnum(0,(Num)a,(Num)b);
618: } else {
619: itvtois(a,&ai,&as);
620: if ( compnum(0,ai,(Num)b) > 0 ) return 1;
621: else if ( compnum(0,(Num)b,as) > 0 ) return -1;
622: else return 0;
623: }
624: } else {
625: itvtois(a,&ai,&as);
626: itvtois(b,&bi,&bs);
627: s = compnum(0,ai,bs) ;
628: t = compnum(0,bi,as) ;
629: if ( s > 0 ) return 1;
630: else if ( t > 0 ) return -1;
631: else return 0;
632: }
1.1 saito 633: }
634:
635: void miditvf(Itv a, Num *b)
636: {
1.8 noro 637: Num ai,as;
638: Num t;
1.1 saito 639:
1.8 noro 640: if ( ! a ) *b = 0;
641: else if ( (NID(a) <= N_B) )
642: *b = (Num)a;
643: else {
644: STOQ(2,TWO);
645: itvtois(a,&ai,&as);
646: addbf(ai,as,&t);
647: divbf(t,(Num)TWO,b);
648: }
1.1 saito 649: }
650:
651: void cupitvf(Itv a, Itv b, Itv *c)
652: {
1.8 noro 653: Num ai,as,bi,bs;
654: Num inf,sup;
1.1 saito 655:
1.8 noro 656: itvtois(a,&ai,&as);
657: itvtois(b,&bi,&bs);
658: if ( compnum(0,ai,bi) > 0 ) inf = bi;
659: else inf = ai;
660: if ( compnum(0,as,bs) > 0 ) sup = as;
661: else sup = bs;
662: istoitv(inf,sup,c);
1.1 saito 663: }
664:
665: void capitvf(Itv a, Itv b, Itv *c)
666: {
1.8 noro 667: Num ai,as,bi,bs;
668: Num inf,sup;
1.1 saito 669:
1.8 noro 670: itvtois(a,&ai,&as);
671: itvtois(b,&bi,&bs);
672: if ( compnum(0,ai,bi) > 0 ) inf = ai;
673: else inf = bi;
674: if ( compnum(0,as,bs) > 0 ) sup = bs;
675: else sup = as;
676: if ( compnum(0,inf,sup) > 0 ) *c = 0;
677: else istoitv(inf,sup,c);
1.1 saito 678: }
679:
680:
681: void widthitvf(Itv a, Num *b)
682: {
1.8 noro 683: Num ai,as;
1.1 saito 684:
1.8 noro 685: if ( ! a ) *b = 0;
686: else if ( (NID(a) <= N_B) )
687: *b = (Num)a;
688: else {
689: itvtois(a,&ai,&as);
690: subnum(0,as,ai,b);
691: }
1.1 saito 692: }
693:
694: void absitvf(Itv a, Num *b)
695: {
1.8 noro 696: Num ai,as,bi,bs;
1.1 saito 697:
1.8 noro 698: if ( ! a ) *b = 0;
699: else if ( (NID(a) <= N_B) ) {
700: if ( compnum(0,(Num)a,0) < 0 ) chsgnnum((Num)a,b);
701: else *b = (Num)a;
702: } else {
703: itvtois(a,&ai,&as);
704: if ( compnum(0,ai,0) < 0 ) chsgnnum(ai,&bi);
705: else bi = ai;
706: if ( compnum(0,as,0) < 0 ) chsgnnum(as,&bs);
707: else bs = as;
708: if ( compnum(0,bi,bs) > 0 ) *b = bi;
709: else *b = bs;
710: }
1.1 saito 711: }
712:
713: void distanceitvf(Itv a, Itv b, Num *c)
714: {
1.8 noro 715: Num ai,as,bi,bs;
716: Num di,ds;
717: Itv d;
718:
719: itvtois(a,&ai,&as);
720: itvtois(b,&bi,&bs);
721: subnum(0,ai,bi,&di);
722: subnum(0,as,bs,&ds);
723: istoitv(di,ds,&d);
724: absitvf(d,c);
1.1 saito 725: }
726:
727: #endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>