diff options
-rw-r--r-- | rational.c | 43 |
1 files changed, 28 insertions, 15 deletions
@@ -1712,21 +1712,30 @@ static VALUE nurat_rationalize(int argc, VALUE *argv, VALUE self) { VALUE e, a, b, p, q; if (rb_check_arity(argc, 0, 1) == 0) return self; - if (nurat_negative_p(self)) - return rb_rational_uminus(nurat_rationalize(argc, argv, rb_rational_uminus(self))); - e = f_abs(argv[0]); - a = f_sub(self, e); - b = f_add(self, e); if (f_eqeq_p(a, b)) return self; nurat_rationalize_internal(a, b, &p, &q); return f_rational_new2(CLASS_OF(self), p, q); } @@ -2238,7 +2247,7 @@ rb_flt_rationalize_with_prec(VALUE flt, VALUE prec) VALUE rb_flt_rationalize(VALUE flt) { - VALUE a, b, f, p, q; int n; float_decode_internal(flt, &f, &n); @@ -2246,7 +2255,7 @@ rb_flt_rationalize(VALUE flt) return rb_rational_new1(rb_int_lshift(f, INT2FIX(n))); { - VALUE radix_times_f, den; radix_times_f = rb_int_mul(INT2FIX(FLT_RADIX), f); #if FLT_RADIX == 2 && 0 @@ -2255,13 +2264,15 @@ rb_flt_rationalize(VALUE flt) den = rb_int_positive_pow(FLT_RADIX, 1-n); #endif - a = rb_rational_new2(rb_int_minus(radix_times_f, INT2FIX(FLT_RADIX - 1)), den); - b = rb_rational_new2(rb_int_plus(radix_times_f, INT2FIX(FLT_RADIX - 1)), den); } - if (nurat_eqeq_p(a, b)) return float_to_r(flt); nurat_rationalize_internal(a, b, &p, &q); return rb_rational_new2(p, q); } @@ -2284,16 +2295,18 @@ static VALUE float_rationalize(int argc, VALUE *argv, VALUE self) { double d = RFLOAT_VALUE(self); - - if (d < 0.0) - return rb_rational_uminus(float_rationalize(argc, argv, DBL2NUM(-d))); if (rb_check_arity(argc, 0, 1)) { - return rb_flt_rationalize_with_prec(self, argv[0]); } else { - return rb_flt_rationalize(self); } } inline static int |