Dev checkpoint

db4
Phil Dawes 2009-08-17 21:37:05 +01:00
parent 8426e2f877
commit 149af514e6
2 changed files with 98 additions and 35 deletions

View File

@ -189,9 +189,7 @@ bignum *bignum_multiply(bignum * x, bignum * y)
}
/* allocates memory */
void
bignum_divide(bignum * numerator, bignum * denominator,
bignum * * quotient, bignum * * remainder)
void factorvm::bignum_divide(bignum * numerator, bignum * denominator, bignum * * quotient, bignum * * remainder)
{
if (BIGNUM_ZERO_P (denominator))
{
@ -261,9 +259,13 @@ bignum_divide(bignum * numerator, bignum * denominator,
}
}
void bignum_divide(bignum * numerator, bignum * denominator, bignum * * quotient, bignum * * remainder)
{
return vm->bignum_divide(numerator,denominator,quotient,remainder);
}
/* allocates memory */
bignum *
bignum_quotient(bignum * numerator, bignum * denominator)
bignum *factorvm::bignum_quotient(bignum * numerator, bignum * denominator)
{
if (BIGNUM_ZERO_P (denominator))
{
@ -314,9 +316,13 @@ bignum_quotient(bignum * numerator, bignum * denominator)
}
}
bignum *bignum_quotient(bignum * numerator, bignum * denominator)
{
return vm->bignum_quotient(numerator,denominator);
}
/* allocates memory */
bignum *
bignum_remainder(bignum * numerator, bignum * denominator)
bignum *factorvm::bignum_remainder(bignum * numerator, bignum * denominator)
{
if (BIGNUM_ZERO_P (denominator))
{
@ -359,6 +365,11 @@ bignum_remainder(bignum * numerator, bignum * denominator)
}
}
bignum *bignum_remainder(bignum * numerator, bignum * denominator)
{
return vm->bignum_remainder(numerator, denominator);
}
#define FOO_TO_BIGNUM(name,type,utype) \
bignum * name##_to_bignum(type n) \
{ \
@ -416,8 +427,7 @@ BIGNUM_TO_FOO(fixnum,fixnum,cell);
BIGNUM_TO_FOO(long_long,s64,u64)
BIGNUM_TO_FOO(ulong_long,u64,u64)
double
bignum_to_double(bignum * bignum)
double factorvm::bignum_to_double(bignum * bignum)
{
if (BIGNUM_ZERO_P (bignum))
return (0);
@ -431,6 +441,11 @@ bignum_to_double(bignum * bignum)
}
}
double bignum_to_double(bignum * bignum)
{
return vm->bignum_to_double(bignum);
}
#define DTB_WRITE_DIGIT(factor) \
{ \
significand *= (factor); \
@ -442,8 +457,7 @@ bignum_to_double(bignum * bignum)
/* allocates memory */
#define inf std::numeric_limits<double>::infinity()
bignum *
double_to_bignum(double x)
bignum *factorvm::double_to_bignum(double x)
{
if (x == inf || x == -inf || x != x) return (BIGNUM_ZERO ());
int exponent;
@ -474,12 +488,16 @@ double_to_bignum(double x)
}
}
bignum *double_to_bignum(double x)
{
return vm->double_to_bignum(x);
}
#undef DTB_WRITE_DIGIT
/* Comparisons */
int
bignum_equal_p_unsigned(bignum * x, bignum * y)
int factorvm::bignum_equal_p_unsigned(bignum * x, bignum * y)
{
bignum_length_type length = (BIGNUM_LENGTH (x));
if (length != (BIGNUM_LENGTH (y)))
@ -496,8 +514,12 @@ bignum_equal_p_unsigned(bignum * x, bignum * y)
}
}
enum bignum_comparison
bignum_compare_unsigned(bignum * x, bignum * y)
int bignum_equal_p_unsigned(bignum * x, bignum * y)
{
return vm->bignum_equal_p_unsigned(x,y);
}
enum bignum_comparison factorvm::bignum_compare_unsigned(bignum * x, bignum * y)
{
bignum_length_type x_length = (BIGNUM_LENGTH (x));
bignum_length_type y_length = (BIGNUM_LENGTH (y));
@ -522,11 +544,15 @@ bignum_compare_unsigned(bignum * x, bignum * y)
return (bignum_comparison_equal);
}
enum bignum_comparison bignum_compare_unsigned(bignum * x, bignum * y)
{
return vm->bignum_compare_unsigned(x,y);
}
/* Addition */
/* allocates memory */
bignum *
bignum_add_unsigned(bignum * x, bignum * y, int negative_p)
bignum *factorvm::bignum_add_unsigned(bignum * x, bignum * y, int negative_p)
{
GC_BIGNUM(x); GC_BIGNUM(y);
@ -590,11 +616,15 @@ bignum_add_unsigned(bignum * x, bignum * y, int negative_p)
}
}
bignum *bignum_add_unsigned(bignum * x, bignum * y, int negative_p)
{
return vm->bignum_add_unsigned(x,y,negative_p);
}
/* Subtraction */
/* allocates memory */
bignum *
bignum_subtract_unsigned(bignum * x, bignum * y)
bignum *factorvm::bignum_subtract_unsigned(bignum * x, bignum * y)
{
GC_BIGNUM(x); GC_BIGNUM(y);
@ -665,6 +695,11 @@ bignum_subtract_unsigned(bignum * x, bignum * y)
}
}
bignum *bignum_subtract_unsigned(bignum * x, bignum * y)
{
return vm->bignum_subtract_unsigned(x,y);
}
/* Multiplication
Maximum value for product_low or product_high:
((R * R) + (R * (R - 2)) + (R - 1))
@ -672,8 +707,7 @@ bignum_subtract_unsigned(bignum * x, bignum * y)
where R == BIGNUM_RADIX_ROOT */
/* allocates memory */
bignum *
bignum_multiply_unsigned(bignum * x, bignum * y, int negative_p)
bignum *factorvm::bignum_multiply_unsigned(bignum * x, bignum * y, int negative_p)
{
GC_BIGNUM(x); GC_BIGNUM(y);
@ -743,10 +777,13 @@ bignum_multiply_unsigned(bignum * x, bignum * y, int negative_p)
}
}
bignum *bignum_multiply_unsigned(bignum * x, bignum * y, int negative_p)
{
return vm->bignum_multiply_unsigned(x,y,negative_p);
}
/* allocates memory */
bignum *
bignum_multiply_unsigned_small_factor(bignum * x, bignum_digit_type y,
int negative_p)
bignum *factorvm::bignum_multiply_unsigned_small_factor(bignum * x, bignum_digit_type y,int negative_p)
{
GC_BIGNUM(x);
@ -760,8 +797,12 @@ bignum_multiply_unsigned_small_factor(bignum * x, bignum_digit_type y,
return (bignum_trim (p));
}
void
bignum_destructive_add(bignum * bignum, bignum_digit_type n)
bignum *bignum_multiply_unsigned_small_factor(bignum * x, bignum_digit_type y,int negative_p)
{
return vm->bignum_multiply_unsigned_small_factor(x,y,negative_p);
}
void factorvm::bignum_destructive_add(bignum * bignum, bignum_digit_type n)
{
bignum_digit_type * scan = (BIGNUM_START_PTR (bignum));
bignum_digit_type digit;
@ -784,8 +825,12 @@ bignum_destructive_add(bignum * bignum, bignum_digit_type n)
}
}
void
bignum_destructive_scale_up(bignum * bignum, bignum_digit_type factor)
void bignum_destructive_add(bignum * bignum, bignum_digit_type n)
{
return vm->bignum_destructive_add(bignum,n);
}
void factorvm::bignum_destructive_scale_up(bignum * bignum, bignum_digit_type factor)
{
bignum_digit_type carry = 0;
bignum_digit_type * scan = (BIGNUM_START_PTR (bignum));
@ -814,6 +859,11 @@ bignum_destructive_scale_up(bignum * bignum, bignum_digit_type factor)
#undef product_high
}
void bignum_destructive_scale_up(bignum * bignum, bignum_digit_type factor)
{
return vm->bignum_destructive_scale_up(bignum,factor);
}
/* Division */
/* For help understanding this algorithm, see:
@ -822,13 +872,7 @@ bignum_destructive_scale_up(bignum * bignum, bignum_digit_type factor)
section 4.3.1, "Multiple-Precision Arithmetic". */
/* allocates memory */
void
bignum_divide_unsigned_large_denominator(bignum * numerator,
bignum * denominator,
bignum * * quotient,
bignum * * remainder,
int q_negative_p,
int r_negative_p)
void factorvm::bignum_divide_unsigned_large_denominator(bignum * numerator, bignum * denominator, bignum * * quotient, bignum * * remainder, int q_negative_p, int r_negative_p)
{
GC_BIGNUM(numerator); GC_BIGNUM(denominator);
@ -885,6 +929,11 @@ bignum_divide_unsigned_large_denominator(bignum * numerator,
return;
}
void bignum_divide_unsigned_large_denominator(bignum * numerator, bignum * denominator, bignum * * quotient, bignum * * remainder, int q_negative_p, int r_negative_p)
{
return vm->bignum_divide_unsigned_large_denominator(numerator,denominator,quotient,remainder,q_negative_p,r_negative_p);
}
void
bignum_divide_unsigned_normalized(bignum * u, bignum * v, bignum * q)
{

View File

@ -63,6 +63,20 @@ struct factorvm {
bignum *bignum_add(bignum * x, bignum * y);
bignum *bignum_subtract(bignum * x, bignum * y);
bignum *bignum_multiply(bignum * x, bignum * y);
void bignum_divide(bignum * numerator, bignum * denominator, bignum * * quotient, bignum * * remainder);
bignum *bignum_quotient(bignum * numerator, bignum * denominator);
bignum *bignum_remainder(bignum * numerator, bignum * denominator);
double bignum_to_double(bignum * bignum);
bignum *double_to_bignum(double x);
int bignum_equal_p_unsigned(bignum * x, bignum * y);
enum bignum_comparison bignum_compare_unsigned(bignum * x, bignum * y);
bignum *bignum_add_unsigned(bignum * x, bignum * y, int negative_p);
bignum *bignum_subtract_unsigned(bignum * x, bignum * y);
bignum *bignum_multiply_unsigned(bignum * x, bignum * y, int negative_p);
bignum *bignum_multiply_unsigned_small_factor(bignum * x, bignum_digit_type y,int negative_p);
void bignum_destructive_add(bignum * bignum, bignum_digit_type n);
void bignum_destructive_scale_up(bignum * bignum, bignum_digit_type factor);
void bignum_divide_unsigned_large_denominator(bignum * numerator, bignum * denominator, bignum * * quotient, bignum * * remainder, int q_negative_p, int r_negative_p);
// next method here:
};