Annotation of OpenXM_contrib2/asir2000/engine/p-itv.c, Revision 1.5
1.1 saito 1: /*
1.5 ! saito 2: * $OpenXM: OpenXM_contrib2/asir2000/engine/p-itv.c,v 1.4 2003/07/25 12:34:48 kondoh Exp $
1.1 saito 3: */
4: #if defined(INTERVAL)
5: #include "ca.h"
6: #include "base.h"
1.3 ohara 7: #if defined(PARI)
1.1 saito 8: #include "genpari.h"
9: #endif
10:
11: extern int zerorewrite;
12:
13: void itvtois(Itv a, Num *inf, Num *sup)
14: {
15: if ( !a )
16: *inf = *sup = (Num)0;
17: else if ( NID(a) <= N_B ) {
18: *inf = (Num)a; *sup = (Num)a;
19: } else {
20: *inf = INF(a);
21: *sup = SUP(a);
22: }
23: }
24:
25: void istoitv(Num inf, Num sup, Itv *rp)
26: {
27: Num i, s;
28: Itv c;
29: int type=0;
30:
31: if ( !inf && !sup ) {
32: *rp = 0;
33: return;
34: }
35: if ( !sup ) {
36: s = 0;
37: }
38: else if ( NID( sup )==N_B ) {
39: type = 1;
40: ToBf(sup, (BF *)&s);
41: } else {
42: s = sup;
43: }
44: if ( !inf ) {
45: i = 0;
46: }
47: else if ( NID( inf )==N_B ) {
48: type = 1;
49: ToBf(inf, (BF *)&i);
50: } else {
51: i = inf;
52: }
53: if ( type )
1.2 kondoh 54: NEWIntervalBigFloat((IntervalBigFloat)c);
1.1 saito 55: else
56: NEWItvP(c);
57:
58: if ( compnum(0,i,s) >= 0 ) {
59: INF(c) = s; SUP(c) = i;
60: } else {
61: INF(c) = i; SUP(c) = s;
62: }
63:
64: if (zerorewrite)
65: if ( initvp(0,c) ) {
66: *rp = 0;
67: return;
68: }
69: *rp = c;
70: }
71:
72: void additvp(Itv a, Itv b, Itv *c)
73: {
74: Num ai,as,bi,bs;
75: Num inf,sup;
76:
77: if ( !a )
78: *c = b;
79: else if ( !b )
80: *c = a;
81: else if ( (NID(a) <= N_B) && (NID(b) <= N_B ) )
82: addnum(0,(Num)a,(Num)b,(Num *)c);
83: else if ( (NID(a) == N_IP) && (NID(b) == N_R )
84: ||(NID(a) == N_R ) && (NID(b) == N_IP) )
1.2 kondoh 85: additvd((Num)a,(Num)b,(IntervalDouble *)c);
1.1 saito 86: else {
87: itvtois(a,&ai,&as);
88: itvtois(b,&bi,&bs);
89: addnum(0,ai,bi,&inf);
90: addnum(0,as,bs,&sup);
91: istoitv(inf,sup,c);
92: }
93: }
94:
95: void subitvp(Itv a, Itv b, Itv *c)
96: {
97: Num ai,as,bi,bs;
98: Num inf,sup;
99:
100: if ( !a )
101: chsgnnum((Num)b,(Num *)c);
102: else if ( !b )
103: *c = a;
104: else if ( (NID(a) <= N_B) && (NID(b) <= N_B ) )
105: subnum(0,(Num)a,(Num)b,(Num *)c);
106: else if ( (NID(a) == N_IP) && (NID(b) == N_R )
107: ||(NID(a) == N_R ) && (NID(b) == N_IP) )
1.2 kondoh 108: subitvd((Num)a,(Num)b,(IntervalDouble *)c);
1.1 saito 109: else {
110: itvtois(a,&ai,&as);
111: itvtois(b,&bi,&bs);
112: subnum(0,ai,bs,&inf);
113: subnum(0,as,bi,&sup);
114: istoitv(inf,sup,c);
115: }
116: }
117:
118: void mulitvp(Itv a, Itv b, Itv *c)
119: {
120: Num ai,as,bi,bs,a1,a2,b1,b2,c1,c2,p,t;
121: int ba,bb;
122:
123: if ( !a || !b )
124: *c = 0;
125: else if ( (NID(a) <= N_B) && (NID(b) <= N_B ) )
126: mulnum(0,(Num)a,(Num)b,(Num *)c);
127: else if ( (NID(a) == N_IP) && (NID(b) == N_R )
128: ||(NID(a) == N_R ) && (NID(b) == N_IP) )
1.2 kondoh 129: mulitvd((Num)a,(Num)b,(IntervalDouble *)c);
1.1 saito 130: else {
131: itvtois(a,&ai,&as);
132: itvtois(b,&bi,&bs);
133: chsgnnum(as,&a2);
134: chsgnnum(bs,&b2);
135: if ( ba = (compnum(0,0,a2) > 0) ) {
136: a1 = ai;
137: } else {
138: a1 = a2;
139: a2 = ai;
140: }
141: if ( bb = (compnum(0,0,b2) > 0) ) {
142: b1 = bi;
143: } else {
144: b1 = b2;
145: b2 = bi;
146: }
147: mulnum(0,a2,b2,&t);
148: subnum(0,0,t,&c2);
149: if ( compnum(0,0,b1) > 0 ) {
150: mulnum(0,a2,b1,&t);
151: subnum(0,0,t,&c1);
152: if ( compnum(0,0,a1) > 0 ) {
153: mulnum(0,a1,b2,&t);
154: subnum(0,0,t,&p);
155: if ( compnum(0,c1,p) > 0 ) c1 = p;
156: mulnum(0,a1,b1,&t);
157: subnum(0,0,t,&p);
158: if ( compnum(0,c2,p) > 0 ) c2 = p;
159: }
160: } else {
161: if ( compnum(0,0,a1) > 0 ) {
162: mulnum(0,a1,b2,&t);
163: subnum(0,0,t,&c1);
164: } else {
165: mulnum(0,a1,b1,&c1);
166: }
167: }
168: if ( ba == bb ) {
169: subnum(0,0,c2,&t);
170: istoitv(c1,t,c);
171: } else {
172: subnum(0,0,c1,&t);
173: istoitv(c2,t,c);
174: }
175: }
176: }
177:
178: int initvp(Num a, Itv b)
179: {
180: Num inf, sup;
181:
182: itvtois(b, &inf, &sup);
183: if ( compnum(0,inf,a) > 0 ) return 0;
184: else if ( compnum(0,a,sup) > 0 ) return 0;
185: else return 1;
186: }
187:
188: int itvinitvp(Itv a, Itv b)
189: {
190: Num ai,as,bi,bs;
191:
192: itvtois(a, &ai, &as);
193: itvtois(b, &bi, &bs);
194: if ( compnum(0,ai,bi) >= 0 && compnum(0,bs,as) >= 0 ) return 1;
195: else return 0;
196: }
197:
198: void divitvp(Itv a, Itv b, Itv *c)
199: {
200: Num ai,as,bi,bs,a1,a2,b1,b2,c1,c2,t;
201: int ba,bb;
202:
203: if ( !b )
204: error("divitv : division by 0");
205: else if ( !a )
206: *c = 0;
207: else if ( (NID(a) <= N_B) && (NID(b) <= N_B ) )
208: divnum(0,(Num)a,(Num)b,(Num *)c);
209: else if ( (NID(a) == N_IP) && (NID(b) == N_R )
210: ||(NID(a) == N_R ) && (NID(b) == N_IP) )
1.2 kondoh 211: divitvd((Num)a,(Num)b,(IntervalDouble *)c);
1.1 saito 212: else {
213: itvtois(a,&ai,&as);
214: itvtois(b,&bi,&bs);
215: chsgnnum(as,&a2);
216: chsgnnum(bs,&b2);
217: if ( ba = (compnum(0,0,a2) > 0) ) {
218: a1 = ai;
219: } else {
220: a1 = a2;
221: a2 = ai;
222: }
223: if ( bb = (compnum(0,0,b2) > 0) ) {
224: b1 = bi;
225: } else {
226: b1 = b2;
227: b2 = bi;
228: }
229: if ( compnum(0,0,b1) >= 0 ) {
230: error("divitv : division by interval including 0.");
231: } else {
232: divnum(0,a2,b1,&c2);
233: if ( compnum(0,0,a1) > 0 ) {
234: divnum(0,a1,b1,&c1);
235: } else {
236: divnum(0,a1,b2,&t);
237: subnum(0,0,t,&c1);
238: }
239: }
240: if ( ba == bb ) {
241: subnum(0,0,c2,&t);
242: istoitv(c1,t,c);
243: } else {
244: subnum(0,0,c1,&t);
245: istoitv(c2,t,c);
246: }
247: }
248: }
249:
250: void pwritvp(Itv a, Num e, Itv *c)
251: {
252: int ei;
253: Itv t;
254:
255: if ( !e )
256: *c = (Itv)ONE;
257: else if ( !a )
258: *c = 0;
259: else if ( NID(a) <= N_B )
260: pwrnum(0,(Num)a,(Num)e,(Num *)c);
261: else if ( !INT(e) ) {
1.3 ohara 262: #if defined(PARI) && 0
1.1 saito 263: GEN pa,pe,z;
264: int ltop,lbot;
265:
266: ltop = avma; ritopa(a,&pa); ritopa(e,&pe); lbot = avma;
267: z = gerepile(ltop,lbot,gpui(pa,pe,prec));
268: patori(z,c); cgiv(z);
269: #else
270: error("pwritv : can't calculate a fractional power");
271: #endif
272: } else {
273: ei = QTOS((Q)e);
274: pwritv0p(a,ei,&t);
275: if ( SGN((Q)e) < 0 )
276: divnum(0,(Num)ONE,(Num)t,(Num *)c);
277: else
278: *c = t;
279: }
280: }
281:
282: void pwritv0p(Itv a, int e, Itv *c)
283: {
284: Num inf, sup;
285: Num ai,Xmin,Xmax;
286: Q ne;
287:
288: if ( e == 1 )
289: *c = a;
290: else {
291: STOQ(e,ne);
292: if ( !(e%2) ) {
293: if ( initvp(0,a) ) {
294: Xmin = 0;
295: chsgnnum(INF(a),&ai);
296: if ( compnum(0,ai,SUP(a)) > 0 ) {
297: Xmax = ai;
298: } else {
299: Xmax = SUP(a);
300: }
301: } else {
302: if ( compnum(0,INF(a),0) > 0 ) {
303: Xmin = INF(a);
304: Xmax = SUP(a);
305: } else {
306: Xmin = SUP(a);
307: Xmax = INF(a);
308: }
309: }
310: } else {
311: Xmin = INF(a);
312: Xmax = SUP(a);
313: }
314: if ( ! Xmin ) inf = 0;
315: else pwrnum(0,Xmin,(Num)ne,&inf);
316: pwrnum(0,Xmax,(Num)ne,&sup);
317: istoitv(inf,sup,c);
318: }
319: }
320:
321: void chsgnitvp(Itv a, Itv *c)
322: {
323: Num inf,sup;
324:
325: if ( !a )
326: *c = 0;
327: else if ( NID(a) <= N_B )
328: chsgnnum((Num)a,(Num *)c);
329: else {
330: chsgnnum(INF((Itv)a),&inf);
331: chsgnnum(SUP((Itv)a),&sup);
332: istoitv(inf,sup,c);
333: }
334: }
335:
336: int cmpitvp(Itv a, Itv b)
337: {
338: Num ai,as,bi,bs;
339: int s,t;
340:
341: if ( !a ) {
1.4 kondoh 342: if ( !b || (NID(b)<=N_B) ) {
1.1 saito 343: return compnum(0,(Num)a,(Num)b);
1.4 kondoh 344: } else {
345: itvtois(b,&bi,&bs);
346: if ( compnum(0,(Num)a,bs) > 0 ) return 1;
347: else if ( compnum(0,bi,(Num)a) > 0 ) return -1;
348: else return 0;
349: }
1.1 saito 350: } else if ( !b ) {
1.4 kondoh 351: if ( !a || (NID(a)<=N_B) ) {
1.1 saito 352: return compnum(0,(Num)a,(Num)b);
1.4 kondoh 353: } else {
354: itvtois(a,&ai,&as);
355: if ( compnum(0,ai,(Num)b) > 0 ) return 1;
356: else if ( compnum(0,(Num)b,as) > 0 ) return -1;
357: else return 0;
358: }
1.1 saito 359: } else {
360: itvtois(a,&ai,&as);
361: itvtois(b,&bi,&bs);
1.2 kondoh 362: s = compnum(0,ai,bs) ;
363: t = compnum(0,bi,as) ;
364: if ( s > 0 ) return 1;
365: else if ( t > 0 ) return -1;
366: else return 0;
1.1 saito 367: }
368: }
369:
370: void miditvp(Itv a, Num *b)
371: {
372: Num ai,as;
373: Num t;
374:
375: if ( ! a ) *b = 0;
376: else if ( (NID(a) <= N_B) )
377: *b = (Num)a;
378: else {
379: STOQ(2,TWO);
380: itvtois(a,&ai,&as);
381: addnum(0,ai,as,&t);
382: divnum(0,t,(Num)TWO,b);
383: }
384: }
385:
386: void cupitvp(Itv a, Itv b, Itv *c)
387: {
388: Num ai,as,bi,bs;
389: Num inf,sup;
390:
391: itvtois(a,&ai,&as);
392: itvtois(b,&bi,&bs);
393: if ( compnum(0,ai,bi) > 0 ) inf = bi;
394: else inf = ai;
395: if ( compnum(0,as,bs) > 0 ) sup = as;
396: else sup = bs;
397: istoitv(inf,sup,c);
398: }
399:
400: void capitvp(Itv a, Itv b, Itv *c)
401: {
402: Num ai,as,bi,bs;
403: Num inf,sup;
404:
405: itvtois(a,&ai,&as);
406: itvtois(b,&bi,&bs);
407: if ( compnum(0,ai,bi) > 0 ) inf = ai;
408: else inf = bi;
409: if ( compnum(0,as,bs) > 0 ) sup = bs;
410: else sup = as;
411: if ( compnum(0,inf,sup) > 0 ) *c = 0;
412: else istoitv(inf,sup,c);
413: }
414:
415:
416: void widthitvp(Itv a, Num *b)
417: {
418: Num ai,as;
419:
420: if ( ! a ) *b = 0;
421: else if ( (NID(a) <= N_B) )
422: *b = (Num)a;
423: else {
424: itvtois(a,&ai,&as);
425: subnum(0,as,ai,b);
426: }
427: }
428:
429: void absitvp(Itv a, Num *b)
430: {
431: Num ai,as,bi,bs;
432:
433: if ( ! a ) *b = 0;
434: else if ( (NID(a) <= N_B) ) {
435: if ( compnum(0,(Num)a,0) < 0 ) chsgnnum((Num)a,b);
436: else *b = (Num)a;
437: } else {
438: itvtois(a,&ai,&as);
439: if ( compnum(0,ai,0) < 0 ) chsgnnum(ai,&bi);
440: else bi = ai;
441: if ( compnum(0,as,0) < 0 ) chsgnnum(as,&bs);
442: else bs = as;
443: if ( compnum(0,bi,bs) > 0 ) *b = bi;
444: else *b = bs;
445: }
446: }
447:
448: void distanceitvp(Itv a, Itv b, Num *c)
449: {
450: Num ai,as,bi,bs;
451: Num di,ds;
452: Itv d;
453:
454: itvtois(a,&ai,&as);
455: itvtois(b,&bi,&bs);
456: subnum(0,ai,bi,&di);
457: subnum(0,as,bs,&ds);
458: istoitv(di,ds,&d);
459: absitvp(d,c);
460: }
461:
462: #endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>