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

ruby-changes:4427

From: ko1@a...
Date: Mon, 7 Apr 2008 22:52:42 +0900 (JST)
Subject: [ruby-changes:4427] tadf - Ruby:r15918 (trunk): * numeric.c: cancelled recent changes (except to remove rdiv).

tadf	2008-04-07 22:52:26 +0900 (Mon, 07 Apr 2008)

  New Revision: 15918

  Modified files:
    trunk/ChangeLog
    trunk/bignum.c
    trunk/numeric.c
    trunk/test/ruby/test_numeric.rb

  Log:
    * numeric.c: cancelled recent changes (except to remove rdiv).
    
    * bignum.c: ditto.
    
    * bignum.c: added rb_big_idiv.
    


  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/numeric.c?r1=15918&r2=15917&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=15918&r2=15917&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/test/ruby/test_numeric.rb?r1=15918&r2=15917&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/bignum.c?r1=15918&r2=15917&diff_format=u

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 15917)
+++ ChangeLog	(revision 15918)
@@ -1,3 +1,11 @@
+Mon Apr  7 22:41:21 2008  Tadayoshi Funaba  <tadf@d...>
+
+	* numeric.c: cancelled recent changes (except to remove rdiv).
+
+	* bignum.c: ditto.
+
+	* bignum.c: added rb_big_idiv.
+
 Mon Apr  7 15:51:31 2008  Nobuyoshi Nakada  <nobu@r...>
 
 	* encoding.c (enc_init_db): moved to enc/encdb.c.
Index: numeric.c
===================================================================
--- numeric.c	(revision 15917)
+++ numeric.c	(revision 15918)
@@ -248,38 +248,19 @@
 
 /*
  *  call-seq:
+ *     num.quo(numeric)    =>   result
  *     num.fdiv(numeric)   =>   result
  *
- *  Performs floating point division.
+ *  Equivalent to <code>Numeric#/</code>, but overridden in subclasses.
  */
 
 static VALUE
-num_fdiv(VALUE x, VALUE y)
-{
-    return rb_funcall(rb_Float(x), '/', 1, y);
-}
-
-/*
- * Document-method: quo
- *
- *  call-seq:
- *     num.quo(numeric)    =>   result
- *
- *  Suppose to return most accurate division result, which
- *  is either rational or float (if any of operands are float).
- *
- *
- *     654321.quo(13731)      #=> Rational(218107, 4577)
- *     654321.quo(13731.24)   #=> 47.6519964693647
- *
- */
-
-static VALUE
 num_quo(VALUE x, VALUE y)
 {
-    return rb_funcall(rb_Rational1(x), rb_intern("quo"), 1, y);
+    return rb_funcall(x, '/', 1, y);
 }
 
+
 static VALUE num_floor(VALUE num);
 
 /*
@@ -294,7 +275,7 @@
 static VALUE
 num_div(VALUE x, VALUE y)
 {
-    return rb_funcall(rb_funcall(x, '/', 1, y), rb_intern("floor"), 0, 0);
+    return num_floor(rb_funcall(x, '/', 1, y));
 }
 
 
@@ -666,7 +647,7 @@
 }
 
 static VALUE
-flo_fdiv(VALUE x, VALUE y)
+flo_quo(VALUE x, VALUE y)
 {
     return rb_funcall(x, '/', 1, y);
 }
@@ -2234,13 +2215,24 @@
 
 /*
  *  call-seq:
- *     fix.fdiv(numeric)    => float
+ *     fix.quo(numeric)    => float
+ *     fix.fdiv(numeric)   => float
  *
  *  Returns the floating point result of dividing <i>fix</i> by
  *  <i>numeric</i>.
+ *
+ *     654321.quo(13731)      #=> 47.6528293642124
+ *     654321.quo(13731.24)   #=> 47.6519964693647
+ *
  */
 
 static VALUE
