plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

mpsub.c (801B)


      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
      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
     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 }