1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-10 22:10:21 +02:00

(scm_round_number): For inum and big, just return x. For

real, use scm_round for 2^54-1 etc problems covered there.
This commit is contained in:
Kevin Ryde 2004-05-18 23:43:28 +00:00
parent 63947c7ad3
commit bae30667b0

View file

@ -5007,14 +5007,24 @@ SCM_DEFINE (scm_round_number, "round", 1, 0, 0,
"round towards the even one.")
#define FUNC_NAME s_scm_round_number
{
SCM plus_half = scm_sum (x, exactly_one_half);
SCM result = scm_floor (plus_half);
/* Adjust so that the scm_round is towards even. */
if (!SCM_FALSEP (scm_num_eq_p (plus_half, result))
&& !SCM_FALSEP (scm_odd_p (result)))
return scm_difference (result, SCM_MAKINUM (1));
if (SCM_INUMP (x) || SCM_BIGP (x))
return x;
else if (SCM_REALP (x))
return scm_make_real (scm_round (SCM_REAL_VALUE (x)));
else
return result;
{
/* OPTIMIZE-ME: Fraction case could be done more efficiently by a
single quotient+remainder division then examining to see which way
the rounding should go. */
SCM plus_half = scm_sum (x, exactly_one_half);
SCM result = scm_floor (plus_half);
/* Adjust so that the scm_round is towards even. */
if (!SCM_FALSEP (scm_num_eq_p (plus_half, result))
&& !SCM_FALSEP (scm_odd_p (result)))
return scm_difference (result, SCM_MAKINUM (1));
else
return result;
}
}
#undef FUNC_NAME