xref: /plan9/sys/src/cmd/unix/drawterm/libmp/mpadd.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 // sum = abs(b1) + abs(b2), i.e., add the magnitudes
6*8ccd4a63SDavid du Colombier void
mpmagadd(mpint * b1,mpint * b2,mpint * sum)7*8ccd4a63SDavid du Colombier mpmagadd(mpint *b1, mpint *b2, mpint *sum)
8*8ccd4a63SDavid du Colombier {
9*8ccd4a63SDavid du Colombier 	int m, n;
10*8ccd4a63SDavid du Colombier 	mpint *t;
11*8ccd4a63SDavid du Colombier 
12*8ccd4a63SDavid du Colombier 	// get the sizes right
13*8ccd4a63SDavid du Colombier 	if(b2->top > b1->top){
14*8ccd4a63SDavid du Colombier 		t = b1;
15*8ccd4a63SDavid du Colombier 		b1 = b2;
16*8ccd4a63SDavid du Colombier 		b2 = t;
17*8ccd4a63SDavid du Colombier 	}
18*8ccd4a63SDavid du Colombier 	n = b1->top;
19*8ccd4a63SDavid du Colombier 	m = b2->top;
20*8ccd4a63SDavid du Colombier 	if(n == 0){
21*8ccd4a63SDavid du Colombier 		mpassign(mpzero, sum);
22*8ccd4a63SDavid du Colombier 		return;
23*8ccd4a63SDavid du Colombier 	}
24*8ccd4a63SDavid du Colombier 	if(m == 0){
25*8ccd4a63SDavid du Colombier 		mpassign(b1, sum);
26*8ccd4a63SDavid du Colombier 		return;
27*8ccd4a63SDavid du Colombier 	}
28*8ccd4a63SDavid du Colombier 	mpbits(sum, (n+1)*Dbits);
29*8ccd4a63SDavid du Colombier 	sum->top = n+1;
30*8ccd4a63SDavid du Colombier 
31*8ccd4a63SDavid du Colombier 	mpvecadd(b1->p, n, b2->p, m, sum->p);
32*8ccd4a63SDavid du Colombier 	sum->sign = 1;
33*8ccd4a63SDavid du Colombier 
34*8ccd4a63SDavid du Colombier 	mpnorm(sum);
35*8ccd4a63SDavid du Colombier }
36*8ccd4a63SDavid du Colombier 
37*8ccd4a63SDavid du Colombier // sum = b1 + b2
38*8ccd4a63SDavid du Colombier void
mpadd(mpint * b1,mpint * b2,mpint * sum)39*8ccd4a63SDavid du Colombier mpadd(mpint *b1, mpint *b2, mpint *sum)
40*8ccd4a63SDavid du Colombier {
41*8ccd4a63SDavid du Colombier 	int sign;
42*8ccd4a63SDavid du Colombier 
43*8ccd4a63SDavid du Colombier 	if(b1->sign != b2->sign){
44*8ccd4a63SDavid du Colombier 		if(b1->sign < 0)
45*8ccd4a63SDavid du Colombier 			mpmagsub(b2, b1, sum);
46*8ccd4a63SDavid du Colombier 		else
47*8ccd4a63SDavid du Colombier 			mpmagsub(b1, b2, sum);
48*8ccd4a63SDavid du Colombier 	} else {
49*8ccd4a63SDavid du Colombier 		sign = b1->sign;
50*8ccd4a63SDavid du Colombier 		mpmagadd(b1, b2, sum);
51*8ccd4a63SDavid du Colombier 		if(sum->top != 0)
52*8ccd4a63SDavid du Colombier 			sum->sign = sign;
53*8ccd4a63SDavid du Colombier 	}
54*8ccd4a63SDavid du Colombier }
55