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