aboutsummaryrefslogtreecommitdiffstats
path: root/rational.c
diff options
context:
space:
mode:
authormrkn <mrkn@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-11-12 11:52:00 +0000
committermrkn <mrkn@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-11-12 11:52:00 +0000
commit16e0c00fecf560ff1b3a07e53b89a4f224eabccb (patch)
tree0e297e6dd44c8eecd819addd0969ac19c5f11a61 /rational.c
parentce35f121872f5a7b3b0690f692792f52c554966d (diff)
downloadruby-16e0c00fecf560ff1b3a07e53b89a4f224eabccb.tar.gz
rational.c: optimize Float#to_r
* rational.c (float_to_r): optimize Float#to_r. * numeric.c (rb_int_lshift): exported. * internal.h (rb_int_lshift): ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@56750 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'rational.c')
-rw-r--r--rational.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/rational.c b/rational.c
index 67752ff961..c7f66c4767 100644
--- a/rational.c
+++ b/rational.c
@@ -2071,14 +2071,17 @@ float_to_r(VALUE self)
long ln = FIX2LONG(n);
if (ln == 0)
- return f_to_r(f);
+ return rb_rational_new1(f);
if (ln > 0)
- return f_to_r(f_lshift(f, n));
+ return rb_rational_new1(rb_int_lshift(f, n));
ln = -ln;
- return rb_rational_new2(f, f_lshift(ONE, INT2FIX(ln)));
+ return rb_rational_new2(f, rb_int_lshift(ONE, INT2FIX(ln)));
}
#else
- return f_to_r(f_mul(f, f_expt(INT2FIX(FLT_RADIX), n)));
+ f = rb_int_mul(f, rb_int_pow(INT2FIX(FLT_RADIX), n));
+ if (RB_TYPE_P(f, T_RATIONAL))
+ return f;
+ return rb_rational_new1(f);
#endif
}