( Title: Gforth bindings for the GNU Multiple Precision Floatint-Point Reliable Library, GNU MPFR 3.x.x File: libmpfr-gforth.fs Test file: gmpr-test.fs Author: David N. Williams License: LGPL 3 Version: 0.9.1 Started: March 25, 2011 Revised: January 4, 2020 Any part of this file not derived from the GMP library is ) \ Copyright (C) 2011, 2012, 2019, 2020 by David N. Williams ( This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3 of the License, or at your option any later version. This library is distributed in the hope that it will be useful but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. Functions in lines marked "NI" are currently not implemented in the bindings. Functions in lines marked "SPECIAL" require special handling, for libmpfr macros, or to cast an int to a long, where gforth's libgcc doesn't automagically do that for 64-bit ABI's. See the section SPECIAL BINDINGS near the end of this file. ) [UNDEFINED] BITS/CELL [IF] s" ADDRESS-UNIT-BITS" environment? 0= [IF] cr .( ***Can't determine BITS/CELL) ABORT [THEN] 1 cells * constant BITS/CELL [THEN] BITS/CELL 64 <> [IF] cr .( ***BITS/CELL must be 64) ABORT [THEN] c-library libmpfr64_gforth \ clear-libs s" mpfr" add-lib \ s" gmp" add-lib \ s" $HOME/lib" add-libpath \ irrelevant when lib* is in /usr/local/lib \c #include true [IF] \ either of these... \c #include [ELSE] \ ...works with OS X \c #include [THEN] \c #include \c #include \c #if !defined (__STDC__) \c #error __STDC__ not defined \c #endif \ libmpfr 4.0.x functions \ 5.1 Initialization c-function mpfr_init mpfr_init a -- void c-function mpfr_init2 mpfr_init2 a n -- void c-function mpfr_clear mpfr_clear a -- void c-function mpfr_set_default_prec mpfr_set_default_prec n -- void c-function mpfr_get_default_prec mpfr_get_default_prec -- n c-function mpfr_set_prec mpfr_set_prec a n -- void \ see LIBMPFR MACROS \ c-function mpfr_get_prec mpfr_get_prec a -- n \ 5.2 Assignment \ SPECIAL: mpfr_set c-function mpfr_set_ui mpfr_set_ui a n n -- n c-function mpfr_set_si mpfr_set_si a n n -- n c-function mpfr_set_uj mpfr_set_uj a n n -- n c-function mpfr_set_sj mpfr_set_sj a n n -- n c-function mpfr_set_flt mpfr_set_flt a r n -- n c-function mpfr_set_d mpfr_set_d a r n -- n \ SPECIAL: mpfr_set_ld c-function mpfr_set_z mpfr_set_z a a n -- n c-function mpfr_set_q mpfr_set_q a a n -- n c-function mpfr_set_f mpfr_set_f a a n -- n c-function mpfr_set_ui_2exp mpfr_set_ui_2exp a n n n -- n c-function mpfr_set_si_2exp mpfr_set_si_2exp a n n n -- n c-function mpfr_set_uj_2exp mpfr_set_uj_2exp a n n n -- n c-function mpfr_set_sj_2exp mpfr_set_sj_2exp a n n n -- n c-function mpfr_set_z_2exp mpfr_set_z_2exp a a n n -- n c-function mpfr_set_str mpfr_set_str a a n n -- n c-function mpfr_strtofr mpfr_strtofr a a a n n -- n c-function mpfr_set_nan mpfr_set_nan a -- void c-function mpfr_set_inf mpfr_set_inf a n -- void c-function mpfr_set_zero mpfr_set_zero a n -- void c-function mpfr_swap mpfr_swap a a -- void \ 5.3 Combined initialization and assignment 0 [IF] \ SPECIAL mpfr_init_set mpfr_init_set_ui mpfr_init_set_si mpfr_init_set_d \ NI: mpfr_init_set_ld mpfr_init_set_z mpfr_init_set_q mpfr_init_set_f [THEN] c-function mpfr_init_set_str mpfr_init_set_str a a n n -- n \ 5.4 Conversion c-function mpfr_get_flt mpfr_get_flt a n -- r c-function mpfr_get_d mpfr_get_d a n -- r \ NI: mpfr_get_ld c-function mpfr_get_si mpfr_get_si a n -- n c-function mpfr_get_ui mpfr_get_ui a n -- n c-function mpfr_get_sj mpfr_get_sj a n -- n c-function mpfr_get_uj mpfr_get_uj a n -- n c-function mpfr_get_d_2exp mpfr_get_d_2exp a a n -- r \ NI: mpfr_get_ld_2exp c-function mpfr_get_z_2exp mpfr_get_z_2exp a a -- n c-function mpfr_get_z mpfr_get_z a a n -- n c-function mpfr_get_f mpfr_get_f a a n -- n c-function mpfr_get_str mpfr_get_str a a n n a n -- a c-function mpfr_free_str mpfr_free_str a -- void c-function mpfr_fits_ulong_p mpfr_fits_ulong_p a n -- n c-function mpfr_fits_slong_p mpfr_fits_slong_p a n -- n c-function mpfr_fits_uint_p mpfr_fits_uint_p a n -- n c-function mpfr_fits_sint_p mpfr_fits_sint_p a n -- n c-function mpfr_fits_ushort_p mpfr_fits_ushort_p a n -- n c-function mpfr_fits_sshort_p mpfr_fits_sshort_p a n -- n c-function mpfr_fits_uintmax_p mpfr_fits_uintmax_p a n -- n c-function mpfr_fits_intmax_p mpfr_fits_intmax_p a n -- n \ 5.5 Basic Arithmetic c-function mpfr_add mpfr_add a a a n -- n c-function mpfr_add_ui mpfr_add_ui a a n n -- n c-function mpfr_add_si mpfr_add_si a a n n -- n c-function mpfr_add_d mpfr_add_d a a r n -- n c-function mpfr_add_z mpfr_add_z a a a n -- n c-function mpfr_add_q mpfr_add_q a a a n -- n c-function mpfr_sub mpfr_sub a a a n -- n c-function mpfr_ui_sub mpfr_ui_sub a n a n -- n c-function mpfr_sub_ui mpfr_sub_ui a a n n -- n c-function mpfr_si_sub mpfr_si_sub a n a n -- n c-function mpfr_sub_si mpfr_sub_si a a n n -- n c-function mpfr_d_sub mpfr_d_sub a r a n -- n c-function mpfr_sub_d mpfr_sub_d a a r n -- n c-function mpfr_sub_z mpfr_sub_z a a a n -- n c-function mpfr_sub_q mpfr_sub_q a a a n -- n c-function mpfr_mul mpfr_mul a a a n -- n c-function mpfr_mul_ui mpfr_mul_ui a a n n -- n c-function mpfr_mul_si mpfr_mul_si a a n n -- n c-function mpfr_mul_d mpfr_mul_d a a r n -- n c-function mpfr_mul_z mpfr_mul_z a a a n -- n c-function mpfr_mul_q mpfr_mul_q a a a n -- n c-function mpfr_sqr mpfr_sqr a a n -- n c-function mpfr_div mpfr_div a a a n -- n c-function mpfr_ui_div mpfr_ui_div a n a n -- n c-function mpfr_div_ui mpfr_div_ui a a n n -- n c-function mpfr_si_div mpfr_si_div a n a n -- n c-function mpfr_div_si mpfr_div_si a a n n -- n c-function mpfr_d_div mpfr_d_div a r a n -- n c-function mpfr_div_d mpfr_div_d a a r n -- n c-function mpfr_div_z mpfr_div_z a a a n -- n c-function mpfr_div_q mpfr_div_q a a a n -- n c-function mpfr_sqrt mpfr_sqrt a a n -- n c-function mpfr_sqrt_ui mpfr_sqrt_ui a n n -- n c-function mpfr_rec_sqrt mpfr_rec_sqrt a a n -- n c-function mpfr_cbrt mpfr_cbrt a a n -- n c-function mpfr_rootn_ui mpfr_rootn_ui a a n n -- n c-function mpfr_pow mpfr_pow a a a n -- n c-function mpfr_pow_ui mpfr_pow_ui a a n n -- n c-function mpfr_pow_si mpfr_pow_si a a n n -- n c-function mpfr_pow_z mpfr_pow_z a a a n -- n c-function mpfr_ui_pow_ui mpfr_ui_pow_ui a n n n -- n c-function mpfr_ui_pow mpfr_ui_pow a n a n -- n c-function mpfr_neg mpfr_neg a a n -- n c-function mpfr_abs mpfr_abs a a n -- n c-function mpfr_dim mpfr_dim a a a n -- n c-function mpfr_mul_2ui mpfr_mul_2ui a a n n -- n c-function mpfr_mul_2si mpfr_mul_2si a a n n -- n c-function mpfr_div_2ui mpfr_div_2ui a a n n -- n c-function mpfr_div_2si mpfr_div_2si a a n n -- n \ 5.6 Comparison c-function mpfr_cmp mpfr_cmp a a -- n c-function mpfr_cmp_ui mpfr_cmp_ui a n -- n c-function mpfr_cmp_si mpfr_cmp_si a n -- n c-function mpfr_cmp_d mpfr_cmp_d a r -- n \ NI: mpfr_cmp_ld c-function mpfr_eq mpfr_eq a a n -- n c-function mpfr_cmp_z mpfr_cmp_z a a -- n c-function mpfr_cmp_q mpfr_cmp_q a a -- n c-function mpfr_cmp_f mpfr_cmp_f a a -- n c-function mpfr_cmp_ui_2exp mpfr_cmp_ui_2exp a n n -- n c-function mpfr_cmp_si_2exp mpfr_cmp_si_2exp a n n -- n c-function mpfr_cmpabs mpfr_cmpabs a a -- n 0 [IF] \ SPECIAL mpfr_nan_p mpfr_inf_p mpfr_number_p mpfr_zero_p mpfr_regular_p mpfr_sgn [THEN] c-function mpfr_greater_p mpfr_greater_p a a -- n c-function mpfr_greaterequal_p mpfr_greaterequal_p a a -- n c-function mpfr_less_p mpfr_less_p a a -- n c-function mpfr_lessequal_p mpfr_lessequal_p a a -- n c-function mpfr_equal_p mpfr_equal_p a a -- n c-function mpfr_lessgreater_p mpfr_lessgreater_p a a -- n c-function mpfr_unordered_p mpfr_unordered_p a a -- n \ 5.7 Special Functions c-function mpfr_log mpfr_log a a n -- n c-function mpfr_log2 mpfr_log2 a a n -- n c-function mpfr_log10 mpfr_log10 a a n -- n c-function mpfr_exp mpfr_exp a a n -- n c-function mpfr_exp2 mpfr_exp2 a a n -- n c-function mpfr_exp10 mpfr_exp10 a a n -- n c-function mpfr_cos mpfr_cos a a n -- n c-function mpfr_sin mpfr_sin a a n -- n c-function mpfr_tan mpfr_tan a a n -- n c-function mpfr_sin_cos mpfr_sin_cos a a a n -- n c-function mpfr_sec mpfr_sec a a n -- n c-function mpfr_csc mpfr_csc a a n -- n c-function mpfr_cot mpfr_cot a a n -- n c-function mpfr_acos mpfr_acos a a n -- n c-function mpfr_asin mpfr_asin a a n -- n c-function mpfr_atan mpfr_atan a a n -- n c-function mpfr_atan2 mpfr_atan2 a a a n -- n c-function mpfr_cosh mpfr_cosh a a n -- n c-function mpfr_sinh mpfr_sinh a a n -- n c-function mpfr_tanh mpfr_tanh a a n -- n c-function mpfr_sinh_cosh mpfr_sinh_cosh a a a n -- n c-function mpfr_sech mpfr_sech a a n -- n c-function mpfr_csch mpfr_csch a a n -- n c-function mpfr_coth mpfr_coth a a n -- n c-function mpfr_acosh mpfr_acosh a a n -- n c-function mpfr_asinh mpfr_asinh a a n -- n c-function mpfr_atanh mpfr_atanh a a n -- n c-function mpfr_fac_ui mpfr_fac_ui a n n -- n c-function mpfr_log1p mpfr_log1p a a n -- n c-function mpfr_expm1 mpfr_expm1 a a n -- n c-function mpfr_eint mpfr_eint a a n -- n c-function mpfr_li2 mpfr_li2 a a n -- n c-function mpfr_gamma mpfr_gamma a a n -- n c-function mpfr_lngamma mpfr_lngamma a a n -- n \ SPECIAL: mpfr_lgamma c-function mpfr_digamma mpfr_digamma a a n -- n c-function mpfr_zeta mpfr_zeta a a n -- n c-function mpfr_zeta_ui mpfr_zeta_ui a n n -- n c-function mpfr_erf mpfr_erf a a n -- n c-function mpfr_erfc mpfr_erfc a a n -- n c-function mpfr_j0 mpfr_j0 a a n -- n c-function mpfr_j1 mpfr_j1 a a n -- n c-function mpfr_jn mpfr_jn a n a n -- n c-function mpfr_y0 mpfr_y0 a a n -- n c-function mpfr_y1 mpfr_y1 a a n -- n c-function mpfr_yn mpfr_yn a n a n -- n c-function mpfr_fma mpfr_fma a a a a n -- n c-function mpfr_fms mpfr_fms a a a a n -- n c-function mpfr_agm mpfr_agm a a a n -- n c-function mpfr_hypot mpfr_hypot a a a n -- n c-function mpfr_ai mpfr_ai a a n -- n c-function mpfr_const_log2 mpfr_const_log2 a n -- n c-function mpfr_const_pi mpfr_const_pi a n -- n c-function mpfr_const_euler mpfr_const_euler a n -- n c-function mpfr_const_catalan mpfr_const_catalan a n -- n c-function mpfr_free_cache mpfr_free_cache -- void c-function mpfr_sum mpfr_sum a a n n -- n \ 5.8 Input and output c-function mpfr_out_str mpfr_out_str a n n a n -- n c-function mpfr_inp_str mpfr_inp_str a a n n -- n \ 5.9 Formatted Output \ 5.10 Integer and Remainder Related Functions c-function mpfr_rint mpfr_rint a a n -- n c-function mpfr_ceil mpfr_ceil a a -- n c-function mpfr_floor mpfr_floor a a -- n c-function mpfr_round mpfr_round a a -- n c-function mpfr_trunc mpfr_trunc a a -- n c-function mpfr_rint_ceil mpfr_rint_ceil a a n -- n c-function mpfr_rint_floor mpfr_rint_floor a a n -- n c-function mpfr_rint_round mpfr_rint_round a a n -- n c-function mpfr_rint_trunc mpfr_rint_trunc a a n -- n c-function mpfr_frac mpfr_frac a a n -- n c-function mpfr_modf mpfr_modf a a a n -- n c-function mpfr_fmod mpfr_fmod a a a n -- n c-function mpfr_remainder mpfr_remainder a a a n -- n c-function mpfr_remquo mpfr_remquo a a a a n -- n c-function mpfr_integer_p mpfr_integer_p a -- n \ 5.11 Rounding Related Functions c-function mpfr_set_default_rounding_mode mpfr_set_default_rounding_mode n -- void c-function mpfr_get_default_rounding_mode mpfr_get_default_rounding_mode -- n c-function mpfr_prec_round mpfr_prec_round a n n -- n c-function mpfr_can_round mpfr_can_round a n n n n -- n c-function mpfr_min_prec mpfr_min_prec a -- n c-function mpfr_print_rnd_mode mpfr_print_rnd_mode n -- a \ 5.12 Miscellaneous Functions c-function mpfr_nexttoward mpfr_nexttoward a a -- void c-function mpfr_nextabove mpfr_nextabove a -- void c-function mpfr_nextbelow mpfr_nextbelow a -- void c-function mpfr_min mpfr_min a a a n -- n c-function mpfr_max mpfr_max a a a n -- n c-function mpfr_urandomb mpfr_urandomb a a -- n c-function mpfr_urandom mpfr_urandom a a n -- n \ SPECIAL: mpfr_get_exp c-function mpfr_set_exp mpfr_set_exp a n -- n \ SPECIAL: mpfr_signbit c-function mpfr_setsign mpfr_setsign a a n n -- n \ SPECIAL: mpfr_copysign c-function mpfr_get_version mpfr_get_version -- a c-value MPFR_VERSION_MAJOR MPFR_VERSION_MAJOR -- n c-value MPFR_VERSION_MINOR MPFR_VERSION_MINOR -- n c-value MPFR_VERSION_PATCHLEVEL MPFR_VERSION_PATCHLEVEL -- n \ 5.13 Exception Related Functions c-function mpfr_get_emin mpfr_get_emin -- n c-function mpfr_get_emax mpfr_get_emax -- n c-function mpfr_set_emin mpfr_set_emin n -- n c-function mpfr_set_emax mpfr_set_emax n -- n c-function mpfr_get_emin_min mpfr_get_emin_min -- n c-function mpfr_get_emin_max mpfr_get_emin_max -- n c-function mpfr_get_emax_min mpfr_get_emax_min -- n c-function mpfr_get_emax_max mpfr_get_emax_max -- n c-function mpfr_check_range mpfr_check_range a n n -- n c-function mpfr_subnormalize mpfr_subnormalize a n n -- n c-function mpfr_clear_underflow mpfr_clear_underflow -- void c-function mpfr_clear_overflow mpfr_clear_overflow -- void c-function mpfr_clear_nanflag mpfr_clear_nanflag -- void c-function mpfr_clear_inexflag mpfr_clear_inexflag -- void c-function mpfr_clear_erangeflag mpfr_clear_erangeflag -- void c-function mpfr_set_underflow mpfr_set_underflow -- void c-function mpfr_set_overflow mpfr_set_overflow -- void c-function mpfr_set_nanflag mpfr_set_nanflag -- void c-function mpfr_set_inexflag mpfr_set_inexflag -- void c-function mpfr_set_erangeflag mpfr_set_erangeflag -- void c-function mpfr_clear_flags mpfr_clear_flags -- void c-function mpfr_underflow_p mpfr_underflow_p -- n c-function mpfr_overflow_p mpfr_overflow_p -- n c-function mpfr_nanflag_p mpfr_nanflag_p -- n c-function mpfr_inexflag_p mpfr_inexflag_p -- n c-function mpfr_erangeflag_p mpfr_erangeflag_p -- n \ 5.14 Compatibility With MPF c-function mpfr_reldiff mpfr_reldiff a a a n -- void \ 5.15 Custom Interface \ SPECIAL BINDINGS \c int mpfr_init_set_macro (mpfr_t rop, mpfr_t op, mpfr_rnd_t rnd) \c { return mpfr_init_set (rop, op, rnd); } \c int mpfr_init_set_ui_macro (mpfr_t rop, mpfr_ulong op, mpfr_rnd_t rnd) \c { return mpfr_init_set_ui (rop, op, rnd); } \c int mpfr_init_set_si_macro (mpfr_t rop, mpfr_long op, mpfr_rnd_t rnd) \c { return mpfr_init_set_si (rop, op, rnd); } \c int mpfr_init_set_d_macro (mpfr_t rop, double op, mpfr_rnd_t rnd) \c { return mpfr_init_set_d (rop, op, rnd); } \c int mpfr_init_set_z_macro (mpfr_t rop, mpz_t op, mpfr_rnd_t rnd) \c { return mpfr_init_set_z (rop, op, rnd); } \c int mpfr_init_set_q_macro (mpfr_t rop, mpq_t op, mpfr_rnd_t rnd) \c { return mpfr_init_set_q (rop, op, rnd); } \c int mpfr_init_set_f_macro (mpfr_t rop, mpf_t op, mpfr_rnd_t rnd) \c { return mpfr_init_set_f (rop, op, rnd); } c-function mpfr_init_set mpfr_init_set_macro a a n -- n c-function mpfr_init_set_ui mpfr_init_set_ui_macro a n n -- n c-function mpfr_init_set_si mpfr_init_set_si_macro a n n -- n c-function mpfr_init_set_d mpfr_init_set_d_macro a r n -- n c-function mpfr_init_set_z mpfr_init_set_z_macro a a n -- n c-function mpfr_init_set_q mpfr_init_set_q_macro a a n -- n c-function mpfr_init_set_f mpfr_init_set_f_macro a a n -- n \c mpfr_prec_t mpfr_get_prec_macro (mpfr_t op) { return mpfr_get_prec (op); } \c mpfr_exp_t mpfr_get_exp_macro (mpfr_t op) { return mpfr_get_exp (op); } c-function mpfr_get_prec mpfr_get_prec_macro a -- n c-function mpfr_get_exp mpfr_get_exp_macro a -- n \c int mpfr_set_macro (mpfr_t rop, mpfr_t op, mpfr_rnd_t rnd) \c { return mpfr_set (rop, op, rnd); } \c int mpfr_copysign_macro (mpfr_t rop, mpfr_t op1, mpfr_t op2, mpfr_rnd_t rnd) \c { return mpfr_copysign (rop, op1, op2, rnd); } \c int mpfr_signbit_macro (mpfr_t op) { return mpfr_signbit (op); } c-function mpfr_set mpfr_set_macro a a n -- n c-function mpfr_copysign mpfr_copysign_macro a a a n -- n c-function mpfr_signbit mpfr_signbit_macro a -- n \c int mpfr_nan_p_macro (mpfr_ptr op) { return mpfr_nan_p (op); } \c int mpfr_inf_p_macro (mpfr_ptr op) { return mpfr_inf_p (op); } \c int mpfr_number_p_macro (mpfr_ptr op) { return mpfr_number_p (op); } \c int mpfr_zero_p_macro (mpfr_ptr op) { return mpfr_zero_p (op); } \c int mpfr_regular_p_macro (mpfr_ptr op) { return mpfr_regular_p (op); } \c int mpfr_sgn_macro (mpfr_ptr op) { return mpfr_sgn (op); } c-function mpfr_nan_p mpfr_nan_p_macro a -- n c-function mpfr_inf_p mpfr_inf_p_macro a -- n c-function mpfr_number_p mpfr_number_p_macro a -- n c-function mpfr_zero_p mpfr_zero_p_macro a -- n c-function mpfr_regular_p mpfr_regular_p_macro a -- n c-function mpfr_sgn mpfr_sgn_macro a -- n BITS/CELL 32 = [IF] c-function mpfr_lgamma mpfr_lgamma a a a n -- n [ELSE] \c int mpfr_lgamma_lsgn (mpfr_t rop, int *signp, mpfr_t op, mpfr_rnd_t rnd) \c { int t = mpfr_lgamma (rop, signp, op, rnd); \c *(long*)signp = *signp; \c return t; } c-function mpfr_lgamma mpfr_lgamma_lsgn a a a n -- n [THEN] \c int sizeof_mpfr (void) { return sizeof (mpfr_t); } c-function /MPFR sizeof_mpfr -- n \c mpfr_prec_t MPFR_PREC_MIN_macro (void) { return MPFR_PREC_MIN ; } \c mpfr_prec_t MPFR_PREC_MAX_macro (void) { return MPFR_PREC_MAX ; } \c mpfr_prec_t MPFR_EMAX_DEFAULT_macro (void) { return MPFR_EMAX_DEFAULT; } \c mpfr_prec_t MPFR_EMIN_DEFAULT_macro (void) { return MPFR_EMIN_DEFAULT; } c-function MPFR_PREC_MIN MPFR_PREC_MIN_macro -- n c-function MPFR_PREC_MAX MPFR_PREC_MAX_macro -- n c-function MPFR_EMAX_DEFAULT MPFR_EMAX_DEFAULT_macro -- n c-function MPFR_EMIN_DEFAULT MPFR_EMIN_DEFAULT_macro -- n c-value MPFR_RNDN MPFR_RNDN -- n c-value MPFR_RNDZ MPFR_RNDZ -- n c-value MPFR_RNDU MPFR_RNDU -- n c-value MPFR_RNDD MPFR_RNDD -- n c-value MPFR_RNDA MPFR_RNDA -- n c-value MPFR_RNDF MPFR_RNDF -- n c-value MPFR_RNDNA MPFR_RNDNA -- n end-c-library