X-Git-Url: http://git.hcoop.net/bpt/guile.git/blobdiff_plain/ac6ce16bc9ae1de176da2d75d187a46bfdff825a..26d148066f9cb20e395a7dc4fefdf2e2ef0b2fb0:/libguile/numbers.h diff --git a/libguile/numbers.h b/libguile/numbers.h index 10a4f170f..01eb2cfcd 100644 --- a/libguile/numbers.h +++ b/libguile/numbers.h @@ -3,7 +3,8 @@ #ifndef SCM_NUMBERS_H #define SCM_NUMBERS_H -/* Copyright (C) 1995,1996,1998,2000,2001,2002,2003,2004,2005, 2006, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. +/* Copyright (C) 1995,1996,1998,2000,2001,2002,2003,2004,2005, 2006, + * 2008, 2009, 2010, 2011, 2013 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -125,8 +126,8 @@ typedef scm_t_int32 scm_t_wchar; #define SCM_INEXACTP(x) \ (!SCM_IMP (x) && (0xfeff & SCM_CELL_TYPE (x)) == scm_tc16_real) -#define SCM_REALP(x) (!SCM_IMP (x) && SCM_TYP16 (x) == scm_tc16_real) -#define SCM_COMPLEXP(x) (!SCM_IMP (x) && SCM_TYP16 (x) == scm_tc16_complex) +#define SCM_REALP(x) (SCM_HAS_TYP16 (x, scm_tc16_real)) +#define SCM_COMPLEXP(x) (SCM_HAS_TYP16 (x, scm_tc16_complex)) #define SCM_REAL_VALUE(x) (((scm_t_double *) SCM2PTR (x))->real) #define SCM_COMPLEX_REAL(x) (((scm_t_complex *) SCM2PTR (x))->real) @@ -134,15 +135,12 @@ typedef scm_t_int32 scm_t_wchar; /* Each bignum is just an mpz_t stored in a double cell starting at word 1. */ #define SCM_I_BIG_MPZ(x) (*((mpz_t *) (SCM_CELL_OBJECT_LOC((x),1)))) -#define SCM_BIGP(x) (!SCM_IMP (x) && SCM_TYP16 (x) == scm_tc16_big) +#define SCM_BIGP(x) (SCM_HAS_TYP16 (x, scm_tc16_big)) #define SCM_NUMBERP(x) (SCM_I_INUMP(x) || SCM_NUMP(x)) -#define SCM_NUMP(x) (!SCM_IMP(x) \ - && (((0xfcff & SCM_CELL_TYPE (x)) == scm_tc7_number) \ - || ((0xfbff & SCM_CELL_TYPE (x)) == scm_tc7_number))) -/* 0xfcff (#b1100) for 0 free, 1 big, 2 real, 3 complex, then 0xfbff (#b1011) for 4 fraction */ +#define SCM_NUMP(x) (SCM_HAS_TYP7 (x, scm_tc7_number)) -#define SCM_FRACTIONP(x) (!SCM_IMP (x) && SCM_TYP16 (x) == scm_tc16_fraction) +#define SCM_FRACTIONP(x) (SCM_HAS_TYP16 (x, scm_tc16_fraction)) #define SCM_FRACTION_NUMERATOR(x) (SCM_CELL_OBJECT_1 (x)) #define SCM_FRACTION_DENOMINATOR(x) (SCM_CELL_OBJECT_2 (x)) @@ -167,6 +165,7 @@ typedef struct scm_t_complex SCM_API SCM scm_exact_p (SCM x); +SCM_API int scm_is_exact (SCM x); SCM_API SCM scm_odd_p (SCM n); SCM_API SCM scm_even_p (SCM n); SCM_API SCM scm_finite_p (SCM x); @@ -178,12 +177,24 @@ SCM_API SCM scm_abs (SCM x); SCM_API SCM scm_quotient (SCM x, SCM y); SCM_API SCM scm_remainder (SCM x, SCM y); SCM_API SCM scm_modulo (SCM x, SCM y); -SCM_API SCM scm_euclidean_divide (SCM x, SCM y); +SCM_API void scm_euclidean_divide (SCM x, SCM y, SCM *q, SCM *r); SCM_API SCM scm_euclidean_quotient (SCM x, SCM y); SCM_API SCM scm_euclidean_remainder (SCM x, SCM y); -SCM_API SCM scm_centered_divide (SCM x, SCM y); +SCM_API void scm_floor_divide (SCM x, SCM y, SCM *q, SCM *r); +SCM_API SCM scm_floor_quotient (SCM x, SCM y); +SCM_API SCM scm_floor_remainder (SCM x, SCM y); +SCM_API void scm_ceiling_divide (SCM x, SCM y, SCM *q, SCM *r); +SCM_API SCM scm_ceiling_quotient (SCM x, SCM y); +SCM_API SCM scm_ceiling_remainder (SCM x, SCM y); +SCM_API void scm_truncate_divide (SCM x, SCM y, SCM *q, SCM *r); +SCM_API SCM scm_truncate_quotient (SCM x, SCM y); +SCM_API SCM scm_truncate_remainder (SCM x, SCM y); +SCM_API void scm_centered_divide (SCM x, SCM y, SCM *q, SCM *r); SCM_API SCM scm_centered_quotient (SCM x, SCM y); SCM_API SCM scm_centered_remainder (SCM x, SCM y); +SCM_API void scm_round_divide (SCM x, SCM y, SCM *q, SCM *r); +SCM_API SCM scm_round_quotient (SCM x, SCM y); +SCM_API SCM scm_round_remainder (SCM x, SCM y); SCM_API SCM scm_gcd (SCM x, SCM y); SCM_API SCM scm_lcm (SCM n1, SCM n2); SCM_API SCM scm_logand (SCM n1, SCM n2); @@ -194,11 +205,19 @@ SCM_API SCM scm_logbit_p (SCM n1, SCM n2); SCM_API SCM scm_lognot (SCM n); SCM_API SCM scm_modulo_expt (SCM n, SCM k, SCM m); SCM_API SCM scm_integer_expt (SCM z1, SCM z2); -SCM_API SCM scm_ash (SCM n, SCM cnt); +SCM_API SCM scm_ash (SCM n, SCM count); +SCM_API SCM scm_round_ash (SCM n, SCM count); SCM_API SCM scm_bit_extract (SCM n, SCM start, SCM end); SCM_API SCM scm_logcount (SCM n); SCM_API SCM scm_integer_length (SCM n); +SCM_INTERNAL SCM scm_i_euclidean_divide (SCM x, SCM y); +SCM_INTERNAL SCM scm_i_floor_divide (SCM x, SCM y); +SCM_INTERNAL SCM scm_i_ceiling_divide (SCM x, SCM y); +SCM_INTERNAL SCM scm_i_truncate_divide (SCM x, SCM y); +SCM_INTERNAL SCM scm_i_centered_divide (SCM x, SCM y); +SCM_INTERNAL SCM scm_i_round_divide (SCM x, SCM y); + SCM_INTERNAL SCM scm_i_gcd (SCM x, SCM y, SCM rest); SCM_INTERNAL SCM scm_i_lcm (SCM x, SCM y, SCM rest); SCM_INTERNAL SCM scm_i_logand (SCM x, SCM y, SCM rest); @@ -224,6 +243,7 @@ SCM_API SCM scm_real_p (SCM x); SCM_API SCM scm_rational_p (SCM z); SCM_API SCM scm_integer_p (SCM x); SCM_API SCM scm_inexact_p (SCM x); +SCM_API int scm_is_inexact (SCM x); SCM_API SCM scm_num_eq_p (SCM x, SCM y); SCM_API SCM scm_less_p (SCM x, SCM y); SCM_API SCM scm_gr_p (SCM x, SCM y); @@ -272,6 +292,7 @@ SCM_API SCM scm_log (SCM z); SCM_API SCM scm_log10 (SCM z); SCM_API SCM scm_exp (SCM z); SCM_API SCM scm_sqrt (SCM z); +SCM_API void scm_exact_integer_sqrt (SCM k, SCM *s, SCM *r); SCM_INTERNAL SCM scm_i_min (SCM x, SCM y, SCM rest); SCM_INTERNAL SCM scm_i_max (SCM x, SCM y, SCM rest); @@ -279,6 +300,7 @@ SCM_INTERNAL SCM scm_i_sum (SCM x, SCM y, SCM rest); SCM_INTERNAL SCM scm_i_difference (SCM x, SCM y, SCM rest); SCM_INTERNAL SCM scm_i_product (SCM x, SCM y, SCM rest); SCM_INTERNAL SCM scm_i_divide (SCM x, SCM y, SCM rest); +SCM_INTERNAL SCM scm_i_exact_integer_sqrt (SCM k); /* bignum internal functions */ SCM_INTERNAL SCM scm_i_mkbig (void); @@ -480,6 +502,18 @@ SCM_API SCM scm_from_mpz (mpz_t rop); #endif #endif +#if SCM_SIZEOF_SCM_T_PTRDIFF == 4 +#define scm_to_ptrdiff_t scm_to_int32 +#define scm_from_ptrdiff_t scm_from_int32 +#else +#if SCM_SIZEOF_SCM_T_PTRDIFF == 8 +#define scm_to_ptrdiff_t scm_to_int64 +#define scm_from_ptrdiff_t scm_from_int64 +#else +#error sizeof(scm_t_ptrdiff) is not 4 or 8. +#endif +#endif + /* conversion functions for double */ SCM_API int scm_is_real (SCM val); @@ -499,6 +533,9 @@ SCM_API double scm_c_angle (SCM z); SCM_API int scm_is_number (SCM val); +/* If nonzero, tell gmp to use GC_malloc for its allocations. */ +SCM_API int scm_install_gmp_memory_functions; + SCM_INTERNAL void scm_init_numbers (void); #endif /* SCM_NUMBERS_H */