return big_normalize(z);
}
+cl_object
+_ecl_big_negate(cl_object a)
+{
+ cl_index size_a = (a->big.big_size < 0)? -a->big.big_size : a->big.big_size;
+ cl_object z = _ecl_alloc_compact_bignum(size_a);
+ mpz_neg(z->big.big_num, a->big.big_num);
+ return big_normalize(z);
+}
+
static void *
mp_alloc(size_t size)
{
return big_normalize(z);
}
+cl_object
+_ecl_big_negate(cl_object x)
+{
+ cl_object z = ecl_alloc_object(t_bignum);
+ z->big.big_num = -x->big.big_num;
+ return z;
+}
+
void
init_big(void)
{
case t_fixnum:
return ecl_make_integer(-fix(x));
case t_bignum:
- z = _ecl_big_register0();
- _ecl_big_complement(z, x);
- return _ecl_big_register_normalize(z);
-
+ return _ecl_big_negate(x);
case t_ratio:
z1 = ecl_negate(x->ratio.num);
z = ecl_alloc_object(t_ratio);
z->ratio.num = z1;
z->ratio.den = x->ratio.den;
return z;
-
#ifdef ECL_SHORT_FLOAT
case t_shortfloat:
return make_shortfloat(-ecl_shortfloat(x));
z = ecl_alloc_object(t_singlefloat);
sf(z) = -sf(x);
return z;
-
case t_doublefloat:
z = ecl_alloc_object(t_doublefloat);
df(z) = -df(x);
extern ECL_API cl_object _ecl_big_plus_big(cl_object x, cl_object y);
extern ECL_API cl_object _ecl_fix_minus_big(cl_fixnum x, cl_object y);
extern ECL_API cl_object _ecl_big_minus_big(cl_object x, cl_object y);
+extern ECL_API cl_object _ecl_big_negate(cl_object x);
extern ECL_API void _ecl_big_register_free(cl_object x);
extern ECL_API cl_object bignum1(cl_fixnum val);