From 101569dc8ff4ce7f4c17c7b7780788a3d681ae09 Mon Sep 17 00:00:00 2001 From: Juan Jose Garcia Ripoll Date: Thu, 28 Jan 2010 18:03:59 +0100 Subject: [PATCH] Fixed and used _ecl_fix_minus_big and _ecl_big_minus_big. --- src/c/big.d | 18 ++++++------------ src/c/num_arith.d | 22 +++------------------- 2 files changed, 9 insertions(+), 31 deletions(-) diff --git a/src/c/big.d b/src/c/big.d index 246d72762..ece4fcc8b 100644 --- a/src/c/big.d +++ b/src/c/big.d @@ -220,18 +220,12 @@ _ecl_big_minus_big(cl_object a, cl_object b) cl_object _ecl_fix_minus_big(cl_fixnum a, cl_object b) { - cl_object z; - if (a == 0) { - return ecl_negate(b); - } else { - cl_index size_b = (b->big.big_size < 0)? -b->big.big_size - : b->big.big_size; - cl_index size_z = size_b + limbs_per_fixnum; - cl_object z = _ecl_alloc_compact_bignum(size_z); - mpz_set_si(z->big.big_num, a); - mpz_sub(z->big.big_num, z->big.big_num, b->big.big_num); - return big_normalize(z); - } + cl_index size_b = (b->big.big_size < 0)? -b->big.big_size : b->big.big_size; + cl_index size_z = size_b + limbs_per_fixnum; + cl_object z = _ecl_alloc_compact_bignum(size_z); + mpz_set_si(z->big.big_num, a); + mpz_sub(z->big.big_num, z->big.big_num, b->big.big_num); + return big_normalize(z); } static void * diff --git a/src/c/num_arith.d b/src/c/num_arith.d index c3ca69407..26fe0c62f 100644 --- a/src/c/num_arith.d +++ b/src/c/num_arith.d @@ -488,14 +488,7 @@ ecl_minus(cl_object x, cl_object y) case t_fixnum: return ecl_make_integer(fix(x) - fix(y)); case t_bignum: - z = _ecl_big_register0(); - i = fix(x); - if (i > 0) - _ecl_big_sub_ui(z, y, i); - else - _ecl_big_add_ui(z, y, -i); - _ecl_big_complement(z, z); - return _ecl_big_register_normalize(z); + return _ecl_fix_minus_big(fix(x), y); case t_ratio: z = ecl_times(x, y->ratio.den); z = ecl_minus(z, y->ratio.num); @@ -520,18 +513,9 @@ ecl_minus(cl_object x, cl_object y) case t_bignum: switch (type_of(y)) { case t_fixnum: - if ((j = fix(y)) == 0) - return(x); - z = _ecl_big_register0(); - if (j > 0) - _ecl_big_sub_ui(z, x, j); - else - _ecl_big_add_ui(z, x, -j); - return _ecl_big_register_normalize(z); + return _ecl_big_plus_fix(x, -fix(y)); case t_bignum: - z = _ecl_big_register0(); - _ecl_big_sub(z, x, y); - return _ecl_big_register_normalize(z); + return _ecl_big_minus_big(x, y); case t_ratio: z = ecl_times(x, y->ratio.den); z = ecl_minus(z, y->ratio.num);