missed some bignum/ratio normalization cases

This commit is contained in:
Alex Shinn 2012-07-10 23:56:51 +09:00
parent 96d8c7d797
commit f895ace01b
2 changed files with 5 additions and 1 deletions

View file

@ -493,7 +493,7 @@ sexp sexp_double_to_ratio (sexp ctx, double f) {
int sign, i;
sexp_gc_var3(res, whole, scale);
if (f == trunc(f))
return sexp_double_to_bignum(ctx, f);
return sexp_bignum_normalize(sexp_double_to_bignum(ctx, f));
sexp_gc_preserve3(ctx, res, whole, scale);
whole = sexp_double_to_bignum(ctx, trunc(f));
res = sexp_fixnum_to_bignum(ctx, SEXP_ZERO);
@ -507,6 +507,8 @@ sexp sexp_double_to_ratio (sexp ctx, double f) {
scale = sexp_mul(ctx, scale, SEXP_TEN);
}
sexp_bignum_sign(res) = sign;
res = sexp_bignum_normalize(res);
scale = sexp_bignum_normalize(scale);
res = sexp_make_ratio(ctx, res, scale);
res = sexp_ratio_normalize(ctx, res, SEXP_FALSE);
res = sexp_add(ctx, res, whole);

2
sexp.c
View file

@ -2308,6 +2308,8 @@ sexp sexp_ratio_normalize (sexp ctx, sexp rat, sexp in) {
sexp_negate(sexp_ratio_numerator(rat));
sexp_negate(sexp_ratio_denominator(rat));
}
sexp_ratio_numerator(rat) = sexp_bignum_normalize(sexp_ratio_numerator(rat));
sexp_ratio_denominator(rat) = sexp_bignum_normalize(sexp_ratio_denominator(rat));
sexp_gc_release2(ctx);
return (sexp_ratio_denominator(rat) == SEXP_ONE) ? sexp_ratio_numerator(rat)
: rat;