xref: /plan9/sys/src/libmp/port/mpsub.c (revision 80ee5cbfe36716af62da8896207e9763b8e3d760)
17dd7cddfSDavid du Colombier #include "os.h"
27dd7cddfSDavid du Colombier #include <mp.h>
37dd7cddfSDavid du Colombier #include "dat.h"
47dd7cddfSDavid du Colombier 
57dd7cddfSDavid du Colombier // diff = abs(b1) - abs(b2), i.e., subtract the magnitudes
67dd7cddfSDavid du Colombier void
mpmagsub(mpint * b1,mpint * b2,mpint * diff)77dd7cddfSDavid du Colombier mpmagsub(mpint *b1, mpint *b2, mpint *diff)
87dd7cddfSDavid du Colombier {
97dd7cddfSDavid du Colombier 	int n, m, sign;
107dd7cddfSDavid du Colombier 	mpint *t;
117dd7cddfSDavid du Colombier 
127dd7cddfSDavid du Colombier 	// get the sizes right
137dd7cddfSDavid du Colombier 	if(mpmagcmp(b1, b2) < 0){
147dd7cddfSDavid du Colombier 		sign = -1;
157dd7cddfSDavid du Colombier 		t = b1;
167dd7cddfSDavid du Colombier 		b1 = b2;
177dd7cddfSDavid du Colombier 		b2 = t;
187dd7cddfSDavid du Colombier 	} else
197dd7cddfSDavid du Colombier 		sign = 1;
207dd7cddfSDavid du Colombier 	n = b1->top;
217dd7cddfSDavid du Colombier 	m = b2->top;
227dd7cddfSDavid du Colombier 	if(m == 0){
237dd7cddfSDavid du Colombier 		mpassign(b1, diff);
247dd7cddfSDavid du Colombier 		diff->sign = sign;
257dd7cddfSDavid du Colombier 		return;
267dd7cddfSDavid du Colombier 	}
277dd7cddfSDavid du Colombier 	mpbits(diff, n*Dbits);
287dd7cddfSDavid du Colombier 
297dd7cddfSDavid du Colombier 	mpvecsub(b1->p, n, b2->p, m, diff->p);
307dd7cddfSDavid du Colombier 	diff->sign = sign;
3159cc4ca5SDavid du Colombier 	diff->top = n;
327dd7cddfSDavid du Colombier 	mpnorm(diff);
337dd7cddfSDavid du Colombier }
347dd7cddfSDavid du Colombier 
357dd7cddfSDavid du Colombier // diff = b1 - b2
367dd7cddfSDavid du Colombier void
mpsub(mpint * b1,mpint * b2,mpint * diff)377dd7cddfSDavid du Colombier mpsub(mpint *b1, mpint *b2, mpint *diff)
387dd7cddfSDavid du Colombier {
397dd7cddfSDavid du Colombier 	int sign;
407dd7cddfSDavid du Colombier 
417dd7cddfSDavid du Colombier 	if(b1->sign != b2->sign){
427dd7cddfSDavid du Colombier 		sign = b1->sign;
437dd7cddfSDavid du Colombier 		mpmagadd(b1, b2, diff);
447dd7cddfSDavid du Colombier 		diff->sign = sign;
457dd7cddfSDavid du Colombier 		return;
467dd7cddfSDavid du Colombier 	}
477dd7cddfSDavid du Colombier 
487dd7cddfSDavid du Colombier 	sign = b1->sign;
497dd7cddfSDavid du Colombier 	mpmagsub(b1, b2, diff);
50*80ee5cbfSDavid du Colombier 	if(diff->top != 0)
517dd7cddfSDavid du Colombier 		diff->sign *= sign;
527dd7cddfSDavid du Colombier }
53