123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- #include "os.h"
- #include <mp.h>
- #include "dat.h"
- // sum = abs(b1) + abs(b2), i.e., add the magnitudes
- void
- mpmagadd(mpint *b1, mpint *b2, mpint *sum)
- {
- int m, n;
- mpint *t;
- // get the sizes right
- if(b2->top > b1->top){
- t = b1;
- b1 = b2;
- b2 = t;
- }
- n = b1->top;
- m = b2->top;
- if(n == 0){
- mpassign(mpzero, sum);
- return;
- }
- if(m == 0){
- mpassign(b1, sum);
- return;
- }
- mpbits(sum, (n+1)*Dbits);
- sum->top = n+1;
- mpvecadd(b1->p, n, b2->p, m, sum->p);
- sum->sign = 1;
- mpnorm(sum);
- }
- // sum = b1 + b2
- void
- mpadd(mpint *b1, mpint *b2, mpint *sum)
- {
- int sign;
- if(b1->sign != b2->sign){
- if(b1->sign < 0)
- mpmagsub(b2, b1, sum);
- else
- mpmagsub(b1, b2, sum);
- } else {
- sign = b1->sign;
- mpmagadd(b1, b2, sum);
- if(sum->top != 0)
- sum->sign = sign;
- }
- }
|