From 7c53325c31b86198b6c021c5c2b62c3742363619 Mon Sep 17 00:00:00 2001 From: Andy Wingo Date: Wed, 5 Jan 2022 21:12:01 +0100 Subject: 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. --- libguile/integers.h | 3 +++ 1 file changed, 3 insertions(+) (limited to 'libguile/integers.h') diff --git a/libguile/integers.h b/libguile/integers.h index 98c19b90f..bda575774 100644 --- a/libguile/integers.h +++ b/libguile/integers.h @@ -32,6 +32,8 @@ scm_bignum (SCM x) return (struct scm_bignum *) SCM_UNPACK (x); } +SCM_INTERNAL SCM scm_integer_from_mpz (mpz_srcptr mpz); + SCM_INTERNAL int scm_is_integer_odd_i (scm_t_inum i); SCM_INTERNAL int scm_is_integer_odd_z (struct scm_bignum *z); @@ -167,6 +169,7 @@ SCM_INTERNAL int scm_is_integer_positive_z (struct scm_bignum *x); SCM_INTERNAL int scm_is_integer_negative_z (struct scm_bignum *x); SCM_INTERNAL double scm_integer_to_double_z (struct scm_bignum *x); +SCM_INTERNAL SCM scm_integer_from_double (double val); SCM_INTERNAL SCM scm_integer_add_ii (scm_t_inum x, scm_t_inum y); SCM_INTERNAL SCM scm_integer_add_zi (struct scm_bignum *x, scm_t_inum y); -- cgit v1.2.1