Blob
1 #include "os.h"2 #include <mp.h>3 #include "dat.h"5 /* sum = abs(b1) + abs(b2), i.e., add the magnitudes */6 void7 mpmagadd(mpint *b1, mpint *b2, mpint *sum)8 {9 int m, n;10 mpint *t;12 /* get the sizes right */13 if(b2->top > b1->top){14 t = b1;15 b1 = b2;16 b2 = t;17 }18 n = b1->top;19 m = b2->top;20 if(n == 0){21 mpassign(mpzero, sum);22 return;23 }24 if(m == 0){25 mpassign(b1, sum);26 return;27 }28 mpbits(sum, (n+1)*Dbits);29 sum->top = n+1;31 mpvecadd(b1->p, n, b2->p, m, sum->p);32 sum->sign = 1;34 mpnorm(sum);35 }37 /* sum = b1 + b2 */38 void39 mpadd(mpint *b1, mpint *b2, mpint *sum)40 {41 int sign;43 if(b1->sign != b2->sign){44 if(b1->sign < 0)45 mpmagsub(b2, b1, sum);46 else47 mpmagsub(b1, b2, sum);48 } else {49 sign = b1->sign;50 mpmagadd(b1, b2, sum);51 if(sum->top != 0)52 sum->sign = sign;53 }54 }