xref: /plan9/sys/src/cmd/unix/drawterm/libmp/mpsub.c (revision 8ccd4a6360d974db7bd7bbd4f37e7018419ea908)
1*8ccd4a63SDavid du Colombier #include "os.h"
2*8ccd4a63SDavid du Colombier #include <mp.h>
3*8ccd4a63SDavid du Colombier #include "dat.h"
4*8ccd4a63SDavid du Colombier 
5*8ccd4a63SDavid du Colombier // diff = abs(b1) - abs(b2), i.e., subtract the magnitudes
6*8ccd4a63SDavid du Colombier void
mpmagsub(mpint * b1,mpint * b2,mpint * diff)7*8ccd4a63SDavid du Colombier mpmagsub(mpint *b1, mpint *b2, mpint *diff)
8*8ccd4a63SDavid du Colombier {
9*8ccd4a63SDavid du Colombier 	int n, m, sign;
10*8ccd4a63SDavid du Colombier 	mpint *t;
11*8ccd4a63SDavid du Colombier 
12*8ccd4a63SDavid du Colombier 	// get the sizes right
13*8ccd4a63SDavid du Colombier 	if(mpmagcmp(b1, b2) < 0){
14*8ccd4a63SDavid du Colombier 		sign = -1;
15*8ccd4a63SDavid du Colombier 		t = b1;
16*8ccd4a63SDavid du Colombier 		b1 = b2;
17*8ccd4a63SDavid du Colombier 		b2 = t;
18*8ccd4a63SDavid du Colombier 	} else
19*8ccd4a63SDavid du Colombier 		sign = 1;
20*8ccd4a63SDavid du Colombier 	n = b1->top;
21*8ccd4a63SDavid du Colombier 	m = b2->top;
22*8ccd4a63SDavid du Colombier 	if(m == 0){
23*8ccd4a63SDavid du Colombier 		mpassign(b1, diff);
24*8ccd4a63SDavid du Colombier 		diff->sign = sign;
25*8ccd4a63SDavid du Colombier 		return;
26*8ccd4a63SDavid du Colombier 	}
27*8ccd4a63SDavid du Colombier 	mpbits(diff, n*Dbits);
28*8ccd4a63SDavid du Colombier 
29*8ccd4a63SDavid du Colombier 	mpvecsub(b1->p, n, b2->p, m, diff->p);
30*8ccd4a63SDavid du Colombier 	diff->sign = sign;
31*8ccd4a63SDavid du Colombier 	diff->top = n;
32*8ccd4a63SDavid du Colombier 	mpnorm(diff);
33*8ccd4a63SDavid du Colombier }
34*8ccd4a63SDavid du Colombier 
35*8ccd4a63SDavid du Colombier // diff = b1 - b2
36*8ccd4a63SDavid du Colombier void
mpsub(mpint * b1,mpint * b2,mpint * diff)37*8ccd4a63SDavid du Colombier mpsub(mpint *b1, mpint *b2, mpint *diff)
38*8ccd4a63SDavid du Colombier {
39*8ccd4a63SDavid du Colombier 	int sign;
40*8ccd4a63SDavid du Colombier 
41*8ccd4a63SDavid du Colombier 	if(b1->sign != b2->sign){
42*8ccd4a63SDavid du Colombier 		sign = b1->sign;
43*8ccd4a63SDavid du Colombier 		mpmagadd(b1, b2, diff);
44*8ccd4a63SDavid du Colombier 		diff->sign = sign;
45*8ccd4a63SDavid du Colombier 		return;
46*8ccd4a63SDavid du Colombier 	}
47*8ccd4a63SDavid du Colombier 
48*8ccd4a63SDavid du Colombier 	sign = b1->sign;
49*8ccd4a63SDavid du Colombier 	mpmagsub(b1, b2, diff);
50*8ccd4a63SDavid du Colombier 	if(diff->top != 0)
51*8ccd4a63SDavid du Colombier 		diff->sign *= sign;
52*8ccd4a63SDavid du Colombier }
53