Fixed and used _ecl_fix_minus_big and _ecl_big_minus_big.
authorJuan Jose Garcia Ripoll <jjgarcia@jjgr-2.local>
Thu, 28 Jan 2010 17:03:59 +0000 (18:03 +0100)
committerJuan Jose Garcia Ripoll <jjgarcia@jjgr-2.local>
Thu, 28 Jan 2010 17:03:59 +0000 (18:03 +0100)
src/c/big.d
src/c/num_arith.d

index 246d727..ece4fcc 100644 (file)
@@ -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 *
index c3ca694..26fe0c6 100644 (file)
@@ -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);