[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]