ruby-changes:12503
From: tadf <ko1@a...>
Date: Sun, 19 Jul 2009 22:25:30 +0900 (JST)
Subject: [ruby-changes:12503] Ruby:r24206 (trunk): * rational.c (float_to_r): an improvement.
tadf 2009-07-19 22:25:05 +0900 (Sun, 19 Jul 2009) New Revision: 24206 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=24206 Log: * rational.c (float_to_r): an improvement. Modified files: trunk/ChangeLog trunk/rational.c Index: ChangeLog =================================================================== --- ChangeLog (revision 24205) +++ ChangeLog (revision 24206) @@ -1,3 +1,7 @@ +Sun Jul 19 22:22:54 2009 Tadayoshi Funaba <tadf@d...> + + * rational.c (float_to_r): an improvement. + Sun Jul 19 20:41:24 2009 Tadayoshi Funaba <tadf@d...> * complex.c (make_patterns): do not use \d. Index: rational.c =================================================================== --- rational.c (revision 24205) +++ rational.c (revision 24206) @@ -1695,6 +1695,9 @@ } #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 @@ 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; -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/