[BACK]Return to t-itv.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2018 / engine

Annotation of OpenXM_contrib2/asir2018/engine/t-itv.c, Revision 1.1

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

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>