=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/engine/p-itv.c,v retrieving revision 1.8 retrieving revision 1.11 diff -u -p -r1.8 -r1.11 --- OpenXM_contrib2/asir2000/engine/p-itv.c 2018/03/29 01:32:52 1.8 +++ OpenXM_contrib2/asir2000/engine/p-itv.c 2019/11/12 10:52:04 1.11 @@ -1,13 +1,20 @@ /* - * $OpenXM: OpenXM_contrib2/asir2000/engine/p-itv.c,v 1.7 2009/03/27 14:42:29 ohara Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/engine/p-itv.c,v 1.10 2019/11/07 08:47:35 kondoh Exp $ */ #if defined(INTERVAL) #include "ca.h" #include "base.h" +#if 0 #if defined(PARI) #include "genpari.h" #endif +#endif +// in engine/bf.c +Num tobf(Num,int); +//int initvp(Num , Itv ); + +extern int mpfr_roundmode; extern int zerorewrite; void itvtois(Itv a, Num *inf, Num *sup) @@ -16,6 +23,12 @@ void itvtois(Itv a, Num *inf, Num *sup) *inf = *sup = (Num)0; else if ( NID(a) <= N_B ) { *inf = (Num)a; *sup = (Num)a; + } else if ( ITVD(a) ) { + double dinf, dsup; + Real rinf, rsup; + dinf = INF((IntervalDouble)a); dsup = SUP((IntervalDouble)a); + MKReal(dinf, rinf); MKReal(dsup, rsup); + *inf = (Num)rinf; *sup = (Num)rsup; } else { *inf = INF(a); *sup = SUP(a); @@ -24,52 +37,61 @@ void itvtois(Itv a, Num *inf, Num *sup) void istoitv(Num inf, Num sup, Itv *rp) { - Num i, s; + Num ii, ss; + Num ni, ns; Itv c; int type=0; + int current_roundmode; if ( !inf && !sup ) { *rp = 0; return; } - if ( !sup ) { - s = 0; + if ( compnum(0,sup,inf) >= 0 ) { + ns = sup; ni = inf; + } else { + ni = sup; ns = inf; } - else if ( NID( sup )==N_B ) { + + current_roundmode = mpfr_roundmode; + if ( !ns ) { + ss = 0; + } + else if ( NID( ns )==N_B ) { type = 1; - ToBf(sup, (BF *)&s); + + mpfr_roundmode = MPFR_RNDU; + ss = tobf(ns, DEFAULTPREC); + //ToBf(sup, (BF *)&s); } else { - s = sup; + ss = ns; } - if ( !inf ) { - i = 0; + if ( !ni ) { + ii = 0; } - else if ( NID( inf )==N_B ) { + else if ( NID( ni )==N_B ) { type = 1; - ToBf(inf, (BF *)&i); + + mpfr_roundmode = MPFR_RNDD; + ii = tobf(ni, DEFAULTPREC); + //ToBf(inf, (BF *)&i); } else { - i = inf; + ii = ni; } - if ( type ) { -// NEWIntervalBigFloat((IntervalBigFloat)c); - c=MALLOC(sizeof(struct oIntervalBigFloat)); - OID(c)=O_N; - NID(c)=N_IntervalBigFloat; - } else - NEWItvP(c); + mpfr_roundmode = current_roundmode; - if ( compnum(0,i,s) >= 0 ) { - INF(c) = s; SUP(c) = i; + if ( type ) { + IntervalBigFloat cc; + NEWIntervalBigFloat(cc); + c = (Itv)cc; } else { - INF(c) = i; SUP(c) = s; + NEWItvP(c); } + INF(c) = ii; SUP(c) = ss; - if (zerorewrite) - if ( initvp(0,c) ) { - *rp = 0; - return; - } *rp = c; + + ZEROREWRITE } void additvp(Itv a, Itv b, Itv *c) @@ -442,6 +464,28 @@ void absitvp(Itv a, Num *b) else *b = bs; } } + +void absintvalp(Itv a, Itv *c) +{ + Num ai,as,mai; + Num inf,sup; + + itvtois(a,&ai,&as); + if ( compnum(0,as,0 ) < 0 ) { + chsgnnum(ai, &sup); + chsgnnum(as, &inf); + } else if ( compnum(0,ai,0) < 0 ) { + inf = 0; + chsgnnum(ai, &mai); + if ( compnum(0,as,mai ) > 0 ) sup = as; + else sup = mai; + } else { + inf = ai; + sup = as; + } + istoitv(inf,sup,c); +} + void distanceitvp(Itv a, Itv b, Num *c) {