mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-19 02:00:26 +02:00
Simplify scm_difference, use integer lib
* libguile/numbers.c (scm_sum): Remove need for s_sum defines. (negate, difference): New helpers. (scm_difference): Call out to difference or negate, as appropriate. * libguile/integers.h: * libguile/integers.c (scm_integer_negate_i): (scm_integer_negate_z): (scm_integer_sub_ii): (scm_integer_sub_iz): (scm_integer_sub_zi): (scm_integer_sub_zz): New internal functions.
This commit is contained in:
parent
10953e067c
commit
c096670d38
3 changed files with 201 additions and 260 deletions
|
@ -2559,3 +2559,47 @@ scm_integer_add_zz (struct scm_bignum *x, struct scm_bignum *y)
|
|||
// if result is fixable.
|
||||
return take_mpz (result);
|
||||
}
|
||||
|
||||
SCM
|
||||
scm_integer_negate_i (scm_t_inum x)
|
||||
{
|
||||
return long_to_scm (-x);
|
||||
}
|
||||
|
||||
SCM
|
||||
scm_integer_negate_z (struct scm_bignum *x)
|
||||
{
|
||||
/* Must normalize here because -SCM_MOST_NEGATIVE_FIXNUM is a bignum,
|
||||
but negating that gives a fixnum. */
|
||||
return normalize_bignum (negate_bignum (clone_bignum (x)));
|
||||
}
|
||||
|
||||
SCM
|
||||
scm_integer_sub_ii (scm_t_inum x, scm_t_inum y)
|
||||
{
|
||||
// Assumes that -INUM_MIN can fit in a scm_t_inum, even if that
|
||||
// scm_t_inum is not fixable, and that scm_integer_add_ii can handle
|
||||
// scm_t_inum inputs outside the fixable range.
|
||||
return scm_integer_add_ii (x, -y);
|
||||
}
|
||||
|
||||
SCM
|
||||
scm_integer_sub_iz (scm_t_inum x, struct scm_bignum *y)
|
||||
{
|
||||
return scm_integer_add_zi (negate_bignum (clone_bignum (y)), x);
|
||||
}
|
||||
|
||||
SCM
|
||||
scm_integer_sub_zi (struct scm_bignum *x, scm_t_inum y)
|
||||
{
|
||||
// Assumes that -INUM_MIN can fit in a scm_t_inum, even if that
|
||||
// scm_t_inum is not fixable, and that scm_integer_add_ii can handle
|
||||
// scm_t_inum inputs outside the fixable range.
|
||||
return scm_integer_add_zi (x, -y);
|
||||
}
|
||||
|
||||
SCM
|
||||
scm_integer_sub_zz (struct scm_bignum *x, struct scm_bignum *y)
|
||||
{
|
||||
return scm_integer_add_zz (x, negate_bignum (clone_bignum (y)));
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue