From 7b7c2aed8e8fb182593321da2c13553f071bbc61 Mon Sep 17 00:00:00 2001 From: Alex Shinn Date: Sun, 27 Nov 2011 21:50:49 +0900 Subject: [PATCH] inexact->exact can convert non-integers when exact ratios are supported --- include/chibi/bignum.h | 1 + vm.c | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/include/chibi/bignum.h b/include/chibi/bignum.h index 17fe7704..2c44f503 100644 --- a/include/chibi/bignum.h +++ b/include/chibi/bignum.h @@ -39,6 +39,7 @@ sexp sexp_div (sexp ctx, sexp a, sexp b); sexp sexp_quotient (sexp ctx, sexp a, sexp b); sexp sexp_remainder (sexp ctx, sexp a, sexp b); #if SEXP_USE_RATIOS +sexp sexp_double_to_ratio (sexp ctx, double f); double sexp_ratio_to_double (sexp rat); sexp sexp_make_ratio (sexp ctx, sexp num, sexp den); sexp sexp_ratio_normalize (sexp ctx, sexp rat, sexp in); diff --git a/vm.c b/vm.c index f55844ed..cd56064a 100644 --- a/vm.c +++ b/vm.c @@ -1670,7 +1670,11 @@ sexp sexp_apply (sexp ctx, sexp proc, sexp args) { case SEXP_OP_FLO2FIX: if (sexp_flonump(_ARG1)) { if (sexp_flonum_value(_ARG1) != trunc(sexp_flonum_value(_ARG1))) { +#if SEXP_USE_RATIOS + _ARG1 = sexp_double_to_ratio(ctx, sexp_flonum_value(_ARG1)); +#else sexp_raise("inexact->exact: not an integer", sexp_list1(ctx, _ARG1)); +#endif #if SEXP_USE_BIGNUMS } else if ((sexp_flonum_value(_ARG1) > SEXP_MAX_FIXNUM) || sexp_flonum_value(_ARG1) < SEXP_MIN_FIXNUM) {