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…
	
	Add table
		Add a link
		
	
		Reference in a new issue