mirror of
https://github.com/ashinn/chibi-scheme.git
synced 2025-05-21 22:59:16 +02:00
quotient and remainder work on inexact integers
This commit is contained in:
parent
1d15785f23
commit
a8e721da94
1 changed files with 52 additions and 4 deletions
56
opt/bignum.c
56
opt/bignum.c
|
@ -1306,6 +1306,12 @@ sexp sexp_div (sexp ctx, sexp a, sexp b) {
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sexp sexp_to_inexact (sexp ctx, sexp a) {
|
||||||
|
if (sexp_fixnump(a)) return sexp_fixnum_to_flonum(ctx, a);
|
||||||
|
if (sexp_bignump(a)) return sexp_make_flonum(ctx, sexp_bignum_to_double(a));
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
|
||||||
sexp sexp_quotient (sexp ctx, sexp a, sexp b) {
|
sexp sexp_quotient (sexp ctx, sexp a, sexp b) {
|
||||||
int at=sexp_number_type(a), bt=sexp_number_type(b);
|
int at=sexp_number_type(a), bt=sexp_number_type(b);
|
||||||
sexp r=SEXP_VOID;
|
sexp r=SEXP_VOID;
|
||||||
|
@ -1321,8 +1327,18 @@ sexp sexp_quotient (sexp ctx, sexp a, sexp b) {
|
||||||
break;
|
break;
|
||||||
case SEXP_NUM_FLO_FIX: case SEXP_NUM_FLO_FLO: case SEXP_NUM_FLO_BIG:
|
case SEXP_NUM_FLO_FIX: case SEXP_NUM_FLO_FLO: case SEXP_NUM_FLO_BIG:
|
||||||
#if SEXP_USE_RATIOS
|
#if SEXP_USE_RATIOS
|
||||||
case SEXP_NUM_FLO_RAT: case SEXP_NUM_RAT_FIX: case SEXP_NUM_RAT_FLO:
|
case SEXP_NUM_FLO_RAT:
|
||||||
case SEXP_NUM_RAT_BIG: case SEXP_NUM_RAT_RAT:
|
#endif
|
||||||
|
if (sexp_flonum_value(a) != trunc(sexp_flonum_value(a))) {
|
||||||
|
r = sexp_type_exception(ctx, NULL, SEXP_FIXNUM, a);
|
||||||
|
} else {
|
||||||
|
tmp = sexp_bignum_normalize(sexp_double_to_bignum(ctx, sexp_flonum_value(a)));
|
||||||
|
tmp = sexp_quotient(ctx, tmp, b);
|
||||||
|
r = sexp_to_inexact(ctx, tmp);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
#if SEXP_USE_RATIOS
|
||||||
|
case SEXP_NUM_RAT_FIX: case SEXP_NUM_RAT_BIG: case SEXP_NUM_RAT_RAT:
|
||||||
#endif
|
#endif
|
||||||
#if SEXP_USE_COMPLEX
|
#if SEXP_USE_COMPLEX
|
||||||
case SEXP_NUM_FLO_CPX: case SEXP_NUM_CPX_FIX: case SEXP_NUM_CPX_FLO:
|
case SEXP_NUM_FLO_CPX: case SEXP_NUM_CPX_FIX: case SEXP_NUM_CPX_FLO:
|
||||||
|
@ -1334,6 +1350,17 @@ sexp sexp_quotient (sexp ctx, sexp a, sexp b) {
|
||||||
r = sexp_type_exception(ctx, NULL, SEXP_FIXNUM, a);
|
r = sexp_type_exception(ctx, NULL, SEXP_FIXNUM, a);
|
||||||
break;
|
break;
|
||||||
case SEXP_NUM_FIX_FLO: case SEXP_NUM_BIG_FLO:
|
case SEXP_NUM_FIX_FLO: case SEXP_NUM_BIG_FLO:
|
||||||
|
#if SEXP_USE_RATIOS
|
||||||
|
case SEXP_NUM_RAT_FLO:
|
||||||
|
#endif
|
||||||
|
if (sexp_flonum_value(b) != trunc(sexp_flonum_value(b))) {
|
||||||
|
r = sexp_type_exception(ctx, NULL, SEXP_FIXNUM, b);
|
||||||
|
} else {
|
||||||
|
tmp = sexp_bignum_normalize(sexp_double_to_bignum(ctx, sexp_flonum_value(b)));
|
||||||
|
tmp = sexp_quotient(ctx, a, tmp);
|
||||||
|
r = sexp_to_inexact(ctx, tmp);
|
||||||
|
}
|
||||||
|
break;
|
||||||
#if SEXP_USE_RATIOS
|
#if SEXP_USE_RATIOS
|
||||||
case SEXP_NUM_FIX_RAT: case SEXP_NUM_BIG_RAT:
|
case SEXP_NUM_FIX_RAT: case SEXP_NUM_BIG_RAT:
|
||||||
#endif
|
#endif
|
||||||
|
@ -1374,8 +1401,18 @@ sexp sexp_remainder (sexp ctx, sexp a, sexp b) {
|
||||||
break;
|
break;
|
||||||
case SEXP_NUM_FLO_FIX: case SEXP_NUM_FLO_FLO: case SEXP_NUM_FLO_BIG:
|
case SEXP_NUM_FLO_FIX: case SEXP_NUM_FLO_FLO: case SEXP_NUM_FLO_BIG:
|
||||||
#if SEXP_USE_RATIOS
|
#if SEXP_USE_RATIOS
|
||||||
case SEXP_NUM_FLO_RAT: case SEXP_NUM_RAT_FIX: case SEXP_NUM_RAT_FLO:
|
case SEXP_NUM_FLO_RAT:
|
||||||
case SEXP_NUM_RAT_BIG: case SEXP_NUM_RAT_RAT:
|
#endif
|
||||||
|
if (sexp_flonum_value(a) != trunc(sexp_flonum_value(a))) {
|
||||||
|
r = sexp_type_exception(ctx, NULL, SEXP_FIXNUM, a);
|
||||||
|
} else {
|
||||||
|
tmp = sexp_bignum_normalize(sexp_double_to_bignum(ctx, sexp_flonum_value(a)));
|
||||||
|
tmp = sexp_remainder(ctx, tmp, b);
|
||||||
|
r = sexp_to_inexact(ctx, tmp);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
#if SEXP_USE_RATIOS
|
||||||
|
case SEXP_NUM_RAT_FIX: case SEXP_NUM_RAT_BIG: case SEXP_NUM_RAT_RAT:
|
||||||
#endif
|
#endif
|
||||||
#if SEXP_USE_COMPLEX
|
#if SEXP_USE_COMPLEX
|
||||||
case SEXP_NUM_FLO_CPX: case SEXP_NUM_CPX_FIX: case SEXP_NUM_CPX_FLO:
|
case SEXP_NUM_FLO_CPX: case SEXP_NUM_CPX_FIX: case SEXP_NUM_CPX_FLO:
|
||||||
|
@ -1387,6 +1424,17 @@ sexp sexp_remainder (sexp ctx, sexp a, sexp b) {
|
||||||
r = sexp_type_exception(ctx, NULL, SEXP_FIXNUM, a);
|
r = sexp_type_exception(ctx, NULL, SEXP_FIXNUM, a);
|
||||||
break;
|
break;
|
||||||
case SEXP_NUM_FIX_FLO: case SEXP_NUM_BIG_FLO:
|
case SEXP_NUM_FIX_FLO: case SEXP_NUM_BIG_FLO:
|
||||||
|
#if SEXP_USE_RATIOS
|
||||||
|
case SEXP_NUM_RAT_FLO:
|
||||||
|
#endif
|
||||||
|
if (sexp_flonum_value(b) != trunc(sexp_flonum_value(b))) {
|
||||||
|
r = sexp_type_exception(ctx, NULL, SEXP_FIXNUM, b);
|
||||||
|
} else {
|
||||||
|
tmp = sexp_bignum_normalize(sexp_double_to_bignum(ctx, sexp_flonum_value(b)));
|
||||||
|
tmp = sexp_remainder(ctx, a, tmp);
|
||||||
|
r = sexp_to_inexact(ctx, tmp);
|
||||||
|
}
|
||||||
|
break;
|
||||||
#if SEXP_USE_RATIOS
|
#if SEXP_USE_RATIOS
|
||||||
case SEXP_NUM_FIX_RAT: case SEXP_NUM_BIG_RAT:
|
case SEXP_NUM_FIX_RAT: case SEXP_NUM_BIG_RAT:
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Reference in a new issue