version 1.2, 2000/08/21 08:31:27 |
version 1.7, 2020/10/04 03:14:08 |
|
|
* shall be made on your publication or presentation in any form of the |
* shall be made on your publication or presentation in any form of the |
* results obtained by use of the SOFTWARE. |
* results obtained by use of the SOFTWARE. |
* (4) In the event that you modify the SOFTWARE, you shall notify FLL by |
* (4) In the event that you modify the SOFTWARE, you shall notify FLL by |
* e-mail at risa-admin@flab.fujitsu.co.jp of the detailed specification |
* e-mail at risa-admin@sec.flab.fujitsu.co.jp of the detailed specification |
* for such modification or the source code of the modified part of the |
* for such modification or the source code of the modified part of the |
* SOFTWARE. |
* SOFTWARE. |
* |
* |
|
|
* DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, |
* DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, |
* PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. |
* PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. |
* |
* |
* $OpenXM: OpenXM_contrib2/asir2000/engine/R.c,v 1.1.1.1 1999/12/03 07:39:08 noro Exp $ |
* $OpenXM: OpenXM_contrib2/asir2000/engine/R.c,v 1.6 2018/03/29 01:32:51 noro Exp $ |
*/ |
*/ |
#include "ca.h" |
#include "ca.h" |
|
|
Line 53 void addr(vl,a,b,c) |
|
Line 53 void addr(vl,a,b,c) |
|
VL vl; |
VL vl; |
Obj a,b,*c; |
Obj a,b,*c; |
{ |
{ |
P t,s,u; |
P t,s,u; |
R r; |
R r; |
|
|
if ( !a ) |
if ( !a ) |
*c = b; |
*c = b; |
else if ( !b ) |
else if ( !b ) |
*c = a; |
*c = a; |
else if ( !RAT(a) ) |
else if ( !RAT(a) ) |
if ( !RAT(b) ) |
if ( !RAT(b) ) |
addp(vl,(P)a,(P)b,(P *)c); |
addp(vl,(P)a,(P)b,(P *)c); |
else { |
else { |
mulp(vl,(P)a,DN((R)b),&t); addp(vl,t,NM((R)b),&s); |
mulp(vl,(P)a,DN((R)b),&t); addp(vl,t,NM((R)b),&s); |
if ( s ) |
if ( s ) |
MKRAT(s,DN((R)b),((R)b)->reduced,r); |
MKRAT(s,DN((R)b),((R)b)->reduced,r); |
else |
else |
r = 0; |
r = 0; |
*c = (Obj)r; |
*c = (Obj)r; |
} |
} |
else if ( !RAT(b) ) { |
else if ( !RAT(b) ) { |
mulp(vl,DN((R)a),(P)b,&t); addp(vl,NM((R)a),t,&s); |
mulp(vl,DN((R)a),(P)b,&t); addp(vl,NM((R)a),t,&s); |
if ( s ) |
if ( s ) |
MKRAT(s,DN((R)a),((R)a)->reduced,r); |
MKRAT(s,DN((R)a),((R)a)->reduced,r); |
else |
else |
r = 0; |
r = 0; |
*c = (Obj)r; |
*c = (Obj)r; |
} else { |
} else { |
mulp(vl,NM((R)a),DN((R)b),&t); mulp(vl,NM((R)b),DN((R)a),&s); |
mulp(vl,NM((R)a),DN((R)b),&t); mulp(vl,NM((R)b),DN((R)a),&s); |
addp(vl,t,s,&u); |
addp(vl,t,s,&u); |
if ( u ) { |
if ( u ) { |
mulp(vl,DN((R)a),DN((R)b),&t); MKRAT(u,t,0,r); *c = (Obj)r; |
mulp(vl,DN((R)a),DN((R)b),&t); MKRAT(u,t,0,r); *c = (Obj)r; |
} else |
} else |
*c = 0; |
*c = 0; |
} |
} |
} |
} |
|
|
void subr(vl,a,b,c) |
void subr(vl,a,b,c) |
VL vl; |
VL vl; |
Obj a,b,*c; |
Obj a,b,*c; |
{ |
{ |
P t,s,u; |
P t,s,u; |
R r; |
R r; |
|
|
if ( !a ) |
if ( !a ) |
chsgnr(b,c); |
chsgnr(b,c); |
else if ( !b ) |
else if ( !b ) |
*c = a; |
*c = a; |
else if ( !RAT(a) ) |
else if ( !RAT(a) ) |
if ( !RAT(b) ) |
if ( !RAT(b) ) |
subp(vl,(P)a,(P)b,(P *)c); |
subp(vl,(P)a,(P)b,(P *)c); |
else { |
else { |
mulp(vl,(P)a,DN((R)b),&t); subp(vl,t,NM((R)b),&s); |
mulp(vl,(P)a,DN((R)b),&t); subp(vl,t,NM((R)b),&s); |
if ( s ) |
if ( s ) |
MKRAT(s,DN((R)b),((R)b)->reduced,r); |
MKRAT(s,DN((R)b),((R)b)->reduced,r); |
else |
else |
r = 0; |
r = 0; |
*c = (Obj)r; |
*c = (Obj)r; |
} |
} |
else if ( !RAT(b) ) { |
else if ( !RAT(b) ) { |
mulp(vl,DN((R)a),(P)b,&t); subp(vl,NM((R)a),t,&s); |
mulp(vl,DN((R)a),(P)b,&t); subp(vl,NM((R)a),t,&s); |
if ( s ) |
if ( s ) |
MKRAT(s,DN((R)a),((R)a)->reduced,r); |
MKRAT(s,DN((R)a),((R)a)->reduced,r); |
else |
else |
r = 0; |
r = 0; |
*c = (Obj)r; |
*c = (Obj)r; |
} else { |
} else { |
mulp(vl,NM((R)a),DN((R)b),&t); mulp(vl,NM((R)b),DN((R)a),&s); |
mulp(vl,NM((R)a),DN((R)b),&t); mulp(vl,NM((R)b),DN((R)a),&s); |
subp(vl,t,s,&u); |
subp(vl,t,s,&u); |
if ( u ) { |
if ( u ) { |
mulp(vl,DN((R)a),DN((R)b),&t); MKRAT(u,t,0,r); *c = (Obj)r; |
mulp(vl,DN((R)a),DN((R)b),&t); MKRAT(u,t,0,r); *c = (Obj)r; |
} else |
} else |
*c = 0; |
*c = 0; |
} |
} |
} |
} |
|
|
void mulr(vl,a,b,c) |
void mulr(vl,a,b,c) |
VL vl; |
VL vl; |
Obj a,b,*c; |
Obj a,b,*c; |
{ |
{ |
P t,s; |
P t,s; |
R r; |
R r; |
|
|
if ( !a || !b ) |
if ( !a || !b ) |
*c = 0; |
*c = 0; |
else if ( !RAT(a) ) |
else if ( !RAT(a) ) |
if ( !RAT(b) ) |
if ( !RAT(b) ) |
mulp(vl,(P)a,(P)b,(P *)c); |
mulp(vl,(P)a,(P)b,(P *)c); |
else { |
else { |
mulp(vl,(P)a,NM((R)b),&t); MKRAT(t,DN((R)b),0,r); *c = (Obj)r; |
mulp(vl,(P)a,NM((R)b),&t); MKRAT(t,DN((R)b),0,r); *c = (Obj)r; |
} |
} |
else if ( !RAT(b) ) { |
else if ( !RAT(b) ) { |
mulp(vl,NM((R)a),(P)b,&t); MKRAT(t,DN((R)a),0,r); *c = (Obj)r; |
mulp(vl,NM((R)a),(P)b,&t); MKRAT(t,DN((R)a),0,r); *c = (Obj)r; |
} else { |
} else { |
mulp(vl,NM((R)a),NM((R)b),&t); mulp(vl,DN((R)a),DN((R)b),&s); |
mulp(vl,NM((R)a),NM((R)b),&t); mulp(vl,DN((R)a),DN((R)b),&s); |
MKRAT(t,s,0,r); *c = (Obj)r; |
MKRAT(t,s,0,r); *c = (Obj)r; |
} |
} |
} |
} |
|
|
void divr(vl,a,b,c) |
void divr(vl,a,b,c) |
VL vl; |
VL vl; |
Obj a,b,*c; |
Obj a,b,*c; |
{ |
{ |
P t,s; |
P t,s; |
R r; |
R r; |
|
|
if ( !b ) |
if ( !b ) |
error("divr : division by 0"); |
error("divr : division by 0"); |
else if ( !a ) |
else if ( !a ) |
*c = 0; |
*c = 0; |
else if ( !RAT(a) ) |
else if ( !RAT(a) ) |
if ( !RAT(b) ) |
if ( !RAT(b) ) |
if ( NUM(b) ) |
if ( NUM(b) ) |
divsp(vl,(P)a,(P)b,(P *)c); |
divsp(vl,(P)a,(P)b,(P *)c); |
else { |
else { |
MKRAT((P)a,(P)b,0,r); *c = (Obj)r; |
MKRAT((P)a,(P)b,0,r); *c = (Obj)r; |
} |
} |
else { |
else { |
mulp(vl,(P)a,DN((R)b),&t); MKRAT(t,NM((R)b),0,r); *c = (Obj)r; |
mulp(vl,(P)a,DN((R)b),&t); MKRAT(t,NM((R)b),0,r); *c = (Obj)r; |
} |
} |
else if ( !RAT(b) ) { |
else if ( !RAT(b) ) { |
mulp(vl,DN((R)a),(P)b,&t); MKRAT(NM((R)a),t,0,r); *c = (Obj)r; |
mulp(vl,DN((R)a),(P)b,&t); MKRAT(NM((R)a),t,0,r); *c = (Obj)r; |
} else { |
} else { |
mulp(vl,NM((R)a),DN((R)b),&t); mulp(vl,DN((R)a),NM((R)b),&s); |
mulp(vl,NM((R)a),DN((R)b),&t); mulp(vl,DN((R)a),NM((R)b),&s); |
MKRAT(t,s,0,r); *c = (Obj)r; |
MKRAT(t,s,0,r); *c = (Obj)r; |
} |
} |
} |
} |
|
|
void pwrr(vl,a,q,c) |
void pwrr(vl,a,q,c) |
VL vl; |
VL vl; |
Obj a,q,*c; |
Obj a,q,*c; |
{ |
{ |
P t,s; |
P t,s; |
R r; |
R r; |
Q q1; |
Q q1; |
|
|
if ( !q ) |
if ( !q ) |
*c = (Obj)ONE; |
*c = (Obj)ONE; |
else if ( !a ) |
else if ( !a ) |
*c = 0; |
*c = 0; |
else if ( !RAT(a) ) |
else if ( !NUM(q) || !RATN(q) || !INT(q) ) |
pwrp(vl,(P)a,(Q)q,(P *)c); |
notdef(vl,a,q,c); |
else if ( !NUM(q) || !RATN(q) || !INT(q) ) |
else if ( !RAT(a) && (SGN((Q)q) > 0) ) { |
notdef(vl,a,q,c); |
pwrp(vl,(P)a,(Q)q,&t); *c = (Obj)t; |
else { |
} else { |
if ( SGN((Q)q) < 0 ) { |
if ( !RAT(a) ) { |
chsgnq((Q)q,&q1); pwrp(vl,DN((R)a),q1,&t); pwrp(vl,NM((R)a),q1,&s); |
PTOR((P)a,r); a = (Obj)r; |
} else { |
} |
pwrp(vl,NM((R)a),(Q)q,&t); pwrp(vl,DN((R)a),(Q)q,&s); |
if ( SGN((Q)q) < 0 ) { |
} |
chsgnq((Q)q,&q1); pwrp(vl,DN((R)a),q1,&t); pwrp(vl,NM((R)a),q1,&s); |
MKRAT(t,s,((R)a)->reduced,r); *c = (Obj)r; |
} else { |
} |
pwrp(vl,NM((R)a),(Q)q,&t); pwrp(vl,DN((R)a),(Q)q,&s); |
|
} |
|
MKRAT(t,s,((R)a)->reduced,r); *c = (Obj)r; |
|
} |
} |
} |
|
|
void chsgnr(a,b) |
void chsgnr(a,b) |
Obj a,*b; |
Obj a,*b; |
{ |
{ |
P t; |
P t; |
R r; |
R r; |
|
|
if ( !a ) |
if ( !a ) |
*b = 0; |
*b = 0; |
else if ( !RAT(a) ) |
else if ( !RAT(a) ) |
chsgnp((P)a,(P *)b); |
chsgnp((P)a,(P *)b); |
else { |
else { |
chsgnp(NM((R)a),&t); MKRAT(t,DN((R)a),((R)a)->reduced,r); *b = (Obj)r; |
chsgnp(NM((R)a),&t); MKRAT(t,DN((R)a),((R)a)->reduced,r); *b = (Obj)r; |
} |
} |
} |
} |
|
|
int compr(vl,a,b) |
int compr(vl,a,b) |
VL vl; |
VL vl; |
Obj a,b; |
Obj a,b; |
{ |
{ |
int t; |
int t; |
|
|
if ( !a ) |
if ( !a ) |
return b ? -1 : 0; |
return b ? -1 : 0; |
else if ( !b ) |
else if ( !b ) |
return 1; |
return 1; |
else if ( !RAT(a) ) |
else if ( !RAT(a) ) |
return !RAT(b) ? compp(vl,(P)a,(P)b) : -1; |
return !RAT(b) ? compp(vl,(P)a,(P)b) : -1; |
else if ( !RAT(b) ) |
else if ( !RAT(b) ) |
return 1; |
return 1; |
else { |
else { |
t = compp(vl,NM((R)a),NM((R)b)); |
t = compp(vl,NM((R)a),NM((R)b)); |
if ( !t ) |
if ( !t ) |
t = compp(vl,DN((R)a),DN((R)b)); |
t = compp(vl,DN((R)a),DN((R)b)); |
return t; |
return t; |
} |
} |
|
} |
|
|
|
int equalp(VL,P,P); |
|
|
|
int equalr(vl,a,b) |
|
VL vl; |
|
Obj a,b; |
|
{ |
|
if ( !a ) |
|
return b ? 0 : 1; |
|
else if ( !b ) |
|
return 0; |
|
else if ( !RAT(a) ) |
|
return !RAT(b) ? equalp(vl,(P)a,(P)b) : 0; |
|
else if ( !RAT(b) ) |
|
return 0; |
|
else |
|
return equalp(vl,NM((R)a),NM((R)b)) && equalp(vl,DN((R)a),DN((R)b)); |
} |
} |