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

575 commits

Author SHA1 Message Date
Daniel Llorens
54c4753dd3 Add missing branch in scm_is_less_than()
Fixes https://debbugs.gnu.org/69725.

* libguile/numbers.c (scm_is_less_than): Add branch for (< fraction real).
* test-suite/tests/numbers.test (<): New test.
2024-03-19 16:03:09 +01:00
Daniel Llorens
c0004442b7 Fix bad arguments to range_error() in numbers.c
Fixes https://debbugs.gnu.org/cgi/bugreport.cgi?bug=58154. Ouch.
2022-09-30 12:02:12 +02:00
Mikael Djurfeldt
27b86a6f32 Align argument type of scm_to_wchar with its declaration.
* libguile/numbers.c (scm_from_wchar): Change argument type from wchar_t
to scm_t_wchar which is the argument type in numbers.h.
2022-02-10 12:41:59 +01:00
Mikael Djurfeldt
2e10a1257f Align return type of scm_to_wchar with its declaration.
* libguile/numbers.c (scm_t_wchar): Change return type from wchar_t to
scm_t_wchar which is the return type in numbers.h.
2022-02-10 12:36:06 +01:00
Daniel Llorens
19bc021e34 Have log and log10(real nan) return real nan regardless of sign
* libguile/numbers.c (log_of_shifted_double, scm_log10): Avoid complex
  extension when the argument is a real nan.
* test-suite/tests/numbers.test: Tests for nans of either sign.
2022-01-13 09:37:17 +01:00
Daniel Llorens
4feff820be Don't use HAVE_COPYSIGN in libguile/numbers.c
* libguile/numbers.c (icmplx2str): As stated. copysign() is required by C99 and
  already used without guards elsewhere in this file.
2022-01-13 09:37:17 +01:00
Daniel Llorens
6058d9e05d Simplify scm_abs for the real case
* libguile/numbers.c (scm_abs): As stated. When x is a nan with the sign bit
  set, this changes the behavior of (magnitude x) back to what it was in 3.0.7,
  to clear that bit.
2022-01-13 09:37:17 +01:00
Andy Wingo
5481222670 Re-rewrite integer-expt in C
Calling out to Scheme was a performance regression.