+fix_quo(VALUE x, VALUE y)
+{
+    return rb_funcall(rb_rational_raw1(x), '/', 1, y);
+}
+
+static VALUE
 fix_fdiv(VALUE x, VALUE y)
 {
     if (FIXNUM_P(y)) {
@@ -3164,8 +3156,8 @@
     rb_define_method(rb_cNumeric, "-@", num_uminus, 0);
     rb_define_method(rb_cNumeric, "<=>", num_cmp, 1);
     rb_define_method(rb_cNumeric, "eql?", num_eql, 1);
-    rb_define_method(rb_cNumeric, "fdiv", num_fdiv, 1);
     rb_define_method(rb_cNumeric, "quo", num_quo, 1);
+    rb_define_method(rb_cNumeric, "fdiv", num_quo, 1);
     rb_define_method(rb_cNumeric, "div", num_div, 1);
     rb_define_method(rb_cNumeric, "divmod", num_divmod, 1);
     rb_define_method(rb_cNumeric, "modulo", num_modulo, 1);
@@ -3231,6 +3223,7 @@
     rb_define_method(rb_cFixnum, "%", fix_mod, 1);
     rb_define_method(rb_cFixnum, "modulo", fix_mod, 1);
     rb_define_method(rb_cFixnum, "divmod", fix_divmod, 1);
+    rb_define_method(rb_cFixnum, "quo", fix_quo, 1);
     rb_define_method(rb_cFixnum, "fdiv", fix_fdiv, 1);
     rb_define_method(rb_cFixnum, "**", fix_pow, 1);
 
@@ -3286,7 +3279,8 @@
     rb_define_method(rb_cFloat, "-", flo_minus, 1);
     rb_define_method(rb_cFloat, "*", flo_mul, 1);
     rb_define_method(rb_cFloat, "/", flo_div, 1);
-    rb_define_method(rb_cFloat, "fdiv", flo_fdiv, 1);
+    rb_define_method(rb_cFloat, "quo", flo_quo, 1);
+    rb_define_method(rb_cFloat, "fdiv", flo_quo, 1);
     rb_define_method(rb_cFloat, "%", flo_mod, 1);
     rb_define_method(rb_cFloat, "modulo", flo_mod, 1);
     rb_define_method(rb_cFloat, "divmod", flo_divmod, 1);
Index: bignum.c
===================================================================
--- bignum.c	(revision 15917)
+++ bignum.c	(revision 15918)
@@ -1800,15 +1800,9 @@
     }
 }
 
-/*
- *  call-seq:
- *     big / other     => Numeric
- *
- *  Divides big by other, returning the result.
- */
 
-VALUE
-rb_big_div(VALUE x, VALUE y)
+static VALUE
+rb_big_divide(VALUE x, VALUE y, ID op)
 {
     VALUE z;
 
@@ -1824,7 +1818,7 @@
 	return DOUBLE2NUM(rb_big2dbl(x) / RFLOAT_VALUE(y));
 
       default:
-	return rb_num_coerce_bin(x, y, '/');
+	return rb_num_coerce_bin(x, y, op);
     }
     bigdivmod(x, y, &z, 0);
 
@@ -1833,6 +1827,25 @@
 
 /*
  *  call-seq:
+ *     big / other     => Numeric
+ *
+ *  Divides big by other, returning the result.
+ */
+
+VALUE
+rb_big_div(VALUE x, VALUE y)
+{
+  return rb_big_divide(x, y, '/');
+}
+
+VALUE
+rb_big_idiv(VALUE x, VALUE y)
+{
+  return rb_big_divide(x, y, rb_intern("div"));
+}
+
+/*
+ *  call-seq:
  *     big % other         => Numeric
  *     big.modulo(other)   => Numeric
  *
@@ -2663,6 +2676,7 @@
     rb_define_method(rb_cBignum, "*", rb_big_mul, 1);
     rb_define_method(rb_cBignum, "/", rb_big_div, 1);
     rb_define_method(rb_cBignum, "%", rb_big_modulo, 1);
+    rb_define_method(rb_cBignum, "div", rb_big_idiv, 1);
     rb_define_method(rb_cBignum, "divmod", rb_big_divmod, 1);
     rb_define_method(rb_cBignum, "modulo", rb_big_modulo, 1);
     rb_define_method(rb_cBignum, "remainder", rb_big_remainder, 1);
Index: test/ruby/test_numeric.rb
===================================================================
--- test/ruby/test_numeric.rb	(revision 15917)
+++ test/ruby/test_numeric.rb	(revision 15918)
@@ -51,7 +51,16 @@
   end
 
   def test_quo
-    assert_raise(ArgumentError) {DummyNumeric.new.quo(0)}
+    DummyNumeric.class_eval do
+      def /(x); :div; end
+    end
+
+    assert_equal(:div, DummyNumeric.new.quo(0))
+
+  ensure
+    DummyNumeric.class_eval do
+      remove_method :/
+    end
   end
 
   def test_divmod

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

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