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

Annotation of OpenXM_contrib2/asir2000/engine/R.c, Revision 1.1

1.1     ! noro        1: /* $OpenXM: OpenXM/src/asir99/engine/R.c,v 1.1.1.1 1999/11/10 08:12:26 noro Exp $ */
        !             2: #include "ca.h"
        !             3:
        !             4: void addr(vl,a,b,c)
        !             5: VL vl;
        !             6: Obj a,b,*c;
        !             7: {
        !             8:        P t,s,u;
        !             9:        R r;
        !            10:
        !            11:        if ( !a )
        !            12:                *c = b;
        !            13:        else if ( !b )
        !            14:                *c = a;
        !            15:        else if ( !RAT(a) )
        !            16:                if ( !RAT(b) )
        !            17:                        addp(vl,(P)a,(P)b,(P *)c);
        !            18:                else {
        !            19:                        mulp(vl,(P)a,DN((R)b),&t); addp(vl,t,NM((R)b),&s);
        !            20:                        if ( s )
        !            21:                                MKRAT(s,DN((R)b),((R)b)->reduced,r);
        !            22:                        else
        !            23:                                r = 0;
        !            24:                        *c = (Obj)r;
        !            25:                }
        !            26:        else if ( !RAT(b) ) {
        !            27:                mulp(vl,DN((R)a),(P)b,&t); addp(vl,NM((R)a),t,&s);
        !            28:                if ( s )
        !            29:                        MKRAT(s,DN((R)a),((R)a)->reduced,r);
        !            30:                else
        !            31:                        r = 0;
        !            32:                *c = (Obj)r;
        !            33:        } else {
        !            34:                mulp(vl,NM((R)a),DN((R)b),&t); mulp(vl,NM((R)b),DN((R)a),&s);
        !            35:                addp(vl,t,s,&u);
        !            36:                if ( u ) {
        !            37:                        mulp(vl,DN((R)a),DN((R)b),&t); MKRAT(u,t,0,r); *c = (Obj)r;
        !            38:                } else
        !            39:                        *c = 0;
        !            40:        }
        !            41: }
        !            42:
        !            43: void subr(vl,a,b,c)
        !            44: VL vl;
        !            45: Obj a,b,*c;
        !            46: {
        !            47:        P t,s,u;
        !            48:        R r;
        !            49:
        !            50:        if ( !a )
        !            51:                chsgnr(b,c);
        !            52:        else if ( !b )
        !            53:                *c = a;
        !            54:        else if ( !RAT(a) )
        !            55:                if ( !RAT(b) )
        !            56:                        subp(vl,(P)a,(P)b,(P *)c);
        !            57:                else {
        !            58:                        mulp(vl,(P)a,DN((R)b),&t); subp(vl,t,NM((R)b),&s);
        !            59:                        if ( s )
        !            60:                                MKRAT(s,DN((R)b),((R)b)->reduced,r);
        !            61:                        else
        !            62:                                r = 0;
        !            63:                        *c = (Obj)r;
        !            64:                }
        !            65:        else if ( !RAT(b) ) {
        !            66:                mulp(vl,DN((R)a),(P)b,&t); subp(vl,NM((R)a),t,&s);
        !            67:                if ( s )
        !            68:                        MKRAT(s,DN((R)a),((R)a)->reduced,r);
        !            69:                else
        !            70:                        r = 0;
        !            71:                *c = (Obj)r;
        !            72:        } else {
        !            73:                mulp(vl,NM((R)a),DN((R)b),&t); mulp(vl,NM((R)b),DN((R)a),&s);
        !            74:                subp(vl,t,s,&u);
        !            75:                if ( u ) {
        !            76:                        mulp(vl,DN((R)a),DN((R)b),&t); MKRAT(u,t,0,r); *c = (Obj)r;
        !            77:                } else
        !            78:                        *c = 0;
        !            79:        }
        !            80: }
        !            81:
        !            82: void mulr(vl,a,b,c)
        !            83: VL vl;
        !            84: Obj a,b,*c;
        !            85: {
        !            86:        P t,s;
        !            87:        R r;
        !            88:
        !            89:        if ( !a || !b )
        !            90:                *c = 0;
        !            91:        else if ( !RAT(a) )
        !            92:                if ( !RAT(b) )
        !            93:                        mulp(vl,(P)a,(P)b,(P *)c);
        !            94:                else {
        !            95:                        mulp(vl,(P)a,NM((R)b),&t); MKRAT(t,DN((R)b),0,r); *c = (Obj)r;
        !            96:                }
        !            97:        else if ( !RAT(b) ) {
        !            98:                mulp(vl,NM((R)a),(P)b,&t); MKRAT(t,DN((R)a),0,r); *c = (Obj)r;
        !            99:        } else {
        !           100:                mulp(vl,NM((R)a),NM((R)b),&t); mulp(vl,DN((R)a),DN((R)b),&s);
        !           101:                MKRAT(t,s,0,r); *c = (Obj)r;
        !           102:        }
        !           103: }
        !           104:
        !           105: void divr(vl,a,b,c)
        !           106: VL vl;
        !           107: Obj a,b,*c;
        !           108: {
        !           109:        P t,s;
        !           110:        R r;
        !           111:
        !           112:        if ( !b )
        !           113:                error("divr : division by 0");
        !           114:        else if ( !a )
        !           115:                *c = 0;
        !           116:        else if ( !RAT(a) )
        !           117:                if ( !RAT(b) )
        !           118:                        if ( NUM(b) )
        !           119:                                divsp(vl,(P)a,(P)b,(P *)c);
        !           120:                        else {
        !           121:                                MKRAT((P)a,(P)b,0,r); *c = (Obj)r;
        !           122:                        }
        !           123:                else {
        !           124:                        mulp(vl,(P)a,DN((R)b),&t); MKRAT(t,NM((R)b),0,r); *c = (Obj)r;
        !           125:                }
        !           126:        else if ( !RAT(b) ) {
        !           127:                mulp(vl,DN((R)a),(P)b,&t); MKRAT(NM((R)a),t,0,r); *c = (Obj)r;
        !           128:        } else {
        !           129:                mulp(vl,NM((R)a),DN((R)b),&t); mulp(vl,DN((R)a),NM((R)b),&s);
        !           130:                MKRAT(t,s,0,r); *c = (Obj)r;
        !           131:        }
        !           132: }
        !           133:
        !           134: void pwrr(vl,a,q,c)
        !           135: VL vl;
        !           136: Obj a,q,*c;
        !           137: {
        !           138:        P t,s;
        !           139:        R r;
        !           140:        Q q1;
        !           141:
        !           142:        if ( !q )
        !           143:                *c = (Obj)ONE;
        !           144:        else if ( !a )
        !           145:                *c = 0;
        !           146:        else if ( !RAT(a) )
        !           147:                pwrp(vl,(P)a,(Q)q,(P *)c);
        !           148:        else if ( !NUM(q) || !RATN(q) || !INT(q) )
        !           149:                notdef(vl,a,q,c);
        !           150:        else {
        !           151:                if ( SGN((Q)q) < 0 ) {
        !           152:                        chsgnq((Q)q,&q1); pwrp(vl,DN((R)a),q1,&t); pwrp(vl,NM((R)a),q1,&s);
        !           153:                } else {
        !           154:                        pwrp(vl,NM((R)a),(Q)q,&t); pwrp(vl,DN((R)a),(Q)q,&s);
        !           155:                }
        !           156:                MKRAT(t,s,((R)a)->reduced,r); *c = (Obj)r;
        !           157:        }
        !           158: }
        !           159:
        !           160: void chsgnr(a,b)
        !           161: Obj a,*b;
        !           162: {
        !           163:        P t;
        !           164:        R r;
        !           165:
        !           166:        if ( !a )
        !           167:                *b = 0;
        !           168:        else if ( !RAT(a) )
        !           169:                chsgnp((P)a,(P *)b);
        !           170:        else {
        !           171:                chsgnp(NM((R)a),&t); MKRAT(t,DN((R)a),((R)a)->reduced,r); *b = (Obj)r;
        !           172:        }
        !           173: }
        !           174:
        !           175: int compr(vl,a,b)
        !           176: VL vl;
        !           177: Obj a,b;
        !           178: {
        !           179:        int t;
        !           180:
        !           181:        if ( !a )
        !           182:                return b ? -1 : 0;
        !           183:        else if ( !b )
        !           184:                return 1;
        !           185:        else if ( !RAT(a) )
        !           186:                return !RAT(b) ? compp(vl,(P)a,(P)b) : -1;
        !           187:        else if ( !RAT(b) )
        !           188:                return 1;
        !           189:        else {
        !           190:                t = compp(vl,NM((R)a),NM((R)b));
        !           191:                if ( !t )
        !           192:                        t = compp(vl,DN((R)a),DN((R)b));
        !           193:                return t;
        !           194:        }
        !           195: }

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