* libguile/integers.h:
* libguile/integers.c (scm_integer_expt_ii, scm_integer_expt_zi): New
internal functions.
* libguile/numbers.c (scm_integer_expt): Go back to C.  But, include
fast cases for inums and doubles.
* module/ice-9/boot-9.scm: Revert addition of integer-expt.
2022-01-13 09:37:17 +01:00
Andy Wingo
aa5455ea98 Bignums avoid both custom GMP allocator and finalizers
* libguile/deprecated.c (make_bignum): Move here from numbers.c, to
support scm_i_long2big etc.
(scm_i_big2dbl):
(scm_i_long2big):
(scm_i_ulong2big):
(scm_i_clonebig):
(scm_i_normbig): Deprecate.
(scm_install_gmp_memory_functions): Deprecate, happily!  SCM bignums now
have digits allocated inline with the bignum itself, so they are
completely transparent to the GC already.  The price is that if GMP ever
allocates digits via the MPZ API, those digits then have to be copied
back into managed memory.  But we avoid having to install finalizers and
we avoid having to muck with GMP's allocator.
* libguile/numbers.c (scm_from_mpz): Use scm_integer_from_mpz.
(scm_init_numbers): Never muck with GMP's allocators.
* doc/ref/guile-invoke.texi (Environment Variables): Remove note about
GUILE_INSTALL_GMP_MEMORY_FUNCTIONS.
* meta/build-env.in: No need to set GUILE_INSTALL_GMP_MEMORY_FUNCTIONS.
2022-01-13 09:37:17 +01:00
Andy Wingo
bdddef3cfd Avoid scm_i_mkbig outside numbers.c.
* libguile/random.c (scm_c_random_bignum):
* libguile/socket.c (scm_from_ipv6): Avoid scm_i_mkbig.
* libguile/numbers.h:
* libguile/numbers.c (scm_i_mkbig): Remove.
2022-01-13 09:37:17 +01:00
Andy Wingo
0c502a4d3c Use scm_integer_to_double_z in numbers.c instead of big2dbl
* libguile/numbers.c: Use internal function instead of big2dbl which we
will deprecate.
2022-01-13 09:37:17 +01:00
Andy Wingo
7029a9c491 Simplify magnitude, angle
* libguile/numbers.c (scm_i_inum2big): Remove.
(scm_magnitude): Delegate to abs.
(scm_angle): Simplify.
2022-01-13 09:37:17 +01:00
Andy Wingo
3d56a90736 Remove last non-admin SCM_I_BIG_MPZ uses in numbers.c
* libguile/numbers.c (scm_magnitude, scm_angle): Use integers lib.
2022-01-13 09:37:17 +01:00
Andy Wingo
a4524da8c1 Simplify scm_exact_integer_quotient
* libguile/integers.h:
* libguile/integers.c (scm_integer_exact_quotient_iz): New internal
function.
* libguile/numbers.c (scm_i_make_ratio): Simplify and enforce
invariants.
(scm_exact_integer_quotient): Use integer lib.
2022-01-13 09:37:17 +01:00
Andy Wingo
0754dbf3e8 divide2double refactor
* libguile/integers.c (scm_integer_set_mpz_z): New internal function.
(scm_integer_init_set_mpz_z): Rename from scm_integer_to_mpz_z.
* libguile/integers.h:
* libguile/numbers.c (scm_i_divide2double): Avoid SCM_I_BIG_MPZ.
2022-01-13 09:37:17 +01:00
Andy Wingo
c06fc3df54 Remove dead bignum frexp code from numbers.c
* libguile/numbers.c (scm_i_big2dbl_2exp): Remove unused function.
2022-01-13 09:37:17 +01:00
Andy Wingo
f167627bb0 Expose frexp from integers lib
* libguile/integers.h:
* libguile/integers.c (scm_integer_frexp_z): Expose internally.
(scm_integer_to_double_z):
(scm_integer_inexact_sqrt_z): Adapt uses.
* libguile/numbers.c (log_of_exact_integer): Use exposed
scm_integer_frexp_z.
2022-01-13 09:37:17 +01:00
Andy Wingo
124d889227 Refactor scm_sqrt in terms of integers.[ch]
* libguile/integers.h:
* libguile/integers.c (scm_is_integer_perfect_square_i):
(scm_is_integer_perfect_square_z):
(scm_integer_floor_sqrt_i):
(scm_integer_floor_sqrt_z):
(scm_integer_inexact_sqrt_i):
(scm_integer_inexact_sqrt_z): New internal functions.
* libguile/numbers.c (scm_sqrt): Reimplement.
2022-01-13 09:37:17 +01:00
Andy Wingo
63a18a6c1a Reimplement exact-integer-sqrt with integers.[ch]
* libguile/numbers.c (scm_exact_integer_sqrt): Call out.
* libguile/integers.h:
* libguile/integers.c (scm_integer_exact_sqrt_i):
(scm_integer_exact_sqrt_z): New internal functions.
2022-01-13 09:37:17 +01:00
Andy Wingo
9a91c20a55 scm_to_mpz uses integer lib
* libguile/integers.h:
* libguile/integers.c (scm_integer_to_mpz_z): New internal function.
* libguile/numbers.c (scm_to_mpz): Use new function.
2022-01-13 09:37:17 +01:00
Andy Wingo
106c5de5fc Implement scm_{to,from}_wchar inline
* libguile/numbers.c (scm_to_wchar, scm_from_wchar): Implement inline.
2022-01-13 09:37:17 +01:00
Andy Wingo
1802ed17b3 Reimplement scm_{to,from}_{int64,uint64}
* libguile/numbers.c (scm_to_int64, scm_from_int64, scm_to_uint64):
(scm_from_uint64): Reimplement inline.
2022-01-13 09:37:17 +01:00
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
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