a
This commit is contained in:
43
libmp/mpdigdiv.c
Normal file
43
libmp/mpdigdiv.c
Normal file
@ -0,0 +1,43 @@
|
||||
#include "os.h"
|
||||
#include <mp.h>
|
||||
#include "dat.h"
|
||||
|
||||
//
|
||||
// divide two digits by one and return quotient
|
||||
//
|
||||
void
|
||||
mpdigdiv(mpdigit *dividend, mpdigit divisor, mpdigit *quotient)
|
||||
{
|
||||
mpdigit hi, lo, q, x, y;
|
||||
int i;
|
||||
|
||||
hi = dividend[1];
|
||||
lo = dividend[0];
|
||||
|
||||
// return highest digit value if the result >= 2**32
|
||||
if(hi >= divisor || divisor == 0){
|
||||
divisor = 0;
|
||||
*quotient = ~divisor;
|
||||
return;
|
||||
}
|
||||
|
||||
// at this point we know that hi < divisor
|
||||
// just shift and subtract till we're done
|
||||
q = 0;
|
||||
x = divisor;
|
||||
for(i = Dbits-1; hi > 0 && i >= 0; i--){
|
||||
x >>= 1;
|
||||
if(x > hi)
|
||||
continue;
|
||||
y = divisor<<i;
|
||||
if(x == hi && y > lo)
|
||||
continue;
|
||||
if(y > lo)
|
||||
hi--;
|
||||
lo -= y;
|
||||
hi -= x;
|
||||
q |= 1<<i;
|
||||
}
|
||||
q += lo/divisor;
|
||||
*quotient = q;
|
||||
}
|
Reference in New Issue
Block a user