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

ruby-changes:12197

From: tadf <ko1@a...>
Date: Sun, 28 Jun 2009 19:53:12 +0900 (JST)
Subject: [ruby-changes:12197] Ruby:r23881 (trunk): * complex.c (nucomp_expt): some improvements.

tadf	2009-06-28 19:50:39 +0900 (Sun, 28 Jun 2009)

  New Revision: 23881

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=23881

  Log:
    * complex.c (nucomp_expt): some improvements.
    * rational.c (nurat_expt): ditto.

  Modified files:
    trunk/ChangeLog
    trunk/complex.c
    trunk/rational.c

Index: complex.c
===================================================================
--- complex.c	(revision 23880)
+++ complex.c	(revision 23881)
@@ -751,6 +751,37 @@
     return f_divide(self, other, f_fdiv, id_fdiv);
 }
 
+static VALUE
+m_log(VALUE x)
+{
+    if (f_real_p(x) && f_positive_p(x))
+	return m_log_bang(x);
+    return rb_complex_new2(m_log_bang(f_abs(x)), f_arg(x));
+}
+
+static VALUE
+m_exp(VALUE x)
+{
+    VALUE ere;
+
+    if (f_real_p(x))
+	return m_exp_bang(x);
+    {
+	get_dat1(x);
+	ere = m_exp_bang(dat->real);
+	return rb_complex_new2(f_mul(ere, m_cos_bang(dat->imag)),
+			       f_mul(ere, m_sin_bang(dat->imag)));
+    }
+}
+
+VALUE
+rb_fexpt(VALUE x, VALUE y)
+{
+    if (f_zero_p(x) || (!k_float_p(x) && !k_float_p(y)))
+	return f_expt(x, y);
+    return m_exp(f_mul(m_log(x), y));
+}
+
 /*
  * call-seq:
  *    cmp ** numeric  ->  complex
@@ -769,9 +800,24 @@
 	return f_complex_new_bang1(CLASS_OF(self), ONE);
 
     if (k_rational_p(other) && f_one_p(f_denominator(other)))
-	other = f_numerator(other); /* good? */
+	other = f_numerator(other); /* c14n */
 
     if (k_complex_p(other)) {
+	get_dat1(other);
+
+	if (f_zero_p(dat->imag))
+	    other = dat->real; /* c14n */
+    }
+
+    {
+	get_dat1(self);
+
+	if (f_zero_p(dat->imag) && f_real_p(other))
+	    return f_complex_new1(CLASS_OF(self),
+				  rb_fexpt(dat->real, other)); /* c14n */
+    }
+
+    if (k_complex_p(other)) {
 	VALUE r, theta, nr, ntheta;
 
 	get_dat1(other);
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 23880)
+++ ChangeLog	(revision 23881)
@@ -1,3 +1,9 @@
+Sun Jun 28 19:48:29 2009  Tadayoshi Funaba  <tadf@d...>
+
+	* complex.c (nucomp_expt): some improvements.
+
+	* rational.c (nurat_expt): ditto.
+
 Sun Jun 28 19:03:46 2009  Yuki Sonoda (Yugui)  <yugui@y...>
 
 	* tool/instruby.rb (:gem): registers the bundled version
Index: rational.c
===================================================================
--- rational.c	(revision 23880)
+++ rational.c	(revision 23881)
@@ -870,6 +870,8 @@
     return f_to_f(f_div(self, other));
 }
 
+extern VALUE rb_fexpt(VALUE x, VALUE y);
+
 /*
  * call-seq:
  *    rat ** numeric  ->  numeric_result
@@ -895,7 +897,7 @@
 	get_dat1(other);
 
 	if (f_one_p(dat->den))
-	    other = dat->num; /* good? */
+	    other = dat->num; /* c14n */
     }
 
     switch (TYPE(other)) {
@@ -924,9 +926,7 @@
 	}
       case T_FLOAT:
       case T_RATIONAL:
-	if (f_negative_p(self))
-	    return f_expt(rb_complex_new1(self), other); /* explicitly */
-	return f_expt(f_to_f(self), other);
+	return rb_fexpt(f_to_f(self), other);
       default:
 	return rb_num_coerce_bin(self, other, id_expt);
     }
@@ -956,7 +956,7 @@
 	    get_dat1(self);
 
 	    if (FIXNUM_P(dat->den) && FIX2LONG(dat->den) == 1)
-		return f_cmp(dat->num, other);
+		return f_cmp(dat->num, other); /* c14n */
 	    return f_cmp(self, f_rational_new_bang1(CLASS_OF(self), other));
 	}
       case T_FLOAT:

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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