mirror of
https://github.com/ashinn/chibi-scheme.git
synced 2025-07-11 23:17:34 +02:00
Preserving and normalizing intermediate ratios.
This commit is contained in:
parent
057198c4d8
commit
60c95d0df2
1 changed files with 8 additions and 4 deletions
12
opt/bignum.c
12
opt/bignum.c
|
@ -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)
|
||||||
|
|
Loading…
Add table
Reference in a new issue