From bb45f1b2b8a21a8e6de705c9a68724a49563c66c Mon Sep 17 00:00:00 2001 From: tadf Date: Sun, 19 Jul 2009 13:25:05 +0000 Subject: * rational.c (float_to_r): an improvement. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@24206 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- rational.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'rational.c') diff --git a/rational.c b/rational.c index c14bc94681..e5ae7301fc 100644 --- a/rational.c +++ b/rational.c @@ -1695,6 +1695,9 @@ float_decode(VALUE self) } #endif +#define id_lshift rb_intern("<<") +#define f_lshift(x,n) rb_funcall(x, id_lshift, 1, n) + /* * call-seq: * flt.to_r -> rational @@ -1717,7 +1720,20 @@ float_to_r(VALUE self) VALUE f, n; float_decode_internal(self, &f, &n); +#if FLT_RADIX == 2 + { + long ln = FIX2LONG(n); + + if (ln == 0) + return f_to_r(f); + if (ln > 0) + return f_to_r(f_lshift(f, n)); + ln = -ln; + return rb_rational_new2(f, f_lshift(ONE, INT2FIX(ln))); + } +#else return f_to_r(f_mul(f, f_expt(INT2FIX(FLT_RADIX), n))); +#endif } static VALUE rat_pat, an_e_pat, a_dot_pat, underscores_pat, an_underscore; -- cgit v1.2.3