1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

Add RDoc comments

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@5315 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
dave 2003-12-27 05:46:46 +00:00
parent e950d051e1
commit 791f868395
2 changed files with 360 additions and 0 deletions

View file

@ -1,3 +1,7 @@
Sat Dec 27 14:39:53 2003 Dave Thomas <dave@pragprog.com>
* numeric.c (Init_Numeric): Add RDoc comments.
Sat Dec 27 00:44:00 2003 Yukihiro Matsumoto <matz@ruby-lang.org> Sat Dec 27 00:44:00 2003 Yukihiro Matsumoto <matz@ruby-lang.org>
* io.c (next_argv): warn always for stdin on inplace edit mode. * io.c (next_argv): warn always for stdin on inplace edit mode.

356
numeric.c
View file

@ -78,6 +78,23 @@ rb_num_zerodiv()
rb_raise(rb_eZeroDivError, "divided by 0"); rb_raise(rb_eZeroDivError, "divided by 0");
} }
/*
* call-seq:
* num.coerce(numeric) => array
*
* If <i>aNumeric</i> is the same type as <i>num</i>, returns an array
* containing <i>aNumeric</i> and <i>num</i>. Otherwise, returns an
* array with both <i>aNumeric</i> and <i>num</i> represented as
* <code>Float</code> objects. This coercion mechanism is used by
* Ruby to handle mixed-type numeric operations: it is intended to
* find a compatible common type between the two operands of the operator.
*
* 1.coerce(2.5) #=> [2.5, 1.0]
* 1.2.coerce(3) #=> [3.0, 1.2]
* 1.coerce(2) #=> [2, 1]
*/
static VALUE static VALUE
num_coerce(x, y) num_coerce(x, y)
VALUE x, y; VALUE x, y;
@ -162,6 +179,11 @@ rb_num_coerce_relop(x, y)
return c; return c;
} }
/*
* Trap attempts to add methods to <code>Numeric</code> objects. Always
* raises a <code>TypeError</code>
*/
static VALUE static VALUE
num_sadded(x, name) num_sadded(x, name)
VALUE x, name; VALUE x, name;
@ -184,6 +206,13 @@ num_init_copy(x, y)
return Qnil; /* not reached */ return Qnil; /* not reached */
} }
/*
* call-seq:
* +num => num
*
* Unary Plus---Returns the receiver's value.
*/
static VALUE static VALUE
num_uplus(num) num_uplus(num)
VALUE num; VALUE num;
@ -191,6 +220,13 @@ num_uplus(num)
return num; return num;
} }
/*
* call-seq:
* --num => numeric
*
* Unary Minus---Returns the receiver's value, negated.
*/
static VALUE static VALUE
num_uminus(num) num_uminus(num)
VALUE num; VALUE num;
@ -203,6 +239,13 @@ num_uminus(num)
return rb_funcall(zero, '-', 1, num); return rb_funcall(zero, '-', 1, num);
} }
/*
* call-seq:
* num.quo(numeric) => result
*
* Equivalent to <code>Numeric#/</code>, but overridden in subclasses.
*/
static VALUE static VALUE
num_quo(x, y) num_quo(x, y)
VALUE x, y; VALUE x, y;
@ -210,6 +253,16 @@ num_quo(x, y)
return rb_funcall(x, '/', 1, y); return rb_funcall(x, '/', 1, y);
} }
/*
* call-seq:
* num.div(numeric) => integer
*
* Uses <code>/</code> to perform division, then converts the result to
* an integer. <code>Numeric</code> does not define the <code>/</code>
* operator; this is left to subclasses.
*/
static VALUE static VALUE
num_div(x, y) num_div(x, y)
VALUE x, y; VALUE x, y;
@ -217,6 +270,48 @@ num_div(x, y)
return rb_Integer(rb_funcall(x, '/', 1, y)); return rb_Integer(rb_funcall(x, '/', 1, y));
} }
/*
* call-seq:
* num.divmod( aNumeric ) -> anArray
*
* Returns an array containing the quotient and modulus obtained by
* dividing <i>num</i> by <i>aNumeric</i>. If <code>q, r =
* x.divmod(y)</code>, then
*
* q = floor(float(x)/float(y))
* x = q*y + r
*
* The quotient is rounded toward -infinity, as shown in the following table:
*
* a | b | a.divmod(b) | a/b | a.modulo(b) | a.remainder(b)
* ------+-----+---------------+---------+-------------+---------------
* 13 | 4 | 3, 1 | 3 | 1 | 1
* ------+-----+---------------+---------+-------------+---------------
* 13 | -4 | -4, -3 | -3 | -3 | 1
* ------+-----+---------------+---------+-------------+---------------
* -13 | 4 | -4, 3 | -4 | 3 | -1
* ------+-----+---------------+---------+-------------+---------------
* -13 | -4 | 3, -1 | 3 | -1 | -1
* ------+-----+---------------+---------+-------------+---------------
* 11.5 | 4 | 2.0, 3.5 | 2.875 | 3.5 | 3.5
* ------+-----+---------------+---------+-------------+---------------
* 11.5 | -4 | -3.0, -0.5 | -2.875 | -0.5 | 3.5
* ------+-----+---------------+---------+-------------+---------------
* -11.5 | 4 | -3.0 0.5 | -2.875 | 0.5 | -3.5
* ------+-----+---------------+---------+-------------+---------------
* -11.5 | -4 | 2.0 -3.5 | 2.875 | -3.5 | -3.5
*
*
* Examples
* 11.divmod(3) #=> [3, 2]
* 11.divmod(-3) #=> [-4, -1]
* 11.divmod(3.5) #=> [3.0, 0.5]
* (-11).divmod(3.5) #=> [-4.0, 3.0]
* (11.5).divmod(3.5) #=> [3.0, 1.0]
*/
static VALUE static VALUE
num_divmod(x, y) num_divmod(x, y)
VALUE x, y; VALUE x, y;
@ -224,6 +319,14 @@ num_divmod(x, y)
return rb_assoc_new(num_div(x, y), rb_funcall(x, '%', 1, y)); return rb_assoc_new(num_div(x, y), rb_funcall(x, '%', 1, y));
} }
/*
* call-seq:
* num.modulo(numeric) => result
*
* Equivalent to
* <i>num</i>.<code>divmod(</code><i>aNumeric</i><code>)[1]</code>.
*/
static VALUE static VALUE
num_modulo(x, y) num_modulo(x, y)
VALUE x, y; VALUE x, y;
@ -231,6 +334,18 @@ num_modulo(x, y)
return rb_funcall(x, '%', 1, y); return rb_funcall(x, '%', 1, y);
} }
/*
* call-seq:
* num.remainder(numeric) => result
*
* If <i>num</i> and <i>numeric</i> have different signs, returns
* <em>mod</em>-<i>numeric</i>; otherwise, returns <em>mod</em>. In
* both cases <em>mod</em> is the value
* <i>num</i>.<code>modulo(</code><i>numeric</i><code>)</code>. The
* differences between <code>remainder</code> and modulo
* (<code>%</code>) are shown in the table under <code>Numeric#divmod</code>.
*/
static VALUE static VALUE
num_remainder(x, y) num_remainder(x, y)
VALUE x, y; VALUE x, y;
@ -247,6 +362,14 @@ num_remainder(x, y)
return z; return z;
} }
/*
* call-seq:
* num.integer? -> true or false
*
* Returns <code>true</code> if <i>num</i> is an <code>Integer</code>
* (including <code>Fixnum</code> and <code>Bignum</code>).
*/
static VALUE static VALUE
num_int_p(num) num_int_p(num)
VALUE num; VALUE num;
@ -254,6 +377,17 @@ num_int_p(num)
return Qfalse; return Qfalse;
} }
/*
* call-seq:
* num.abs => num or numeric
*
* Returns the absolute value of <i>num</i>.
*
* 12.abs #=> 12
* (-34.56).abs #=> 34.56
* -34.56.abs #=> 34.56
*/
static VALUE static VALUE
num_abs(num) num_abs(num)
VALUE num; VALUE num;
@ -264,6 +398,14 @@ num_abs(num)
return num; return num;
} }
/*
* call-seq:
* num.zero? => true or false
*
* Returns <code>true</code> if <i>num</i> has a zero value.
*/
static VALUE static VALUE
num_zero_p(num) num_zero_p(num)
VALUE num; VALUE num;
@ -274,6 +416,19 @@ num_zero_p(num)
return Qfalse; return Qfalse;
} }
/*
* call-seq:
* num.nonzero? => num or nil
*
* Returns <i>num</i> if <i>num</i> is not zero, <code>nil</code>
* otherwise. This behavior is useful when chaining comparisons:
*
* a = %w( z Bb bB bb BB a aA Aa AA A )
* b = a.sort {|a,b| (a.downcase <=> b.downcase).nonzero? || a <=> b }
* b #=> ["A", "a", "AA", "Aa", "aA", "BB", "Bb", "bB", "bb", "z"]
*/
static VALUE static VALUE
num_nonzero_p(num) num_nonzero_p(num)
VALUE num; VALUE num;
@ -284,6 +439,14 @@ num_nonzero_p(num)
return num; return num;
} }
/*
* call-seq:
* num.to_int => integer
*
* Invokes the child class's <code>to_i</code> method to convert
* <i>num</i> to an integer.
*/
static VALUE static VALUE
num_to_int(num) num_to_int(num)
VALUE num; VALUE num;
@ -602,6 +765,18 @@ flo_pow(x, y)
} }
} }
/*
* call-seq:
* num.eql?(numeric) => true or false
*
* Returns <code>true</code> if <i>num</i> and <i>numeric</i> are the
* same type and have equal values.
*
* 1 == 1.0 #=> true
* 1.eql?(1.0) #=> false
* (1.0).eql?(1.0) #=> true
*/
static VALUE static VALUE
num_eql(x, y) num_eql(x, y)
VALUE x, y; VALUE x, y;
@ -611,6 +786,14 @@ num_eql(x, y)
return rb_equal(x, y); return rb_equal(x, y);
} }
/*
* call-seq:
* num <=> other -> 0 or nil
*
* Returns zero if <i>num</i> equals <i>other</i>, <code>nil</code>
* otherwise.
*/
static VALUE static VALUE
num_cmp(x, y) num_cmp(x, y)
VALUE x, y; VALUE x, y;
@ -1135,6 +1318,19 @@ flo_truncate(num)
return LONG2FIX(val); return LONG2FIX(val);
} }
/*
* call-seq:
* num.floor => integer
*
* Returns the largest integer less than or equal to <i>num</i>.
* <code>Numeric</code> implements this by converting <i>anInteger</i>
* to a <code>Float</code> and invoking <code>Float#floor</code>.
*
* 1.floor #=> 1
* (-1).floor #=> -1
*/
static VALUE static VALUE
num_floor(num) num_floor(num)
VALUE num; VALUE num;
@ -1142,6 +1338,22 @@ num_floor(num)
return flo_floor(rb_Float(num)); return flo_floor(rb_Float(num));
} }
/*
* call-seq:
* num.ceil => integer
*
* Returns the smallest <code>Integer</code> greater than or equal to
* <i>num</i>. Class <code>Numeric</code> achieves this by converting
* itself to a <code>Float</code> then invoking
* <code>Float#ceil</code>.
*
* 1.ceil #=> 1
* 1.2.ceil #=> 2
* (-1.2).ceil #=> -1
* (-1.0).ceil #=> -1
*/
static VALUE static VALUE
num_ceil(num) num_ceil(num)
VALUE num; VALUE num;
@ -1149,6 +1361,15 @@ num_ceil(num)
return flo_ceil(rb_Float(num)); return flo_ceil(rb_Float(num));
} }
/*
* call-seq:
* num.round => integer
*
* Rounds <i>num</i> to the nearest integer. <code>Numeric</code>
* implements this by converting itself to a
* <code>Float</code> and invoking <code>Float#round</code>.
*/
static VALUE static VALUE
num_round(num) num_round(num)
VALUE num; VALUE num;
@ -1156,6 +1377,15 @@ num_round(num)
return flo_round(rb_Float(num)); return flo_round(rb_Float(num));
} }
/*
* call-seq:
* num.truncate => integer
*
* Returns <i>num</i> truncated to an integer. <code>Numeric</code>
* implements this by converting its value to a float and invoking
* <code>Float#truncate</code>.
*/
static VALUE static VALUE
num_truncate(num) num_truncate(num)
VALUE num; VALUE num;
@ -1163,6 +1393,34 @@ num_truncate(num)
return flo_truncate(rb_Float(num)); return flo_truncate(rb_Float(num));
} }
/*
* call-seq:
* num.step(limit, step ) {|i| block } => num
*
* Invokes <em>block</em> with the sequence of numbers starting at
* <i>num</i>, incremented by <i>step</i> on each call. The loop
* finishes when the value to be passed to the block is greater than
* <i>limit</i> (if <i>step</i> is positive) or less than
* <i>limit</i> (if <i>step</i> is negative). If all the arguments are
* integers, the loop operates using an integer counter. If any of the
* arguments are floating point numbers, all are converted to floats,
* and the loop is executed <i>floor(n + n*epsilon)+ 1</i> times,
* where <i>n = (limit - num)/step</i>. Otherwise, the loop
* starts at <i>num</i>, uses either the <code><</code> or
* <code>></code> operator to compare the counter against
* <i>limit</i>, and increments itself using the <code>+</code>
* operator.
*
* 1.step(10, 2) { |i| print i, " " }
* Math::E.step(Math::PI, 0.2) { |f| print f, " " }
*
* <em>produces:</em>
*
* 1 3 5 7 9
* 2.71828182845905 2.91828182845905 3.11828182845905
*/
static VALUE static VALUE
num_step(argc, argv, from) num_step(argc, argv, from)
int argc; int argc;
@ -1451,6 +1709,29 @@ rb_num2ull(val)
#endif /* HAVE_LONG_LONG */ #endif /* HAVE_LONG_LONG */
/*
* Document-class: Integer
*
* <code>Integer</code> is the basis for the two concrete classes that
* hold whole numbers, <code>Bignum</code> and <code>Fixnum</code>.
*
*/
/*
* call-seq:
* int.to_i => int
* int.to_int => int
* int.floor => int
* int.ceil => int
* int.round => int
* int.truncate => int
*
* As <i>int</i> is already an <code>Integer</code>, all these
* methods simply return the receiver.
*/
static VALUE static VALUE
int_to_i(num) int_to_i(num)
VALUE num; VALUE num;
@ -1458,6 +1739,13 @@ int_to_i(num)
return num; return num;
} }
/*
* call-seq:
* int.integer? -> true
*
* Always returns <code>true</code>.
*/
static VALUE static VALUE
int_int_p(num) int_int_p(num)
VALUE num; VALUE num;
@ -1465,6 +1753,17 @@ int_int_p(num)
return Qtrue; return Qtrue;
} }
/*
* call-seq:
* int.next => integer
* int.succ => integer
*
* Returns the <code>Integer</code> equal to <i>int</i> + 1.
*
* 1.next #=> 2
* (-1).next #=> 0
*/
static VALUE static VALUE
int_succ(num) int_succ(num)
VALUE num; VALUE num;
@ -1476,6 +1775,18 @@ int_succ(num)
return rb_funcall(num, '+', 1, INT2FIX(1)); return rb_funcall(num, '+', 1, INT2FIX(1));
} }
/*
* call-seq:
* int.chr => string
*
* Returns a string containing the ASCII character represented by the
* receiver's value.
*
* 65.chr #=> "A"
* ?a.chr #=> "a"
* 230.chr #=> "\346"
*/
static VALUE static VALUE
int_chr(num) int_chr(num)
VALUE num; VALUE num;
@ -2320,6 +2631,20 @@ fix_size(fix)
return INT2FIX(sizeof(long)); return INT2FIX(sizeof(long));
} }
/*
* call-seq:
* int.upto(limit) {|i| block } => int
*
* Iterates <em>block</em>, passing in integer values from <i>int</i>
* up to and including <i>limit</i>.
*
* 5.upto(10) { |i| print i, " " }
*
* <em>produces:</em>
*
* 5 6 7 8 9 10
*/
static VALUE static VALUE
int_upto(from, to) int_upto(from, to)
VALUE from, to; VALUE from, to;
@ -2344,6 +2669,21 @@ int_upto(from, to)
return from; return from;
} }
/*
* call-seq:
* int.downto(limit) {|i| block } => int
*
* Iterates <em>block</em>, passing decreasing values from <i>int</i>
* down to and including <i>limit</i>.
*
* 5.downto(1) { |n| print n, ".. " }
* print " Liftoff!\n"
*
* <em>produces:</em>
*
* 5.. 4.. 3.. 2.. 1.. Liftoff!
*/
static VALUE static VALUE
int_downto(from, to) int_downto(from, to)
VALUE from, to; VALUE from, to;
@ -2368,6 +2708,22 @@ int_downto(from, to)
return from; return from;
} }
/*
* call-seq:
* int.times {|i| block } => int
*
* Iterates block <i>int</i> times, passing in values from zero to
* <i>int</i> - 1.
*
* 5.times do |i|
* print i, " "
* end
*
* <em>produces:</em>
*
* 0 1 2 3 4
*/
static VALUE static VALUE
int_dotimes(num) int_dotimes(num)
VALUE num; VALUE num;