From 02164269a7167b111dd5cc7c3c1da6063b2fa833 Mon Sep 17 00:00:00 2001 From: Marius Vollmer Date: Wed, 19 Nov 2003 03:50:26 +0000 Subject: [PATCH] * numbers.c (scm_i_fraction_equalp): Do not treat the return value of scm_equal_p as a C boolean, use SCM_FALSEP. Previously, all fractions were equal to each other regardless of value. Ooops. * numbers.c (scm_rationalize): Return an inexact result when given inexact arguments. --- libguile/numbers.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/libguile/numbers.c b/libguile/numbers.c index 4653621d9..fad644165 100644 --- a/libguile/numbers.c +++ b/libguile/numbers.c @@ -2819,8 +2819,13 @@ scm_i_fraction_equalp (SCM x, SCM y) { scm_i_fraction_reduce (x); scm_i_fraction_reduce (y); - return SCM_BOOL (scm_equal_p (SCM_FRACTION_NUMERATOR (x), SCM_FRACTION_NUMERATOR (y)) - && scm_equal_p (SCM_FRACTION_DENOMINATOR (x), SCM_FRACTION_DENOMINATOR (y))); + if (SCM_FALSEP (scm_equal_p (SCM_FRACTION_NUMERATOR (x), + SCM_FRACTION_NUMERATOR (y))) + || SCM_FALSEP (scm_equal_p (SCM_FRACTION_DENOMINATOR (x), + SCM_FRACTION_DENOMINATOR (y)))) + return SCM_BOOL_F; + else + return SCM_BOOL_T; } @@ -5217,7 +5222,14 @@ SCM_DEFINE (scm_rationalize, "rationalize", 2, 0, 0, SCM_FALSEP (scm_gr_p (scm_abs (scm_difference (ex, scm_divide (a, b))), err))) /* abs(x-a/b) <= err */ - return scm_sum (int_part, scm_divide (a, b)); /* int_part+a/b */ + { + SCM res = scm_sum (int_part, scm_divide (a, b)); + if (SCM_FALSEP (scm_exact_p (x)) + || SCM_FALSEP (scm_exact_p (err))) + return scm_exact_to_inexact (res); + else + return res; + } rx = scm_divide (scm_difference (rx, tt), /* rx = 1/(rx - tt) */ SCM_UNDEFINED); tt = scm_floor (rx); /* tt = floor (rx) */