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/