Annotation of OpenXM_contrib2/asir2000/include/interval.h, Revision 1.1
1.1 ! saito 1: /*
! 2: * $OpenXM: $
! 3: */
! 4: #ifndef _INTERVAL_H
! 5: #define _INTERVAL_H
! 6:
! 7: #define PRINTF_G 0
! 8: #define PRINTF_E 1
! 9:
! 10: #if defined(INTERVAL)
! 11:
! 12: #include <math.h>
! 13:
! 14: #ifdef sun
! 15: #if OSMajorVersion < 4 || (OSMajorVersion == 4 && OSMinorVersion < 1)
! 16: #include <sys/ieeefp.h>
! 17: #endif
! 18: #if defined(__svr4__)
! 19: #include <ieeefp.h>
! 20: #define FPNEAREST fpsetround(FP_RN);
! 21: #define FPPLUSINF fpsetround(FP_RP);
! 22: #define FPMINUSINF fpsetround(FP_RM);
! 23: #define FPTOZERO fpsetround(FP_RZ);
! 24: #else
! 25: static char *Interval_dummy;
! 26: #define FPNEAREST ieee_flags("clear", "direction", Interval_dummy, &Interval_dummy);
! 27: #define FPPLUSINF ieee_flags("set", "direction", "positive", &Interval_dummy);
! 28: #define FPMINUSINF ieee_flags("set", "direction", "negative", &Interval_dummy);
! 29: #define FPTOZERO ieee_flags("set", "direction", "tozero", &Interval_dummy);
! 30: #endif
! 31: #endif
! 32:
! 33: #ifdef linux
! 34: #include <fpu_control.h>
! 35: #define _FPU_DEFAULT_p_FPU_RC_UP 0x1b72
! 36: #define _FPU_DEFAULT_p_FPU_RC_DOWN 0x1772
! 37: #define _FPU_DEFAULT_p_FPU_RC_ZERO 0x1f72
! 38: #define FPNEAREST __setfpucw(_FPU_DEFAULT);
! 39: #define FPPLUSINF __setfpucw(_FPU_DEFAULT_p_FPU_RC_UP);
! 40: #define FPMINUSINF __setfpucw(_FPU_DEFAULT_p_FPU_RC_DOWN);
! 41: #define FPTOZERO __setfpucw(_FPU_DEFAULT_p_FPU_RC_ZERO);
! 42: #endif
! 43:
! 44: #if defined(__osf__)
! 45: #if 0
! 46: #include <float.h>
! 47: #define FPNEAREST write_rnd(FP_RND_RN);
! 48: #define FPPLUSINF write_rnd(FP_RND_RP);
! 49: #define FPMINUSINF write_rnd(FP_RND_RM);
! 50: #define FPTOZERO write_rnd(FP_RND_RZ);
! 51: #else
! 52: #define FPNEAREST
! 53: #define FPPLUSINF
! 54: #define FPMINUSINF
! 55: #define FPTOZERO
! 56: #endif
! 57: #endif
! 58:
! 59: #if defined(__FreeBSD__)
! 60: #include <floatingpoint.h>
! 61: #define FPNEAREST fpsetround(FP_RN);
! 62: #define FPPLUSINF fpsetround(FP_RP);
! 63: #define FPMINUSINF fpsetround(FP_RM);
! 64: #define FPTOZERO fpsetround(FP_RZ);
! 65: #endif
! 66:
! 67: /* no control function of floating point rounding */
! 68: #ifndef FPNEAREST
! 69: #define FPNEAREST fprintf(stderr, "Fpu control FPNEAREST is not supported in this machine yet.\n");
! 70: #endif
! 71: #ifndef FPMINUSINF
! 72: #define FPMINUSINF fprintf(stderr, "Fpu control FPMINUSINF is not supported in this machine yet.\n");
! 73: #endif
! 74: #ifndef FPPLUSINF
! 75: #define FPPLUSINF fprintf(stderr, "Fpu control FPPLUSINF is not supported in this machine yet.\n");
! 76: #endif
! 77: #ifndef FPTOZERO
! 78: #define FPTOZERO fprintf(stderr, "Fpu control FPZERO is not supported in this machine yet.\n");
! 79: #endif
! 80: #define FPCLEAR FPNEAREST
! 81:
! 82: #define MID_PRINTF_G 2
! 83: #define MID_PRINTF_E 3
! 84:
! 85: #undef N_C
! 86: #undef N_M
! 87: #undef N_LM
! 88: #undef N_GF2N
! 89: #undef N_GFPN
! 90: #define N_IP (N_B+1)
! 91: #define N_ID (N_B+2)
! 92: #define N_IT (N_B+3)
! 93: #define N_IF (N_B+4)
! 94: #define N_PRE_C N_IF
! 95: #define N_C (N_B+5)
! 96: #define N_M (N_B+6)
! 97: #define N_LM (N_B+7)
! 98: #define N_GF2N (N_B+8)
! 99: #define N_GFPN (N_B+9)
! 100:
! 101: /* data structures */
! 102: struct oItv {
! 103: short id;
! 104: char nid;
! 105: char pad;
! 106: Num inf;
! 107: Num sup;
! 108: };
! 109:
! 110: typedef struct oItv *Itv;
! 111:
! 112: struct oItvD {
! 113: short id;
! 114: char nid;
! 115: char pad;
! 116: double inf;
! 117: double sup;
! 118: };
! 119:
! 120: typedef struct oItvD *ItvD;
! 121:
! 122: struct oforth {
! 123: short sign;
! 124: short exp;
! 125: double u;
! 126: double l;
! 127: };
! 128:
! 129: typedef struct oforth *forth;
! 130:
! 131: struct oItvT {
! 132: short id;
! 133: char nid;
! 134: char pad;
! 135: forth inf;
! 136: forth sup;
! 137: };
! 138:
! 139: typedef struct oItvT *ItvT;
! 140:
! 141: struct oItvF {
! 142: short id;
! 143: char nid;
! 144: char pad;
! 145: BF inf;
! 146: BF sup;
! 147: };
! 148:
! 149: typedef struct oItvF *ItvF;
! 150:
! 151: extern int zerorewrite;
! 152:
! 153: /* general macros */
! 154: #define INF(p) ((p)->inf)
! 155: #define SUP(p) ((p)->sup)
! 156:
! 157: #define NEWItvP(q) ((q)=(Itv)MALLOC(sizeof(struct oItv)),\
! 158: OID(q)=O_N,NID(q)=N_IP)
! 159: #define NEWItvD(q) ((q)=(ItvD)MALLOC(sizeof(struct oItvD)),\
! 160: OID(q)=O_N,NID(q)=N_ID)
! 161: #define NEWItvT(q) ((q)=(ItvD)MALLOC(sizeof(struct oItvT)),\
! 162: OID(q)=O_N,NID(q)=N_IT)
! 163: #define NEWItvF(q) ((q)=(ItvF)MALLOC(sizeof(struct oItvF)),\
! 164: OID(q)=O_N,NID(q)=N_IF)
! 165: #define MKItvP(a,b,c) (NEWItvP(c),(INF(c)=(a),SUP(c)=(b)))
! 166: #define MKItvD(a,b,c) if((zerorewrite) && ((a)<=0.0) && ((b)>=0.0)) (c)=0;\
! 167: else (NEWItvD(c),(INF(c)=(a),SUP(c)=(b)))
! 168: #define MKItvT(a,b,c) (NEWItvT(c),(INF(c)=(a),SUP(c)=(b)))
! 169: #define MKItvF(a,b,c) (NEWItvF(c),(INF(c)=(a),SUP(c)=(b)))
! 170:
! 171: #define ToItvP(a,c) (NEWItvP(c),INF(c)=(a),SUP(c)=(a))
! 172: #define ToItvD(a,c) (NEWItvD(c),INF(c)=(ToReal(a)),SUP(c)=(ToReal(a)))
! 173: #define ToItvF(a,c) (NEWItvF(c),INF(c)=(a),SUP(c)=(a))
! 174:
! 175: #define ITVP(a) (NID(a)==N_IP)
! 176: #define ITVD(a) (NID(a)==N_ID)
! 177: #define ITVT(a) (NID(a)==N_IT)
! 178: #define ITVF(a) (NID(a)==N_IF)
! 179:
! 180: /*** engine/itv.c ***/
! 181: double ToRealSup(Num);
! 182: double ToRealInf(Num);
! 183: double RatnToRealUp(Q);
! 184: double NatToRealUp(N, int *);
! 185:
! 186: void double2bf(double, BF *);
! 187: double bf2double(BF);
! 188:
! 189: void itvtois(Itv, Num *, Num *);
! 190: void istoitv(Num, Num, Itv *);
! 191:
! 192: #if 0
! 193: void additv(Num, Num, Num *);
! 194: void subitv(Num, Num, Num *);
! 195: void mulitv(Num, Num, Num *);
! 196: int initv(Num, double);
! 197: int itvinitv(Itv, Itv);
! 198: void divitv(Num, Num, Num *);
! 199: void sqrtitv(Num, Num *);
! 200: void pwritv(Num, Num, Num *);
! 201: void pwritv0(Itv, int, Itv *);
! 202: void chsgnitv(Num, Num *);
! 203: void miditv(Itv, Num *);
! 204: int cmpitv(Itv, Itv);
! 205: void cupitv(Itv, Itv, Itv *);
! 206: void capitv(Itv, Itv, Itv *);
! 207: void widthitv(Itv, Num *);
! 208: void distanceitv(Itv, Itv, Num *);
! 209: #endif
! 210:
! 211: void additvp(Itv, Itv, Itv *);
! 212: void subitvp(Itv, Itv, Itv *);
! 213: void mulitvp(Itv, Itv, Itv *);
! 214: void divitvp(Itv, Itv, Itv *);
! 215: void chsgnitvp(Itv, Itv *);
! 216: int cmpitvp(Itv, Itv);
! 217: void pwritvp(Itv, Num, Itv *);
! 218: void pwritv0p(Itv, int, Itv *);
! 219: void cupitvp(Itv, Itv, Itv *);
! 220: void capitvp(Itv, Itv, Itv *);
! 221: void widthitvp(Itv, Num *);
! 222: void distanceitvp(Itv, Itv, Num *);
! 223:
! 224: void ToBf(Num, BF *);
! 225: void double2bf(double, BF *);
! 226: double bf2double(BF);
! 227: void addulp(ItvF, ItvF *);
! 228: void getulp(BF, BF *);
! 229:
! 230: void additvf(ItvF, ItvF, ItvF *);
! 231: void subitvf(ItvF, ItvF, ItvF *);
! 232: void mulitvf(ItvF, ItvF, ItvF *);
! 233: void divitvf(ItvF, ItvF, ItvF *);
! 234: void chsgnitvf(Itv, Itv *);
! 235: int cmpitvf(Itv, Itv);
! 236: void pwritvf(Itv, Num, Itv *);
! 237: void pwritv0f(Itv, int, Itv *);
! 238:
! 239: /*** engine/d-itv.c ***/
! 240: double ToRealDown(Num);
! 241: double ToRealUp(Num);
! 242: void Num2double(Num, double *, double *);
! 243:
! 244: void additvd(Num, Num, ItvD *);
! 245: void subitvd(Num, Num, ItvD *);
! 246: void mulitvd(Num, Num, ItvD *);
! 247: void divitvd(Num, Num, ItvD *);
! 248: void chsgnitvd(ItvD, ItvD *);
! 249: int cmpitvd(ItvD, ItvD);
! 250: void pwritvd(Num, Num, ItvD *);
! 251: void pwritv0d(ItvD, int, ItvD *);
! 252: void miditvd(ItvD, Num *);
! 253: void cupitvd(ItvD, ItvD, ItvD *);
! 254: void capitvd(ItvD, ItvD, ItvD *);
! 255: void widthitvd(ItvD, Num *);
! 256: void absitvd(ItvD, Num *);
! 257: void distanceitvd(ItvD, ItvD, Num *);
! 258:
! 259: #endif /* end of INTERVAL */
! 260: #endif /* end of _INTERVAL_H */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>