mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* lib/rational.rb: modified to support "quo".
* numeric.c (num_quo): should return most exact quotient value, i.e. float by default, rational if available. * numeric.c (num_div): "div" should return x.divmod(x)[0]. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3399 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
259ba31d8a
commit
a9ec8adff3
5 changed files with 67 additions and 63 deletions
|
@ -1,3 +1,12 @@
|
|||
Thu Jan 23 14:56:52 2003 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||
|
||||
* lib/rational.rb: modified to support "quo".
|
||||
|
||||
* numeric.c (num_quo): should return most exact quotient value,
|
||||
i.e. float by default, rational if available.
|
||||
|
||||
* numeric.c (num_div): "div" should return x.divmod(x)[0].
|
||||
|
||||
Thu Jan 23 13:24:18 2003 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||
|
||||
* time.c (time_arg): was accessing garbage argv value.
|
||||
|
|
28
bignum.c
28
bignum.c
|
@ -1284,7 +1284,6 @@ rb_big_div(x, y)
|
|||
return bignorm(z);
|
||||
}
|
||||
|
||||
|
||||
static VALUE
|
||||
rb_big_modulo(x, y)
|
||||
VALUE x, y;
|
||||
|
@ -1351,6 +1350,32 @@ rb_big_divmod(x, y)
|
|||
return rb_assoc_new(bignorm(div), bignorm(mod));
|
||||
}
|
||||
|
||||
static VALUE
|
||||
rb_big_quo(x, y)
|
||||
VALUE x, y;
|
||||
{
|
||||
double dx = rb_big2dbl(x);
|
||||
double dy;
|
||||
|
||||
switch (TYPE(y)) {
|
||||
case T_FIXNUM:
|
||||
dy = (double)FIX2LONG(y);
|
||||
break;
|
||||
|
||||
case T_BIGNUM:
|
||||
dy = rb_big2dbl(y);
|
||||
break;
|
||||
|
||||
case T_FLOAT:
|
||||
dy = RFLOAT(y)->value;
|
||||
break;
|
||||
|
||||
default:
|
||||
return rb_num_coerce_bin(x, y);
|
||||
}
|
||||
return rb_float_new(dx / dy);
|
||||
}
|
||||
|
||||
VALUE
|
||||
rb_big_pow(x, y)
|
||||
VALUE x, y;
|
||||
|
@ -1739,6 +1764,7 @@ Init_Bignum()
|
|||
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);
|
||||
rb_define_method(rb_cBignum, "quo", rb_big_quo, 1);
|
||||
rb_define_method(rb_cBignum, "**", rb_big_pow, 1);
|
||||
rb_define_method(rb_cBignum, "&", rb_big_and, 1);
|
||||
rb_define_method(rb_cBignum, "|", rb_big_or, 1);
|
||||
|
|
11
lib/mathn.rb
11
lib/mathn.rb
|
@ -106,18 +106,11 @@ class Prime
|
|||
end
|
||||
|
||||
class Fixnum
|
||||
alias divmod! divmod
|
||||
alias / rdiv
|
||||
def divmod(other)
|
||||
a = self.div(other)
|
||||
b = self % other
|
||||
return a,b
|
||||
end
|
||||
alias / quo
|
||||
end
|
||||
|
||||
class Bignum
|
||||
alias divmod! divmod
|
||||
alias / rdiv
|
||||
alias / quo
|
||||
end
|
||||
|
||||
class Rational
|
||||
|
|
|
@ -31,8 +31,9 @@
|
|||
# Integer::to_r
|
||||
#
|
||||
# Fixnum::**
|
||||
# Fixnum::quo
|
||||
# Bignum::**
|
||||
#
|
||||
# Bignum::quo
|
||||
#
|
||||
|
||||
def Rational(a, b = 1)
|
||||
|
@ -312,41 +313,14 @@ class Integer
|
|||
end
|
||||
|
||||
class Fixnum
|
||||
alias div! /;
|
||||
def div(other)
|
||||
if other.kind_of?(Fixnum)
|
||||
self.div!(other)
|
||||
elsif other.kind_of?(Bignum)
|
||||
x, y = other.coerce(self)
|
||||
x.div!(y)
|
||||
else
|
||||
x, y = other.coerce(self)
|
||||
x / y
|
||||
end
|
||||
end
|
||||
|
||||
# alias divmod! divmod
|
||||
|
||||
if not defined? Complex
|
||||
alias power! **;
|
||||
end
|
||||
|
||||
# def rdiv(other)
|
||||
# if other.kind_of?(Fixnum)
|
||||
# Rational(self, other)
|
||||
# elsif
|
||||
# x, y = other.coerce(self)
|
||||
# if defined?(x.div())
|
||||
# x.div(y)
|
||||
# else
|
||||
# x / y
|
||||
# end
|
||||
# end
|
||||
# end
|
||||
|
||||
def rdiv(other)
|
||||
def quo(other)
|
||||
Rational.new!(self,1) / other
|
||||
end
|
||||
alias rdiv quo
|
||||
|
||||
def rpower (other)
|
||||
if other >= 0
|
||||
|
@ -362,17 +336,14 @@ class Fixnum
|
|||
end
|
||||
|
||||
class Bignum
|
||||
alias div! /;
|
||||
alias div /;
|
||||
alias divmod! divmod
|
||||
|
||||
if not defined? power!
|
||||
alias power! **
|
||||
end
|
||||
|
||||
def rdiv(other)
|
||||
def quo(other)
|
||||
Rational.new!(self,1) / other
|
||||
end
|
||||
alias rdiv quo
|
||||
|
||||
def rpower (other)
|
||||
if other >= 0
|
||||
|
@ -385,6 +356,4 @@ class Bignum
|
|||
if not defined? Complex
|
||||
alias ** rpower
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
|
39
numeric.c
39
numeric.c
|
@ -57,7 +57,7 @@
|
|||
#define DBL_EPSILON 2.2204460492503131e-16
|
||||
#endif
|
||||
|
||||
static ID id_coerce, id_to_i, id_div;
|
||||
static ID id_coerce, id_to_i;
|
||||
|
||||
VALUE rb_cNumeric;
|
||||
VALUE rb_cFloat;
|
||||
|
@ -169,29 +169,25 @@ num_uminus(num)
|
|||
return rb_funcall(zero, '-', 1, num);
|
||||
}
|
||||
|
||||
static VALUE
|
||||
num_quo(x, y)
|
||||
VALUE x, y;
|
||||
{
|
||||
return rb_funcall(x, '/', 1, y);
|
||||
}
|
||||
|
||||
static VALUE
|
||||
num_div(x, y)
|
||||
VALUE x, y;
|
||||
{
|
||||
return rb_funcall(x, id_div, 1, y);
|
||||
return rb_Integer(rb_funcall(x, '/', 1, y));
|
||||
}
|
||||
|
||||
static VALUE
|
||||
num_divmod(x, y)
|
||||
VALUE x, y;
|
||||
{
|
||||
VALUE div, mod;
|
||||
|
||||
div = rb_funcall(x, id_div, 1, y);
|
||||
if (TYPE(div) == T_FLOAT) {
|
||||
double d = floor(RFLOAT(div)->value);
|
||||
|
||||
if (RFLOAT(div)->value > d) {
|
||||
div = rb_float_new(d);
|
||||
}
|
||||
}
|
||||
mod = rb_funcall(x, '%', 1, y);
|
||||
return rb_assoc_new(div, mod);
|
||||
return rb_assoc_new(num_div(x, y), rb_funcall(x, '%', 1, y));
|
||||
}
|
||||
|
||||
static VALUE
|
||||
|
@ -1303,6 +1299,16 @@ fixdivmod(x, y, divp, modp)
|
|||
if (modp) *modp = mod;
|
||||
}
|
||||
|
||||
static VALUE
|
||||
fix_quo(x, y)
|
||||
VALUE x, y;
|
||||
{
|
||||
if (FIXNUM_P(y)) {
|
||||
return rb_float_new((double)FIX2LONG(x) / (double)FIX2LONG(y));
|
||||
}
|
||||
return rb_num_coerce_bin(x, y);
|
||||
}
|
||||
|
||||
static VALUE
|
||||
fix_div(x, y)
|
||||
VALUE x, y;
|
||||
|
@ -1706,7 +1712,6 @@ Init_Numeric()
|
|||
#endif
|
||||
id_coerce = rb_intern("coerce");
|
||||
id_to_i = rb_intern("to_i");
|
||||
id_div = rb_intern("div");
|
||||
|
||||
rb_eZeroDivError = rb_define_class("ZeroDivisionError", rb_eStandardError);
|
||||
rb_eFloatDomainError = rb_define_class("FloatDomainError", rb_eRangeError);
|
||||
|
@ -1721,7 +1726,8 @@ Init_Numeric()
|
|||
rb_define_method(rb_cNumeric, "===", num_equal, 1);
|
||||
rb_define_method(rb_cNumeric, "<=>", num_cmp, 1);
|
||||
rb_define_method(rb_cNumeric, "eql?", num_eql, 1);
|
||||
rb_define_method(rb_cNumeric, "/", num_div, 1);
|
||||
rb_define_method(rb_cNumeric, "quo", 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);
|
||||
rb_define_method(rb_cNumeric, "remainder", num_remainder, 1);
|
||||
|
@ -1776,6 +1782,7 @@ Init_Numeric()
|
|||
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, "**", fix_pow, 1);
|
||||
|
||||
rb_define_method(rb_cFixnum, "abs", fix_abs, 0);
|
||||
|
|
Loading…
Reference in a new issue