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

ruby-changes:4529

From: ko1@a...
Date: Tue, 15 Apr 2008 07:31:13 +0900 (JST)
Subject: [ruby-changes:4529] tadf - Ruby:r16022 (trunk): * complex.c (nucomp_div):

tadf	2008-04-15 07:30:45 +0900 (Tue, 15 Apr 2008)

  New Revision: 16022

  Modified files:
    trunk/ChangeLog
    trunk/complex.c
    trunk/math.c
    trunk/test/ruby/test_complex.rb

  Log:
    * complex.c (nucomp_div): [ruby-dev:34357]
    
    * complex.c (nucomp_abs): use hypot.
    
    * complex.c (nucomp_quo): do not force convertion.
    
    * test/ruby/test_complex.rb: omitted some meaningless tests.
    


  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/test/ruby/test_complex.rb?r1=16022&r2=16021&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/math.c?r1=16022&r2=16021&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/complex.c?r1=16022&r2=16021&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=16022&r2=16021&diff_format=u

Index: complex.c
===================================================================
--- complex.c	(revision 16021)
+++ complex.c	(revision 16022)
@@ -478,6 +478,7 @@
 extern VALUE math_cos(VALUE obj, VALUE x);
 extern VALUE math_cosh(VALUE obj, VALUE x);
 extern VALUE math_exp(VALUE obj, VALUE x);
+extern VALUE math_hypot(VALUE obj, VALUE x, VALUE y);
 extern VALUE math_log(int argc, VALUE *argv);
 extern VALUE math_sin(VALUE obj, VALUE x);
 extern VALUE math_sinh(VALUE obj, VALUE x);
@@ -487,6 +488,7 @@
 #define m_cos_bang(x) math_cos(Qnil,x)
 #define m_cosh_bang(x) math_cosh(Qnil,x)
 #define m_exp_bang(x) math_exp(Qnil,x)
+#define m_hypot(x,y) math_hypot(Qnil,x,y)
 
 static VALUE
 m_log_bang(VALUE x)
@@ -681,7 +683,21 @@
 				f_div(dat->image, other));
       }
       case T_COMPLEX:
-	return f_div(f_mul(self, f_conjugate(other)), f_abs2(other));
+      {
+	  get_dat2(self, other);
+
+	  if (TYPE(adat->real)  == T_FLOAT ||
+	      TYPE(adat->image) == T_FLOAT ||
+	      TYPE(bdat->real)  == T_FLOAT ||
+	      TYPE(bdat->image) == T_FLOAT) {
+	      VALUE magn = m_hypot(bdat->real, bdat->image);
+	      VALUE tmp = f_complex_new_bang2(CLASS_OF(self),
+					      f_div(bdat->real, magn),
+					      f_div(bdat->image, magn));
+	      return f_div(f_mul(self, f_conjugate(tmp)), magn);
+	  }
+	  return f_div(f_mul(self, f_conjugate(other)), f_abs2(other));
+      }
       default:
 	return rb_num_coerce_bin(self, other, '/');
     }
@@ -693,8 +709,8 @@
     get_dat1(self);
 
     return f_div(f_complex_new2(CLASS_OF(self),
-				f_to_r(dat->real),
-				f_to_r(dat->image)), other);
+				f_quo(dat->real, ONE),
+				f_quo(dat->image, ONE)), other);
 }
 
 static VALUE
@@ -824,8 +840,7 @@
 nucomp_abs(VALUE self)
 {
     get_dat1(self);
-    return m_sqrt(f_add(f_mul(dat->real, dat->real),
-			f_mul(dat->image, dat->image)));
+    return m_hypot(dat->real, dat->image);
 }
 
 static VALUE
Index: math.c
===================================================================
--- math.c	(revision 16021)
+++ math.c	(revision 16022)
@@ -465,7 +465,7 @@
  *     Math.hypot(3, 4)   #=> 5.0
  */
 
-static VALUE
+VALUE
 math_hypot(VALUE obj, VALUE x, VALUE y)
 {
     Need_Float2(x, y);
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 16021)
+++ ChangeLog	(revision 16022)
@@ -1,3 +1,13 @@
+Tue Apr 15 07:21:21 2008  Tadayoshi Funaba  <tadf@d...>
+
+	* complex.c (nucomp_div): [ruby-dev:34357]
+
+	* complex.c (nucomp_abs): use hypot.
+
+	* complex.c (nucomp_quo): do not force convertion.
+
+	* test/ruby/test_complex.rb: omitted some meaningless tests.
+
 Mon Apr 14 23:25:50 2008  Yusuke Endoh  <mame@t...>
 
 	* test/ruby/test_objectspace.rb: add a test for
Index: test/ruby/test_complex.rb
===================================================================
--- test/ruby/test_complex.rb	(revision 16021)
+++ test/ruby/test_complex.rb	(revision 16022)
@@ -1055,6 +1055,7 @@
     Complex.const_set(:Unify, unify_val) if f
   end
 
+=begin
   def test_abs
     b = 2**100
     def b.*(x); self; end rescue nil
@@ -1075,6 +1076,7 @@
     nan = inf/inf
     assert_raise(Errno::EDOM, Errno::ERANGE) { Complex(1, nan).abs }
   end
+=end
 
   def test_coerce
     c = Complex(6, 3)

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

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