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>