Preserving and normalizing intermediate ratios.

This commit is contained in:
Alex Shinn 2011-09-06 23:40:28 +09:00
parent 057198c4d8
commit 60c95d0df2

View file

@ -1122,7 +1122,8 @@ sexp sexp_div (sexp ctx, sexp a, sexp b) {
break; break;
case SEXP_NUM_FIX_FIX: case SEXP_NUM_FIX_FIX:
#if SEXP_USE_RATIOS #if SEXP_USE_RATIOS
r = sexp_make_ratio(ctx, a, b); tmp = sexp_make_ratio(ctx, a, b);
r = sexp_ratio_normalize(ctx, tmp, SEXP_FALSE);
#else #else
f = sexp_fixnum_to_double(a) / sexp_fixnum_to_double(b); f = sexp_fixnum_to_double(a) / sexp_fixnum_to_double(b);
r = ((f == trunc(f)) ? sexp_make_fixnum((sexp_sint_t)f) r = ((f == trunc(f)) ? sexp_make_fixnum((sexp_sint_t)f)
@ -1134,7 +1135,8 @@ sexp sexp_div (sexp ctx, sexp a, sexp b) {
break; break;
case SEXP_NUM_FIX_BIG: case SEXP_NUM_FIX_BIG:
#if SEXP_USE_RATIOS #if SEXP_USE_RATIOS
r = sexp_make_ratio(ctx, a, b); tmp = sexp_make_ratio(ctx, a, b);
r = sexp_ratio_normalize(ctx, tmp, SEXP_FALSE);
#else #else
r = sexp_make_flonum(ctx, sexp_fixnum_to_double(a)/sexp_bignum_to_double(b)); r = sexp_make_flonum(ctx, sexp_fixnum_to_double(a)/sexp_bignum_to_double(b));
#endif #endif
@ -1150,7 +1152,8 @@ sexp sexp_div (sexp ctx, sexp a, sexp b) {
break; break;
case SEXP_NUM_BIG_FIX: case SEXP_NUM_BIG_FIX:
#if SEXP_USE_RATIOS #if SEXP_USE_RATIOS
r = sexp_make_ratio(ctx, a, b); tmp = sexp_make_ratio(ctx, a, b);
r = sexp_ratio_normalize(ctx, tmp, SEXP_FALSE);
break; break;
#else #else
b = tmp = sexp_fixnum_to_bignum(ctx, b); b = tmp = sexp_fixnum_to_bignum(ctx, b);
@ -1158,7 +1161,8 @@ sexp sexp_div (sexp ctx, sexp a, sexp b) {
/* ... FALLTHROUGH if ! SEXP_USE_RATIOS ... */ /* ... FALLTHROUGH if ! SEXP_USE_RATIOS ... */
case SEXP_NUM_BIG_BIG: case SEXP_NUM_BIG_BIG:
#if SEXP_USE_RATIOS #if SEXP_USE_RATIOS
r = sexp_make_ratio(ctx, a, b); tmp = sexp_make_ratio(ctx, a, b);
r = sexp_ratio_normalize(ctx, tmp, SEXP_FALSE);
#else #else
r = sexp_bignum_quot_rem(ctx, &rem, a, b); r = sexp_bignum_quot_rem(ctx, &rem, a, b);
if (sexp_bignum_normalize(rem) != SEXP_ZERO) if (sexp_bignum_normalize(rem) != SEXP_ZERO)