[BACK]Return to round.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2000 / builtin

Annotation of OpenXM_contrib2/asir2000/builtin/round.c, Revision 1.4

1.4     ! saito       1: /* $OpenXM: OpenXM_contrib2/asir2000/builtin/round.c,v 1.3 2003/12/02 07:00:12 noro Exp $ */
1.2       noro        2:
1.4     ! saito       3: #undef INTERVAL
1.1       noro        4: #define INTERVAL
                      5: #include "ca.h"
                      6: #include "parse.h"
                      7: #include "interval.h"
                      8:
                      9: void Padd_pinf(),Padd_minf();
                     10: void Psub_pinf(),Psub_minf();
                     11: void Pmul_pinf(),Pmul_minf();
                     12: void Pdiv_pinf(),Pdiv_minf();
                     13:
                     14: struct ftab round_tab[] = {
                     15:        {"add_pinf",Padd_pinf,2},
                     16:        {"add_minf",Padd_minf,2},
                     17:        {"sub_pinf",Psub_pinf,2},
                     18:        {"sub_minf",Psub_minf,2},
                     19:        {"mul_pinf",Pmul_pinf,2},
                     20:        {"mul_minf",Pmul_minf,2},
                     21:        {"div_pinf",Pdiv_pinf,2},
                     22:        {"div_minf",Pdiv_minf,2},
                     23:        {0,0,0},
                     24: };
                     25:
                     26: void Padd_pinf(NODE arg,Real *rp)
                     27: {
                     28:        Real a,b,r;
                     29:        double c;
                     30:
                     31:        a = (Real)ARG0(arg);
                     32:        b = (Real)ARG1(arg);
                     33:        if ( !a )
                     34:                *rp = b;
                     35:        else if ( !b )
                     36:                *rp = a;
1.3       noro       37:        else if ( NID(a) != N_R || NID(b) != N_R )
                     38:                error("add_pinf : invalid argument");
1.1       noro       39:        else {
                     40:                FPPLUSINF
                     41:                c = BDY(a)+BDY(b);
                     42:                FPNEAREST
                     43:                MKReal(c,r);
                     44:                *rp = r;
                     45:        }
                     46: }
                     47:
                     48: void Padd_minf(NODE arg,Real *rp)
                     49: {
                     50:        Real a,b,r;
                     51:        double c;
                     52:
                     53:        a = (Real)ARG0(arg);
                     54:        b = (Real)ARG1(arg);
                     55:        if ( !a )
                     56:                *rp = b;
                     57:        else if ( !b )
                     58:                *rp = a;
1.3       noro       59:        else if ( NID(a) != N_R || NID(b) != N_R )
                     60:                error("add_pinf : invalid argument");
1.1       noro       61:        else {
                     62:                FPMINUSINF
                     63:                c = BDY(a)+BDY(b);
                     64:                FPNEAREST
                     65:                MKReal(c,r);
                     66:                *rp = r;
                     67:        }
                     68: }
                     69:
                     70: void Psub_pinf(NODE arg,Real *rp)
                     71: {
                     72:        Real a,b,r;
                     73:        double c;
                     74:
                     75:        a = (Real)ARG0(arg);
                     76:        b = (Real)ARG1(arg);
                     77:        if ( !a ) {
                     78:                if ( !b )
                     79:                        *rp = 0;
                     80:                else {
                     81:                        c = -BDY(b);
                     82:                        MKReal(c,r);
                     83:                        *rp = r;
                     84:                }
                     85:        } else if ( !b )
                     86:                *rp = a;
1.3       noro       87:        else if ( NID(a) != N_R || NID(b) != N_R )
                     88:                error("sub_pinf : invalid argument");
1.1       noro       89:        else {
                     90:                FPPLUSINF
                     91:                c = BDY(a)-BDY(b);
                     92:                FPNEAREST
                     93:                MKReal(c,r);
                     94:                *rp = r;
                     95:        }
                     96: }
                     97:
                     98: void Psub_minf(NODE arg,Real *rp)
                     99: {
                    100:        Real a,b,r;
                    101:        double c;
                    102:
                    103:        a = (Real)ARG0(arg);
                    104:        b = (Real)ARG1(arg);
                    105:        if ( !a ) {
                    106:                if ( !b )
                    107:                        *rp = 0;
                    108:                else {
                    109:                        c = -BDY(b);
                    110:                        MKReal(c,r);
                    111:                        *rp = r;
                    112:                }
                    113:        } else if ( !b )
                    114:                *rp = a;
1.3       noro      115:        else if ( NID(a) != N_R || NID(b) != N_R )
                    116:                error("sub_minf : invalid argument");
1.1       noro      117:        else {
                    118:                FPMINUSINF
                    119:                c = BDY(a)-BDY(b);
                    120:                FPNEAREST
                    121:                MKReal(c,r);
                    122:                *rp = r;
                    123:        }
                    124: }
                    125:
                    126: void Pmul_pinf(NODE arg,Real *rp)
                    127: {
                    128:        Real a,b,r;
                    129:        double c;
                    130:
                    131:        a = (Real)ARG0(arg);
                    132:        b = (Real)ARG1(arg);
                    133:        if ( !a || !b )
                    134:                *rp = 0;
1.3       noro      135:        else if ( NID(a) != N_R || NID(b) != N_R )
                    136:                error("mul_pinf : invalid argument");
1.1       noro      137:        else {
                    138:                FPPLUSINF
                    139:                c = BDY(a)*BDY(b);
                    140:                FPNEAREST
                    141:                MKReal(c,r);
                    142:                *rp = r;
                    143:        }
                    144: }
                    145:
                    146: void Pmul_minf(NODE arg,Real *rp)
                    147: {
                    148:        Real a,b,r;
                    149:        double c;
                    150:
                    151:        a = (Real)ARG0(arg);
                    152:        b = (Real)ARG1(arg);
                    153:        if ( !a || !b )
                    154:                *rp = 0;
1.3       noro      155:        else if ( NID(a) != N_R || NID(b) != N_R )
                    156:                error("mul_minf : invalid argument");
1.1       noro      157:        else {
                    158:                FPMINUSINF
                    159:                c = BDY(a)*BDY(b);
                    160:                FPNEAREST
                    161:                MKReal(c,r);
                    162:                *rp = r;
                    163:        }
                    164: }
                    165:
                    166: void Pdiv_pinf(NODE arg,Real *rp)
                    167: {
                    168:        Real a,b,r;
                    169:        double c;
                    170:
                    171:        a = (Real)ARG0(arg);
                    172:        b = (Real)ARG1(arg);
                    173:        if ( !b )
                    174:                error("div_pinf : division by 0");
                    175:        else if ( !a )
                    176:                *rp = 0;
1.3       noro      177:        else if ( NID(a) != N_R || NID(b) != N_R )
                    178:                error("div_pinf : invalid argument");
1.1       noro      179:        else {
                    180:                FPPLUSINF
                    181:                c = BDY(a)/BDY(b);
                    182:                FPNEAREST
                    183:                MKReal(c,r);
                    184:                *rp = r;
                    185:        }
                    186: }
                    187:
                    188: void Pdiv_minf(NODE arg,Real *rp)
                    189: {
                    190:        Real a,b,r;
                    191:        double c;
                    192:
                    193:        a = (Real)ARG0(arg);
                    194:        b = (Real)ARG1(arg);
                    195:        if ( !b )
1.3       noro      196:                error("div_minf : division by 0");
1.1       noro      197:        else if ( !a )
                    198:                *rp = 0;
1.3       noro      199:        else if ( NID(a) != N_R || NID(b) != N_R )
                    200:                error("div_minf : invalid argument");
1.1       noro      201:        else {
                    202:                FPMINUSINF
                    203:                c = BDY(a)/BDY(b);
                    204:                FPNEAREST
                    205:                MKReal(c,r);
                    206:                *rp = r;
                    207:        }
                    208: }

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