1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-04-30 20:00:19 +02:00
Commit graph

21194 commits

Author SHA1 Message Date
Andy Wingo
717e787da6 Reimplement scm_{to,from}_{int32,uint32}
* libguile/numbers.c (scm_to_int32, scm_from_int32, scm_to_uint32):
(scm_from_uint32): Reimplement inline.
* libguile/integers.c (make_bignum_2):
(make_bignum_from_uint64):
(negative_uint32_to_int32):
(positive_uint32_to_int32):
(bignum_to_int32):
(bignum_to_uint32):
(scm_integer_from_int32):
(scm_integer_from_uint32):
(scm_integer_to_int32_z):
(scm_integer_to_uint32_z): Better int32 support for 32-bit machines.
2022-01-13 09:37:17 +01:00
Andy Wingo
27910181c5 Reimplement scm_from_int8 etc
* libguile/integers.c (make_bignum_from_uint64):
(make_bignum_from_int64): New helpers.
(scm_integer_from_int64):
(scm_integer_from_uint64): New internal functions.
* libguile/integers.h: Declare new internal functions.
* libguile/numbers.c (range_error): Declare as noreturn.xo
(inum_in_range): New helper.
(scm_from_signed_integer):
(scm_to_signed_integer):
(scm_from_unsigned_integer):
(scm_to_unsigned_integer):
(scm_to_int8):
(scm_from_int8):
(scm_to_uint8):
(scm_from_uint8):
(scm_to_int16):
(scm_from_int16):
(scm_to_uint16):
(scm_from_uint16): Implement manually.
2022-01-13 09:37:16 +01:00
Andy Wingo
f4db3ca3f9 Reimplement scm_is_{un,}signed_integer for bignums
* libguile/integers.c (negative_int64):
(int64_magnitude):
(negative_uint64_to_int64):
(positive_uint64_to_int64):
(bignum_to_int64):
(bignum_to_uint64): New helpers.
(scm_integer_to_int64_z):
(scm_integer_to_uint64_z): New internal functions.
* libguile/integers.h: Declare internal functions.
* libguile/numbers.c (scm_is_signed_integer):
(scm_is_unsigned_integer): Simplify bigint cases.
2022-01-13 09:37:16 +01:00
Andy Wingo
7c53325c31 Fix scm_integer_to_double_z to always round; clean ups
* libguile/integers.c (scm_integer_to_double_z): Doubles that can't be
exactly represented as integers should round.
(bignum_frexp_z): New helper.
(scm_integer_from_mpz, scm_integer_from_double): New internal functions.
* libguile/numbers.h:
* libguile/numbers.c (scm_i_bigcmp, scm_i_dbl2big, scm_i_dbl2num):
Remove unused internal functions.
(scm_inexact_to_exact): Rework to avoid scm_i_dbl2big.
(scm_bigequal): Move here, from eq.c.
(scm_integer_to_double_z): Use the new helper.
(scm_i_big2dbl): Use scm_integer_to_double_z.
2022-01-13 09:37:16 +01:00
Andy Wingo
f2390e510f Fix deprecated bit-count* when counting 0 bits
* libguile/deprecated.c (scm_bit_count_star): Fix logic to count 0
bits.
2022-01-13 09:37:16 +01:00
Andy Wingo
8b2d58b993 Clean up scm_divide
* libguile/integers.h:
* libguile/integers.c (scm_is_integer_divisible_ii):
(scm_is_integer_divisible_zi):
(scm_is_integer_divisible_zz): New helpers.
* libguile/numbers.c (invert, divide, complex_div): New helpers for
scm_divide.
(scm_divide): Adapt.
2022-01-13 09:37:16 +01:00
Andy Wingo
3e08c9cec0 Remove support for allowing exact numbers to be divided by zero
* libguile/numbers.c: We require IEEE infinities and NaN so there is no
case in which ALLOW_DIVIDE_BY_ZERO would not be defined.
(scm_divide, scm_tan, scm_tanh, scm_log, scm_log10): Always throw on
overflow for divide by exact zero, never throw for divide by inexact
zero.
2022-01-13 09:37:16 +01:00
Andy Wingo
9179525a05 Simplify scm_product, use integer lib
* libguile/numbers.c (scm_product): Remove need for s_product defines.
Call out to product, as appropriate.
(product): New helper.
* libguile/integers.h:
* libguile/integers.c (scm_integer_mul_ii):
(scm_integer_mul_zi):
(scm_integer_mul_zz): New internal functions.
2022-01-13 09:37:16 +01:00
Andy Wingo
c096670d38 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.
2022-01-13 09:37:16 +01:00
Andy Wingo
10953e067c Clean up scm_sum
* libguile/integers.h:
* libguile/integers.c (scm_integer_to_double_z):
(scm_integer_add_ii, scm_integer_add_zi, scm_integer_add_zz): New
internal functions.
* libguile/numbers.c (sum): New helper for scm_sum.  Clean up to avoid
repetition.  The dispatch is less optimal but the code is shorter and
more maintainable; in any case if speed is important, the compiler needs
to be involved.
(scm_sum): Adapt.
2022-01-13 09:37:16 +01:00
Andy Wingo
281aed8aa0 Simplify implementation of min, max
* libguile/numbers.c (scm_max, scm_min): Lean more on scm_is_less_than.
2022-01-13 09:37:16 +01:00
Andy Wingo
f507c97380 positive?, negative? use integer lib
* libguile/numbers.c (scm_positive_p, scm_negative_p): Use integer lib.
2022-01-13 09:37:16 +01:00
Andy Wingo
54d7722523 Clean up <, reimplement in terms of integer lib
* libguile/numbers.c (scm_is_less_than, scm_is_greater_than):
(scm_is_less_than_or_equal, scm_is_greater_than_or_equal): New internal
functions.
(scm_less_p, scm_gr_p, scm_leq_p, scm_geq_p): Use new helpers.  Dispatch
to generics if operands aren't real -- a tightening relative to the
previous check which was just for numbers.
* libguile/integers.h:
* libguile/integers.c (scm_is_integer_less_than_ir):
(scm_is_integer_less_than_ri):
(scm_is_integer_less_than_zz):
(scm_is_integer_less_than_zr):
(scm_is_integer_less_than_rz):
(scm_is_integer_positive_z):
(scm_is_integer_negative_z): New internal functions.
2022-01-13 09:37:16 +01:00
Andy Wingo
44bee08512 Reimplement = on integer lib, clean up scm_num_eq_p
* libguile/integers.h:
* libguile/integers.c (scm_is_integer_equal_ir):
(scm_is_integer_equal_ic):
(scm_is_integer_equal_zz):
(scm_is_integer_equal_zr):
(scm_is_integer_equal_zc): New internal functions.
* libguile/numbers.c (scm_num_eq_p): Rework to tail-recurse if we need
to swap arguments, to reduce duplication, and use the new integer lib.
2022-01-13 09:37:16 +01:00
Andy Wingo
ef5ade30f9 Build scm_integer_p on scm_is_integer, not vice versa
* libguile/numbers.c: Switch layering of scm_is_integer /
scm_is_exact_integer and their SCM-valued counterparts.
2022-01-13 09:37:16 +01:00
Andy Wingo
24ce3cedfc Simplify scm_bigprint
* libguile/numbers.c (scm_bigprint): Just convert the number to a string
and write that.  Adds a copy but if we optimize scm_integer_to_string_z
then that will be fixed.
2022-01-13 09:37:16 +01:00
Andy Wingo
fc36cd610d Implement integer-to-string with new integer library
* libguile/integers.c (scm_integer_to_string_i)
(scm_integer_to_string_z): New internal functions.
* libguile/integers.h: Declare the new internal functions.
* libguile/numbers.c (scm_number_to_string): Use new internal
functions.
2022-01-13 09:37:16 +01:00
Andy Wingo
fc4228c196 Implement scm_integer_length with new integer library
* libguile/integers.c (scm_integer_length_i)
(scm_integer_length_z): New internal functions.
* libguile/integers.h: Declare the new internal functions.
* libguile/numbers.c (scm_integer_length): Use new internal functions.
2022-01-13 09:37:16 +01:00
Andy Wingo
8b99ace658 Integer library takes bignums via opaque struct pointer
* libguile/integers.h (scm_bignum): Declare opaque struct type and a
function to cast SCM to this type.  Adapt all routines that take bignums
to take a "struct scm_bignum *".
* libguile/integers.c: Adapt.
* libguile/numbers.c: Adapt all users.
2022-01-13 09:37:16 +01:00
Andy Wingo
7ec40fe5b0 Implement scm_logcount with new integer library
* libguile/integers.c (scm_integer_logcount_i)
(scm_integer_logcount_z): New internal functions.
* libguile/integers.h: Declare the new internal functions.
* libguile/numbers.c (scm_logcount): Use new internal functions.
2022-01-13 09:37:16 +01:00
Andy Wingo
88f56e91aa Implement scm_bit_extract with new integer library
* libguile/integers.c (scm_integer_bit_extract_i)
(scm_integer_bit_extract_z): New internal functions.
* libguile/integers.h: Declare the new internal functions.
* libguile/numbers.c (scm_bit_extract): Use new internal functions.
2022-01-13 09:37:16 +01:00
Andy Wingo
35861b28bb Implement scm_ash with new integer library
* libguile/integers.c (scm_integer_lsh_iu, scm_integer_lsh_zu)
(scm_integer_floor_rsh_iu, scm_integer_floor_rsh_zu)
(scm_integer_round_rsh_iu, scm_integer_round_rsh_zu): New internal
functions.
* libguile/integers.h: Declare the new internal functions.
* libguile/numbers.c (scm_ash): Use new internal functions.
2022-01-13 09:37:16 +01:00
Andy Wingo
3ad3ac740f Reimplement integer-expt in Scheme
* libguile/numbers.c (integer_expt_var): New static variable.
(init_integer_expt_var): New helper.
(scm_integer_expt): Delegate to Scheme.
* module/ice-9/boot-9.scm (integer-expt): Reimplement in Scheme.  Misses
some optimizations for fractions but that is probably OK!
2022-01-13 09:37:16 +01:00
Andy Wingo
2d5dc6a14c Implement scm_modulo_expt with new integer library
* libguile/integers.c (scm_integer_modulo_expt_nnn):
(integer_init_mpz): New helper.
* libguile/integers.h: Declare the new internal function.
* libguile/numbers.c (scm_modulo_expt): Use new internal function.
2022-01-13 09:37:16 +01:00
Andy Wingo
b41714d277 Implement scm_lognot with new integer library
* libguile/integers.c (scm_integer_lognot_i, scm_integer_lognot_z):
* libguile/integers.h: Declare the new internal functions.
* libguile/numbers.c (scm_lognot): Use new internal functions.
2022-01-13 09:37:16 +01:00
Andy Wingo
89cd48fcac Implement scm_logbit_p with new integer library
* libguile/integers.c (scm_integer_logbit_ui, scm_integer_logbit_uz):
* libguile/integers.h: Declare the new internal functions.
* libguile/numbers.c (scm_logbit_p): Use new internal functions.
2022-01-13 09:37:16 +01:00
Andy Wingo
6298d73115 Implement scm_logtest with new integer library
* libguile/integers.c (scm_integer_logtest_ii, scm_integer_logtest_zi)
(scm_integer_logtest_zz): New internal functions.
* libguile/integers.h: Declare the new internal functions.
* libguile/numbers.c (scm_logtest): Use new internal functions.
2022-01-13 09:37:16 +01:00
Andy Wingo
459163fca1 Implement scm_logxor with new integer library
* libguile/integers.c (scm_integer_logxor_ii, scm_integer_logxor_zi)
(scm_integer_logxor_zz): New internal functions.
* libguile/integers.h: Declare the new internal functions.
* libguile/numbers.c (scm_logxor): Use new internal functions.
2022-01-13 09:37:16 +01:00
Andy Wingo
7e85ffa822 Implement scm_logior with new integer library
* libguile/integers.c (scm_integer_logior_ii, scm_integer_logior_zi)
(scm_integer_logior_zz): New internal functions.
* libguile/integers.h: Declare the new internal functions.
* libguile/numbers.c (scm_logior): Use new internal functions.
2022-01-13 09:37:16 +01:00
Andy Wingo
4a380aa6ac Implement scm_logand with new integer library
* libguile/integers.c (scm_integer_logand_ii, scm_integer_logand_zi)
(scm_integer_logand_zz): New internal functions.
* libguile/integers.h: Declare the new internal functions.
* libguile/numbers.c (scm_logand): Use new internal functions.
2022-01-13 09:37:16 +01:00
Andy Wingo
6fa9fcb313 Implement lcm with new integer lib
* libguile/integers.c (scm_integer_lcm_ii)
(scm_integer_lcm_zi, scm_integer_lcm_zz): New internal functions.
* libguile/integers.h: Declare internal functions.
* libguile/numbers.c (scm_lcm): Use the new functions.
2022-01-13 09:37:16 +01:00
Andy Wingo
1e0797db72 Implement gcd with new integer lib
* libguile/integers.c (scm_integer_gcd_ii)
(scm_integer_gcd_zi, scm_integer_gcd_zz): New internal functions.
* libguile/integers.h: Declare internal functions.
* libguile/numbers.c (scm_gcd): Use the new functions.
2022-01-13 09:37:16 +01:00
Andy Wingo
025c7c8045 Implement round-divide with new integer lib
* libguile/integers.c (scm_integer_round_divide_ii)
(scm_integer_round_divide_iz, scm_integer_round_divide_zi)
(scm_integer_round_divide_zz): New internal functions.
(integer_round_divide_zz): New helper.
* libguile/integers.h: Declare internal functions.
* libguile/numbers.c (scm_round_divide): Use the new functions.
(scm_i_bigint_round_divide): Remove unused helper.
2022-01-13 09:37:16 +01:00
Andy Wingo
b114642640 Implement round-remainder with new integer lib
* libguile/integers.c (scm_integer_round_remainder_ii)
(scm_integer_round_remainder_iz, scm_integer_round_remainder_zi)
(scm_integer_round_remainder_zz): New internal functions.
(integer_round_remainder_zz): New helper.
(long_sign, bignum_cmp_long): New helpers.
* libguile/integers.h: Declare internal functions.
* libguile/numbers.c (scm_round_remainder): Use the new functions.
(scm_i_bigint_round_remainder): Remove unused helper.
2022-01-13 09:37:16 +01:00
Andy Wingo
9a358a9632 Implement round-quotient with new integer lib
* libguile/integers.c (scm_integer_round_quotient_ii)
(scm_integer_round_quotient_iz, scm_integer_round_quotient_zi)
(scm_integer_round_quotient_zz): New internal functions.
(integer_round_quotient_zz): New helper.
(long_sign, bignum_cmp_long): New helpers.
* libguile/integers.h: Declare internal functions.
* libguile/numbers.c (scm_round_quotient): Use the new functions.
(scm_i_bigint_round_quotient): Remove unused helper.
2022-01-13 09:37:16 +01:00
Andy Wingo
ccb78fc7b1 Implement centered-divide with new integer lib
* libguile/integers.c (scm_integer_centered_divide_ii)
(scm_integer_centered_divide_iz, scm_integer_centered_divide_zi)
(scm_integer_centered_divide_zz): New internal functions.
(integer_centered_divide_zz): New helper.
* libguile/integers.h: Declare internal functions.
* libguile/numbers.c (scm_centered_divide): Use the new functions.
(scm_i_bigint_centered_divide): Remove unused helper.
2022-01-13 09:37:16 +01:00
Andy Wingo
99b046d58b Implement centered-remainder with new integer lib
* libguile/integers.c (scm_integer_centered_remainder_ii)
(scm_integer_centered_remainder_iz, scm_integer_centered_remainder_zi)
(scm_integer_centered_remainder_zz): New internal functions.
* libguile/integers.h: Declare internal functions.
* libguile/numbers.c (scm_centered_remainder): Use the new functions.
(scm_i_bigint_centered_remainder): Remove helper.
2022-01-13 09:37:16 +01:00
Andy Wingo
0ccdf06c81 Implement centered-quotient with new integer lib
* libguile/integers.c (scm_integer_centered_quotient_ii)
(scm_integer_centered_quotient_iz, scm_integer_centered_quotient_zi)
(scm_integer_centered_quotient_zz): New internal functions.
* libguile/integers.h: Declare internal functions.
* libguile/numbers.c (scm_centered_quotient): Use the new functions.
(scm_i_bigint_centered_quotient): Remove unused helper.
2022-01-13 09:37:16 +01:00
Andy Wingo
f8a92773ac Implement truncate-divide with new integer lib
* libguile/integers.c (scm_integer_truncate_divide_ii)
(scm_integer_truncate_divide_iz, scm_integer_truncate_divide_zi)
(scm_integer_truncate_divide_zz): New internal functions.
* libguile/integers.h: Declare internal functions.
* libguile/numbers.c (scm_truncate_divide): Use the new functions.
2022-01-13 09:37:16 +01:00
Andy Wingo
cbd62a0ef3 Implement truncate-remainder with new integer lib
* libguile/integers.c (scm_integer_truncate_remainder_ii)
(scm_integer_truncate_remainder_iz, scm_integer_truncate_remainder_zi)
(scm_integer_truncate_remainder_zz): New internal functions.
* libguile/integers.h: Declare internal functions.
* libguile/numbers.c (scm_truncate_remainder): Use the new functions.
2022-01-13 09:37:16 +01:00
Andy Wingo
ff636774b4 Implement truncate-quotient with new integer lib
* libguile/integers.c (scm_integer_truncate_quotient_ii)
(scm_integer_truncate_quotient_iz, scm_integer_truncate_quotient_zi)
(scm_integer_truncate_quotient_zz): New internal functions.
* libguile/integers.h: Declare internal functions.
* libguile/numbers.c (scm_truncate_quotient): Use the new functions.
2022-01-13 09:37:16 +01:00
Andy Wingo
1e1b230223 Implement ceiling-divide with new integer lib
* libguile/integers.c (scm_integer_ceiling_divide_ii)
(scm_integer_ceiling_divide_iz, scm_integer_ceiling_divide_zi)
(scm_integer_ceiling_divide_zz): New internal functions.
* libguile/integers.h: Declare internal functions.
* libguile/numbers.c (scm_ceiling_divide): Use the new functions.
2022-01-13 09:37:16 +01:00
Andy Wingo
55f93d7d29 Implement ceiling-remainder with new integer lib
* libguile/integers.c (scm_integer_ceiling_remainder_ii)
(scm_integer_ceiling_remainder_iz, scm_integer_ceiling_remainder_zi)
(scm_integer_ceiling_remainder_zz): New internal functions.
(bignum_is_positive): New helper.
* libguile/integers.h: Declare internal functions.
* libguile/numbers.c (scm_ceiling_remainder): Use the new functions.
2022-01-13 09:37:16 +01:00
Andy Wingo
c1d8dd5e6a Implement ceiling-quotient with new integer lib
* libguile/integers.c (scm_integer_ceiling_quotient_ii)
(scm_integer_ceiling_quotient_iz, scm_integer_ceiling_quotient_zi)
(scm_integer_ceiling_quotient_zz): New internal functions.
(take_bignum_from_mpz): Change to also normalize the mpz, as all callers
required.
(long_sign, bignum_cmp_long): New helpers.
* libguile/integers.h: Declare internal functions.
* libguile/numbers.c (scm_ceiling_quotient): Use the new functions.
2022-01-13 09:37:16 +01:00
Andy Wingo
8a63537458 Implement floor-divide with new integer lib
* libguile/integers.c (scm_integer_floor_divide_ii)
(scm_integer_floor_divide_iz, scm_integer_floor_divide_zi)
(scm_integer_floor_divide_zz): New internal functions.
* libguile/integers.h: Declare internal functions.
* libguile/numbers.c (scm_floor_divide): Use the new functions.
2022-01-13 09:37:16 +01:00
Andy Wingo
2e8036ff0f Implement floor-remainder with new integer lib
* libguile/integers.c (scm_integer_floor_remainder_ii)
(scm_integer_floor_remainder_iz, scm_integer_floor_remainder_zi)
(scm_integer_floor_remainder_zz): New internal functions.
* libguile/integers.h: Declare internal functions.
* libguile/numbers.c (scm_floor_remainder): Use the new functions.
2022-01-13 09:37:16 +01:00
Andy Wingo
31da9be6c4 Implement floor-quotient with new integer lib
* libguile/integers.c (scm_integer_floor_quotient_ii)
(scm_integer_floor_quotient_iz, scm_integer_floor_quotient_zi)
(scm_integer_floor_quotient_zz): New internal functions.
(long_to_scm, ulong_to_scm, take_bignum_from_mpz): New helpers.
* libguile/integers.h: Declare internal functions.
* libguile/numbers.c (scm_floor_quotient): Use the new functions.
2022-01-13 09:37:16 +01:00
Andy Wingo
44c654aa3e Implement abs with new integer lib
* libguile/integers.c (scm_integer_abs_i, scm_integer_abs_z): New
internal functions.
* libguile/integers.h: Declare internal functions.
* libguile/numbers.c (scm_abs): Use the new functions.
2022-01-13 09:37:16 +01:00
Andy Wingo
5321899b9a Implement odd? and even? with new integer lib
* libguile/integers.c (scm_is_integer_odd_i):
(scm_is_integer_odd_z): New internal functions.  Add a number of
internal support routines.
* libguile/integers.h: Declare internal functions.
* libguile/numbers.c (scm_odd_p, scm_even_p): Use the new functions.
2022-01-13 09:37:16 +01:00
Andy Wingo
c768115d93 Add new integers.[ch]
The goal is to factor out some fixnum/bignum code here from
numbers.[ch].

* libguile/Makefile.am: Add new files.
* libguile/integers.c:
* libguile/integers.h: New files
2022-01-13 09:37:16 +01:00