From f86ad72d2a2fe28004570c401f506a713e764fec Mon Sep 17 00:00:00 2001 From: tadf Date: Fri, 19 Jun 2009 13:37:04 +0000 Subject: [PATCH] due to conflict git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@23746 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 15 ++++ numeric.c | 232 ++++++++++++++++++++++++------------------------ rational.c | 253 ++++++++++++++++++++++++++++++----------------------- 3 files changed, 277 insertions(+), 223 deletions(-) diff --git a/ChangeLog b/ChangeLog index 97cd75a5c9..a9d2b2e5cf 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +Fri Jun 19 22:21:17 2009 Tadayoshi Funaba + + * numeric.c: edited rdoc. + +Fri Jun 19 21:56:01 2009 Tadayoshi Funaba + + * rational.c (nurat_expt): delegates to complex when self is + negative. bacause Float#** does not produce complex. + +Fri Jun 19 21:40:58 2009 Tadayoshi Funaba + + * numeric.c: edited rdoc. + + * rational.c: ditto. + Fri Jun 19 20:53:54 2009 Yukihiro Matsumoto * encoding.c (rb_enc_name_list): update RDoc. [ruby-core:23926] diff --git a/numeric.c b/numeric.c index 8ba7d3fd7e..aee74cb098 100644 --- a/numeric.c +++ b/numeric.c @@ -103,7 +103,7 @@ rb_num_zerodiv(void) /* * call-seq: - * num.coerce(numeric) => array + * num.coerce(numeric) => array * * If aNumeric is the same type as num, returns an array * containing aNumeric and num. Otherwise, returns an @@ -225,7 +225,7 @@ num_init_copy(VALUE x, VALUE y) /* * call-seq: - * +num => num + * +num => num * * Unary Plus---Returns the receiver's value. */ @@ -238,7 +238,7 @@ num_uplus(VALUE num) /* * call-seq: - * -num => numeric + * -num => numeric * * Unary Minus---Returns the receiver's value, negated. */ @@ -256,7 +256,7 @@ num_uminus(VALUE num) /* * call-seq: - * num.quo(numeric) => result + * num.quo(numeric) => result * * Returns most exact division (rational for integers, float for floats). */ @@ -270,7 +270,7 @@ num_quo(VALUE x, VALUE y) /* * call-seq: - * num.fdiv(numeric) => float + * num.fdiv(numeric) => float * * Returns float division. */ @@ -286,11 +286,16 @@ static VALUE num_floor(VALUE num); /* * call-seq: - * num.div(numeric) => integer + * num.div(numeric) => integer * * Uses / to perform division, then converts the result to - * an integer. Numeric does not define the / + * an integer. numeric does not define the / * operator; this is left to subclasses. + * + * Equivalent to + * num.divmod(aNumeric)[0]. + * + * See Numeric#divmod. */ static VALUE @@ -303,14 +308,14 @@ num_div(VALUE x, VALUE y) /* * call-seq: - * num.divmod( aNumeric ) -> anArray + * num.divmod(numeric) => array * * Returns an array containing the quotient and modulus obtained by - * dividing num by aNumeric. If q, r = + * dividing num by numeric. If q, r = * x.divmod(y), then * - * q = floor(float(x)/float(y)) - * x = q*y + r + * q = floor(x/y) + * x = q*y+r * * The quotient is rounded toward -infinity, as shown in the following table: * @@ -350,10 +355,14 @@ num_divmod(VALUE x, VALUE y) /* * call-seq: - * num.modulo(numeric) => result + * num.modulo(numeric) => result + * + * x.modulo(y) means x-y*(x/y).floor * * Equivalent to * num.divmod(aNumeric)[1]. + * + * See Numeric#divmod. */ static VALUE @@ -364,14 +373,11 @@ num_modulo(VALUE x, VALUE y) /* * call-seq: - * num.remainder(numeric) => result + * num.remainder(numeric) => result * - * If num and numeric have different signs, returns - * mod-numeric; otherwise, returns mod. In - * both cases mod is the value - * num.modulo(numeric). The - * differences between remainder and modulo - * (%) are shown in the table under Numeric#divmod. + * x.remainder(y) means x-y*(x/y).truncate + * + * See Numeric#divmod. */ static VALUE @@ -391,7 +397,7 @@ num_remainder(VALUE x, VALUE y) /* * call-seq: - * num.real? -> true or false + * num.real? => true or false * * Returns true if num is a Real * (i.e. non Complex). @@ -405,7 +411,7 @@ num_real_p(VALUE num) /* * call-seq: - * num.integer? -> true or false + * num.integer? => true or false * * Returns true if num is an Integer * (including Fixnum and Bignum). @@ -419,7 +425,7 @@ num_int_p(VALUE num) /* * call-seq: - * num.abs => num or numeric + * num.abs => num or numeric * * Returns the absolute value of num. * @@ -440,7 +446,7 @@ num_abs(VALUE num) /* * call-seq: - * num.zero? => true or false + * num.zero? => true or false * * Returns true if num has a zero value. */ @@ -457,7 +463,7 @@ num_zero_p(VALUE num) /* * call-seq: - * num.nonzero? => num or nil + * num.nonzero? => num or nil * * Returns num if num is not zero, nil * otherwise. This behavior is useful when chaining comparisons: @@ -478,7 +484,7 @@ num_nonzero_p(VALUE num) /* * call-seq: - * num.to_int => integer + * num.to_int => integer * * Invokes the child class's to_i method to convert * num to an integer. @@ -511,7 +517,7 @@ rb_float_new(double d) /* * call-seq: - * flt.to_s => string + * flt.to_s => string * * Returns a string containing a representation of self. As well as a * fixed or exponential form of the number, the call may return @@ -565,7 +571,7 @@ flo_coerce(VALUE x, VALUE y) /* * call-seq: - * -float => float + * -float => float * * Returns float, negated. */ @@ -578,7 +584,7 @@ flo_uminus(VALUE flt) /* * call-seq: - * float + other => float + * float + other => float * * Returns a new float which is the sum of float * and other. @@ -601,7 +607,7 @@ flo_plus(VALUE x, VALUE y) /* * call-seq: - * float + other => float + * float + other => float * * Returns a new float which is the difference of float * and other. @@ -624,7 +630,7 @@ flo_minus(VALUE x, VALUE y) /* * call-seq: - * float * other => float + * float * other => float * * Returns a new float which is the product of float * and other. @@ -647,7 +653,7 @@ flo_mul(VALUE x, VALUE y) /* * call-seq: - * float / other => float + * float / other => float * * Returns a new float which is the result of dividing * float by other. @@ -710,8 +716,8 @@ flodivmod(double x, double y, double *divp, double *modp) /* * call-seq: - * flt % other => float - * flt.modulo(other) => float + * flt % other => float + * flt.modulo(other) => float * * Return the modulo after division of flt by other. * @@ -759,7 +765,7 @@ dbl2ival(double d) /* * call-seq: - * flt.divmod(numeric) => array + * flt.divmod(numeric) => array * * See Numeric#divmod. */ @@ -792,7 +798,7 @@ flo_divmod(VALUE x, VALUE y) /* * call-seq: * - * flt ** other => float + * flt ** other => float * * Raises float the other power. */ @@ -814,7 +820,7 @@ flo_pow(VALUE x, VALUE y) /* * call-seq: - * num.eql?(numeric) => true or false + * num.eql?(numeric) => true or false * * Returns true if num and numeric are the * same type and have equal values. @@ -834,7 +840,7 @@ num_eql(VALUE x, VALUE y) /* * call-seq: - * num <=> other -> 0 or nil + * num <=> other => 0 or nil * * Returns zero if num equals other, nil * otherwise. @@ -856,7 +862,7 @@ num_equal(VALUE x, VALUE y) /* * call-seq: - * flt == obj => true or false + * flt == obj => true or false * * Returns true only if obj has the same value * as flt. Contrast this with Float#eql?, which @@ -896,7 +902,7 @@ flo_eq(VALUE x, VALUE y) /* * call-seq: - * flt.hash => integer + * flt.hash => integer * * Returns a hash code for this float. */ @@ -924,7 +930,7 @@ rb_dbl_cmp(double a, double b) /* * call-seq: - * flt <=> numeric => -1, 0, +1 + * flt <=> numeric => -1, 0, +1 * * Returns -1, 0, or +1 depending on whether flt is less than, * equal to, or greater than numeric. This is the basis for the @@ -968,7 +974,7 @@ flo_cmp(VALUE x, VALUE y) /* * call-seq: - * flt > other => true or false + * flt > other => true or false * * true if flt is greater than other. */ @@ -1006,7 +1012,7 @@ flo_gt(VALUE x, VALUE y) /* * call-seq: - * flt >= other => true or false + * flt >= other => true or false * * true if flt is greater than * or equal to other. @@ -1045,7 +1051,7 @@ flo_ge(VALUE x, VALUE y) /* * call-seq: - * flt < other => true or false + * flt < other => true or false * * true if flt is less than other. */ @@ -1083,7 +1089,7 @@ flo_lt(VALUE x, VALUE y) /* * call-seq: - * flt <= other => true or false + * flt <= other => true or false * * true if flt is less than * or equal to other. @@ -1122,7 +1128,7 @@ flo_le(VALUE x, VALUE y) /* * call-seq: - * flt.eql?(obj) => true or false + * flt.eql?(obj) => true or false * * Returns true only if obj is a * Float with the same value as flt. Contrast this @@ -1148,7 +1154,7 @@ flo_eql(VALUE x, VALUE y) /* * call-seq: - * flt.to_f => flt + * flt.to_f => self * * As flt is already a float, returns self. */ @@ -1161,7 +1167,7 @@ flo_to_f(VALUE num) /* * call-seq: - * flt.abs => float + * flt.abs => float * * Returns the absolute value of flt. * @@ -1179,7 +1185,7 @@ flo_abs(VALUE flt) /* * call-seq: - * flt.zero? -> true or false + * flt.zero? => true or false * * Returns true if flt is 0.0. * @@ -1196,7 +1202,7 @@ flo_zero_p(VALUE num) /* * call-seq: - * flt.nan? -> true or false + * flt.nan? => true or false * * Returns true if flt is an invalid IEEE floating * point number. @@ -1217,7 +1223,7 @@ flo_is_nan_p(VALUE num) /* * call-seq: - * flt.infinite? -> nil, -1, +1 + * flt.infinite? => nil, -1, +1 * * Returns nil, -1, or +1 depending on whether flt * is finite, -infinity, or +infinity. @@ -1241,7 +1247,7 @@ flo_is_infinite_p(VALUE num) /* * call-seq: - * flt.finite? -> true or false + * flt.finite? => true or false * * Returns true if flt is a valid IEEE floating * point number (it is not infinite, and nan? is @@ -1267,7 +1273,7 @@ flo_is_finite_p(VALUE num) /* * call-seq: - * flt.floor => integer + * flt.floor => integer * * Returns the largest integer less than or equal to flt. * @@ -1292,7 +1298,7 @@ flo_floor(VALUE num) /* * call-seq: - * flt.ceil => integer + * flt.ceil => integer * * Returns the smallest Integer greater than or equal to * flt. @@ -1318,7 +1324,7 @@ flo_ceil(VALUE num) /* * call-seq: - * flt.round([ndigits]) => integer or float + * flt.round([ndigits]) => integer or float * * Rounds flt to a given precision in decimal digits (default 0 digits). * Precision may be negative. Returns a a floating point number when ndigits @@ -1367,9 +1373,9 @@ flo_round(int argc, VALUE *argv, VALUE num) /* * call-seq: - * flt.to_i => integer - * flt.to_int => integer - * flt.truncate => integer + * flt.to_i => integer + * flt.to_int => integer + * flt.truncate => integer * * Returns flt truncated to an Integer. */ @@ -1392,7 +1398,7 @@ flo_truncate(VALUE num) /* * call-seq: - * num.floor => integer + * num.floor => integer * * Returns the largest integer less than or equal to num. * Numeric implements this by converting anInteger @@ -1411,7 +1417,7 @@ num_floor(VALUE num) /* * call-seq: - * num.ceil => integer + * num.ceil => integer * * Returns the smallest Integer greater than or equal to * num. Class Numeric achieves this by converting @@ -1432,7 +1438,7 @@ num_ceil(VALUE num) /* * call-seq: - * num.round([ndigits]) => integer or float + * num.round([ndigits]) => integer or float * * Rounds num to a given precision in decimal digits (default 0 digits). * Precision may be negative. Returns a a floating point number when ndigits @@ -1448,7 +1454,7 @@ num_round(int argc, VALUE* argv, VALUE num) /* * call-seq: - * num.truncate => integer + * num.truncate => integer * * Returns num truncated to an integer. Numeric * implements this by converting its value to a float and invoking @@ -1492,7 +1498,7 @@ ruby_float_step(VALUE from, VALUE to, VALUE step, int excl) /* * call-seq: - * num.step(limit, step ) {|i| block } => num + * num.step(limit, step ) {|i| block } => self * * Invokes block with the sequence of numbers starting at * num, incremented by step on each call. The loop @@ -1788,12 +1794,12 @@ rb_num2ull(VALUE val) /* * call-seq: - * int.to_i => int - * int.to_int => int - * int.floor => int - * int.ceil => int - * int.round => int - * int.truncate => int + * int.to_i => int + * int.to_int => int + * int.floor => int + * int.ceil => int + * int.round => int + * int.truncate => int * * As int is already an Integer, all these * methods simply return the receiver. @@ -1807,7 +1813,7 @@ int_to_i(VALUE num) /* * call-seq: - * int.integer? -> true + * int.integer? => true * * Always returns true. */ @@ -1820,7 +1826,7 @@ int_int_p(VALUE num) /* * call-seq: - * int.odd? -> true or false + * int.odd? => true or false * * Returns true if int is an odd number. */ @@ -1836,7 +1842,7 @@ int_odd_p(VALUE num) /* * call-seq: - * int.even? -> true or false + * int.even? => true or false * * Returns true if int is an even number. */ @@ -1852,8 +1858,8 @@ int_even_p(VALUE num) /* * call-seq: - * fixnum.next => integer - * fixnum.succ => integer + * fixnum.next => integer + * fixnum.succ => integer * * Returns the Integer equal to int + 1. * @@ -1870,8 +1876,8 @@ fix_succ(VALUE num) /* * call-seq: - * int.next => integer - * int.succ => integer + * int.next => integer + * int.succ => integer * * Returns the Integer equal to int + 1. * @@ -1891,7 +1897,7 @@ int_succ(VALUE num) /* * call-seq: - * int.pred => integer + * int.pred => integer * * Returns the Integer equal to int - 1. * @@ -1911,7 +1917,7 @@ int_pred(VALUE num) /* * call-seq: - * int.chr([encoding]) => string + * int.chr([encoding]) => string * * Returns a string containing the character represented by the * receiver's value according to +encoding+. @@ -1962,7 +1968,7 @@ int_chr(int argc, VALUE *argv, VALUE num) /* * call-seq: - * int.ord => int + * int.ord => self * * Returns the int itself. * @@ -2001,7 +2007,7 @@ int_ord(num) /* * call-seq: - * -fix => integer + * -fix => integer * * Negates fix (which might return a Bignum). */ @@ -2043,7 +2049,7 @@ rb_fix2str(VALUE x, int base) /* * call-seq: - * fix.to_s( base=10 ) -> aString + * fix.to_s(base=10) => string * * Returns a string containing the representation of fix radix * base (between 2 and 36). @@ -2074,7 +2080,7 @@ fix_to_s(int argc, VALUE *argv, VALUE x) /* * call-seq: - * fix + numeric => numeric_result + * fix + numeric => numeric_result * * Performs addition: the class of the resulting object depends on * the class of numeric and on the magnitude of the @@ -2107,7 +2113,7 @@ fix_plus(VALUE x, VALUE y) /* * call-seq: - * fix - numeric => numeric_result + * fix - numeric => numeric_result * * Performs subtraction: the class of the resulting object depends on * the class of numeric and on the magnitude of the @@ -2145,7 +2151,7 @@ fix_minus(VALUE x, VALUE y) /* * call-seq: - * fix * numeric => numeric_result + * fix * numeric => numeric_result * * Performs multiplication: the class of the resulting object depends on * the class of numeric and on the magnitude of the @@ -2227,7 +2233,7 @@ fixdivmod(long x, long y, long *divp, long *modp) /* * call-seq: - * fix.fdiv(numeric) => float + * fix.fdiv(numeric) => float * * Returns the floating point result of dividing fix by * numeric. @@ -2289,7 +2295,7 @@ fix_divide(VALUE x, VALUE y, ID op) /* * call-seq: - * fix / numeric => numeric_result + * fix / numeric => numeric_result * * Performs division: the class of the resulting object depends on * the class of numeric and on the magnitude of the @@ -2304,7 +2310,7 @@ fix_div(VALUE x, VALUE y) /* * call-seq: - * fix.div(numeric) => numeric_result + * fix.div(numeric) => integer * * Performs integer division: returns integer value. */ @@ -2317,11 +2323,11 @@ fix_idiv(VALUE x, VALUE y) /* * call-seq: - * fix % other => Numeric - * fix.modulo(other) => Numeric + * fix % other => numeric + * fix.modulo(other) => numeric * * Returns fix modulo other. - * See Numeric.divmod for more information. + * See numeric.divmod for more information. */ static VALUE @@ -2351,7 +2357,7 @@ fix_mod(VALUE x, VALUE y) /* * call-seq: - * fix.divmod(numeric) => array + * fix.divmod(numeric) => array * * See Numeric#divmod. */ @@ -2424,7 +2430,7 @@ int_pow(long x, unsigned long y) /* * call-seq: - * fix ** other => Numeric + * fix ** other => numeric * * Raises fix to the other power, which may * be negative or fractional. @@ -2488,7 +2494,7 @@ fix_pow(VALUE x, VALUE y) /* * call-seq: - * fix == other + * fix == other => true or false * * Return true if fix equals other * numerically. @@ -2514,7 +2520,7 @@ fix_equal(VALUE x, VALUE y) /* * call-seq: - * fix <=> numeric => -1, 0, +1 + * fix <=> numeric => -1, 0, +1 * * Comparison---Returns -1, 0, or +1 depending on whether fix is * less than, equal to, or greater than numeric. This is the @@ -2541,7 +2547,7 @@ fix_cmp(VALUE x, VALUE y) /* * call-seq: - * fix > other => true or false + * fix > other => true or false * * Returns true if the value of fix is * greater than that of other. @@ -2566,7 +2572,7 @@ fix_gt(VALUE x, VALUE y) /* * call-seq: - * fix >= other => true or false + * fix >= other => true or false * * Returns true if the value of fix is * greater than or equal to that of other. @@ -2591,7 +2597,7 @@ fix_ge(VALUE x, VALUE y) /* * call-seq: - * fix < other => true or false + * fix < other => true or false * * Returns true if the value of fix is * less than that of other. @@ -2616,7 +2622,7 @@ fix_lt(VALUE x, VALUE y) /* * call-seq: - * fix <= other => true or false + * fix <= other => true or false * * Returns true if the value of fix is * less than or equal to that of other. @@ -2641,7 +2647,7 @@ fix_le(VALUE x, VALUE y) /* * call-seq: - * ~fix => integer + * ~fix => integer * * One's complement: returns a number where each bit is flipped. */ @@ -2669,7 +2675,7 @@ bit_coerce(VALUE x) /* * call-seq: - * fix & other => integer + * fix & other => integer * * Bitwise AND. */ @@ -2688,7 +2694,7 @@ fix_and(VALUE x, VALUE y) /* * call-seq: - * fix | other => integer + * fix | other => integer * * Bitwise OR. */ @@ -2707,7 +2713,7 @@ fix_or(VALUE x, VALUE y) /* * call-seq: - * fix ^ other => integer + * fix ^ other => integer * * Bitwise EXCLUSIVE OR. */ @@ -2729,7 +2735,7 @@ static VALUE fix_rshift(long, unsigned long); /* * call-seq: - * fix << count => integer + * fix << count => integer * * Shifts _fix_ left _count_ positions (right if _count_ is negative). */ @@ -2761,7 +2767,7 @@ fix_lshift(long val, unsigned long width) /* * call-seq: - * fix >> count => integer + * fix >> count => integer * * Shifts _fix_ right _count_ positions (left if _count_ is negative). */ @@ -2794,7 +2800,7 @@ fix_rshift(long val, unsigned long i) /* * call-seq: - * fix[n] => 0, 1 + * fix[n] => 0, 1 * * Bit Reference---Returns the nth bit in the binary * representation of fix, where fix[0] is the least @@ -2837,7 +2843,7 @@ fix_aref(VALUE fix, VALUE idx) /* * call-seq: - * fix.to_f -> float + * fix.to_f => float * * Converts fix to a Float. * @@ -2855,7 +2861,7 @@ fix_to_f(VALUE num) /* * call-seq: - * fix.abs -> aFixnum + * fix.abs => fix * * Returns the absolute value of fix. * @@ -2878,7 +2884,7 @@ fix_abs(VALUE fix) /* * call-seq: - * fix.size -> fixnum + * fix.size => fixnum * * Returns the number of bytes in the machine representation * of a Fixnum. @@ -2896,7 +2902,7 @@ fix_size(VALUE fix) /* * call-seq: - * int.upto(limit) {|i| block } => int + * int.upto(limit) {|i| block } => self * * Iterates block, passing in integer values from int * up to and including limit. @@ -2934,7 +2940,7 @@ int_upto(VALUE from, VALUE to) /* * call-seq: - * int.downto(limit) {|i| block } => int + * int.downto(limit) {|i| block } => self * * Iterates block, passing decreasing values from int * down to and including limit. @@ -2973,7 +2979,7 @@ int_downto(VALUE from, VALUE to) /* * call-seq: - * int.times {|i| block } => int + * int.times {|i| block } => self * * Iterates block int times, passing in values from zero to * int - 1. @@ -3051,7 +3057,7 @@ int_round(int argc, VALUE* argv, VALUE num) /* * call-seq: - * fix.zero? => true or false + * fix.zero? => true or false * * Returns true if fix is zero. * @@ -3068,7 +3074,7 @@ fix_zero_p(VALUE num) /* * call-seq: - * fix.odd? -> true or false + * fix.odd? => true or false * * Returns true if fix is an odd number. */ @@ -3084,7 +3090,7 @@ fix_odd_p(VALUE num) /* * call-seq: - * fix.even? -> true or false + * fix.even? => true or false * * Returns true if fix is an even number. */ diff --git a/rational.c b/rational.c index ba7d83ba80..8bfe937d2f 100644 --- a/rational.c +++ b/rational.c @@ -510,12 +510,12 @@ nurat_f_rational(int argc, VALUE *argv, VALUE klass) /* * call-seq: - * rat.numerator => integer - * + * rat.numerator => integer + * * Returns the numerator of _rat_ as an +Integer+ object. * * For example: - * + * * Rational(7).numerator #=> 7 * Rational(7, 1).numerator #=> 7 * Rational(4.3, 40.3).numerator #=> 4841369599423283 @@ -529,16 +529,15 @@ nurat_numerator(VALUE self) return dat->num; } - /* * call-seq: - * rat.denominator => integer - * + * rat.denominator => integer + * * Returns the denominator of _rat_ as an +Integer+ object. If _rat_ was * created without an explicit denominator, +1+ is returned. * * For example: - * + * * Rational(7).denominator #=> 1 * Rational(7, 1).denominator #=> 1 * Rational(4.3, 40.3).denominator #=> 45373766245757744 @@ -639,7 +638,7 @@ f_addsub(VALUE self, VALUE anum, VALUE aden, VALUE bnum, VALUE bden, int k) /* * call-seq: - * rat + numeric => numeric_result + * rat + numeric => numeric_result * * Performs addition. The class of the resulting object depends on * the class of _numeric_ and on the magnitude of the @@ -687,10 +686,10 @@ nurat_add(VALUE self, VALUE other) /* * call-seq: - * rat - numeric => numeric_result + * rat - numeric => numeric_result * * Performs subtraction. The class of the resulting object depends on the - * class of _numeric_ and on the magnitude of the result. + * class of _numeric_ and on the magnitude of the result. * * A +TypeError+ is raised unless _numeric_ is a +Numeric+ object. * @@ -772,10 +771,10 @@ f_muldiv(VALUE self, VALUE anum, VALUE aden, VALUE bnum, VALUE bden, int k) /* * call-seq: - * rat * numeric => numeric_result + * rat * numeric => numeric_result * * Performs multiplication. The class of the resulting object depends on - * the class of _numeric_ and on the magnitude of the result. + * the class of _numeric_ and on the magnitude of the result. * * A +TypeError+ is raised unless _numeric_ is a +Numeric+ object. * @@ -818,11 +817,11 @@ nurat_mul(VALUE self, VALUE other) /* * call-seq: - * rat / numeric => numeric_result - * rat.quo(numeric) => numeric_result + * rat / numeric => numeric_result + * rat.quo(numeric) => numeric_result * * Performs division. The class of the resulting object depends on the class - * of _numeric_ and on the magnitude of the result. + * of _numeric_ and on the magnitude of the result. * * A +TypeError+ is raised unless _numeric_ is a +Numeric+ object. A * +ZeroDivisionError+ is raised if _numeric_ is 0. @@ -872,10 +871,10 @@ nurat_div(VALUE self, VALUE other) /* * call-seq: - * rat.fdiv(numeric) => float + * rat.fdiv(numeric) => float * * Performs float division: dividing _rat_ by _numeric_. The return value is a - * +Float+ object. + * +Float+ object. * * A +TypeError+ is raised unless _numeric_ is a +Numeric+ object. * @@ -895,7 +894,7 @@ nurat_fdiv(VALUE self, VALUE other) /* * call-seq: - * rat ** numeric => numeric_result + * rat ** numeric => numeric_result * * Performs exponentiation, i.e. it raises _rat_ to the exponent _numeric_. * The class of the resulting object depends on the class of _numeric_ and on @@ -906,7 +905,7 @@ nurat_fdiv(VALUE self, VALUE other) * * Rational(2, 3) ** Rational(2, 3) #=> 0.7631428283688879 * Rational(900) ** Rational(1) #=> (900/1) - * Rational(-2, 9) ** Rational(-9, 2) #=> NaN + * Rational(-2, 9) ** Rational(-9, 2) #=> (4.793639101185069e-13-869.8739233809262i) * Rational(9, 8) ** 4 #=> (6561/4096) * Rational(20, 9) ** 9.8 #=> 2503.325740344559 * Rational(3, 2) ** 2**3 #=> (6561/256) @@ -952,6 +951,8 @@ nurat_expt(VALUE self, VALUE other) } case T_FLOAT: case T_RATIONAL: + if (f_negative_p(self)) + return f_expt(rb_complex_new1(self), other); /* explicitly */ return f_expt(f_to_f(self), other); default: return rb_num_coerce_bin(self, other, id_expt); @@ -960,11 +961,11 @@ nurat_expt(VALUE self, VALUE other) /* * call-seq: - * rat <=> numeric => -1, 0, +1 + * rat <=> numeric => -1, 0, +1 * * Performs comparison. Returns -1, 0, or +1 depending on whether _rat_ is * less than, equal to, or greater than _numeric_. This is the basis for the - * tests in +Comparable+. + * tests in +Comparable+. * * A +TypeError+ is raised unless _numeric_ is a +Numeric+ object. * @@ -1018,7 +1019,7 @@ nurat_cmp(VALUE self, VALUE other) /* * call-seq: - * rat == numeric => +true+ or +false+ + * rat == numeric => +true+ or +false+ * * Tests for equality. Returns +true+ if _rat_ is equal to _numeric_; +false+ * otherwise. @@ -1071,7 +1072,7 @@ nurat_equal_p(VALUE self, VALUE other) /* * call-seq: - * rat.coerce(numeric) => array + * rat.coerce(numeric) => array * * If _numeric_ is a +Rational+ object, returns an +Array+ containing _rat_ * and _numeric_. Otherwise, returns an +Array+ with both _rat_ and _numeric_ @@ -1080,7 +1081,7 @@ nurat_equal_p(VALUE self, VALUE other) * find a compatible common type between the two operands of the operator. * * For example: - * + * * Rational(2).coerce(Rational(3)) #=> [(2), (3)] * Rational(5).coerce(7) #=> [(7, 1), (5, 1)] * Rational(9, 8).coerce(4) #=> [(4, 1), (9, 8)] @@ -1113,17 +1114,17 @@ nurat_coerce(VALUE self, VALUE other) /* * call-seq: - * rat.div(numeric) => integer + * rat.div(numeric) => integer * * Uses +/+ to divide _rat_ by _numeric_, then returns the floor of the result * as an +Integer+ object. * * A +TypeError+ is raised unless _numeric_ is a +Numeric+ object. A * +ZeroDivisionError+ is raised if _numeric_ is 0. A +FloatDomainError+ is - * raised if _numeric_ is 0.0. - * + * raised if _numeric_ is 0.0. + * * For example: - * + * * Rational(2, 3).div(Rational(2, 3)) #=> 1 * Rational(-2, 9).div(Rational(-9, 2)) #=> 0 * Rational(3, 4).div(0.1) #=> 7 @@ -1140,19 +1141,19 @@ nurat_idiv(VALUE self, VALUE other) /* * call-seq: - * rat.modulo(numeric) => numeric - * rat % numeric => numeric + * rat.modulo(numeric) => numeric + * rat % numeric => numeric * - * Returns the modulo of _rat_ and _numeric_ as a +Numeric+ object, i.e.: + * Returns the modulo of _rat_ and _numeric_ as a +Numeric+ object. + * + * x.modulo(y) means x-y*(x/y).floor * - * _rat_-_numeric_*(rat/numeric).floor - * * A +TypeError+ is raised unless _numeric_ is a +Numeric+ object. A * +ZeroDivisionError+ is raised if _numeric_ is 0. A +FloatDomainError+ is * raised if _numeric_ is 0.0. - * + * * For example: - * + * * Rational(2, 3) % Rational(2, 3) #=> (0/1) * Rational(2) % Rational(300) #=> (2/1) * Rational(-2, 9) % Rational(9, -2) #=> (-2/9) @@ -1167,20 +1168,19 @@ nurat_mod(VALUE self, VALUE other) return f_sub(self, f_mul(other, val)); } - /* * call-seq: - * rat.divmod(numeric) => array + * rat.divmod(numeric) => array * * Returns a two-element +Array+ containing the quotient and modulus obtained - * by dividing _rat_ by _numeric_. Both elements are +Numeric+. + * by dividing _rat_ by _numeric_. Both elements are +Numeric+. * * A +ZeroDivisionError+ is raised if _numeric_ is 0. A +FloatDomainError+ is * raised if _numeric_ is 0.0. A +TypeError+ is raised unless _numeric_ is a * +Numeric+ object. - * + * * For example: - * + * * Rational(3).divmod(3) #=> [1, (0/1)] * Rational(4).divmod(3) #=> [1, (1/1)] * Rational(5).divmod(3) #=> [1, (2/1)] @@ -1206,24 +1206,24 @@ nurat_quot(VALUE self, VALUE other) #endif /* - * call-seq: rat.remainder(numeric) => numeric_result + * call-seq: + * rat.remainder(numeric) => numeric_result * - * Returns the remainder of dividing _rat_ by _numeric_ as a +Numeric+ object, - * i.e.: + * Returns the remainder of dividing _rat_ by _numeric_ as a +Numeric+ object. * - * _rat_-_numeric_*(_rat_/_numeric_).truncate + * x.remainder(y) means x-y*(x/y).truncate * * A +ZeroDivisionError+ is raised if _numeric_ is 0. A +FloatDomainError+ is * raised if the result is Infinity or NaN, or _numeric_ is 0.0. A +TypeError+ * is raised unless _numeric_ is a +Numeric+ object. * * For example: - * + * * Rational(3, 4).remainder(Rational(3)) #=> (3/4) * Rational(12,13).remainder(-8) #=> (12/13) * Rational(2,3).remainder(-Rational(3,2)) #=> (2/3) * Rational(-5,7).remainder(7.1) #=> -0.7142857142857143 - * Rational(1).remainder(0) # ZeroDivisionError: + * Rational(1).remainder(0) # ZeroDivisionError: * # divided by zero */ static VALUE @@ -1245,14 +1245,14 @@ nurat_quotrem(VALUE self, VALUE other) /* * call-seq: - * rat.abs => rational + * rat.abs => rational * * Returns the absolute value of _rat_. If _rat_ is positive, it is * returned; if _rat_ is negative its negation is returned. The return value - * is a +Rational+ object. + * is a +Rational+ object. * * For example: - * + * * Rational(2).abs #=> (2/1) * Rational(-2).abs #=> (2/1) * Rational(-8, -1).abs #=> (8/1) @@ -1292,12 +1292,15 @@ nurat_ceil(VALUE self) /* * call-seq: - * rat.to_i => integer + * rat.to_i => integer * * Returns _rat_ truncated to an integer as an +Integer+ object. * + * Equivalent to + * rat.truncate(. + * * For example: - * + * * Rational(2, 3).to_i #=> 0 * Rational(3).to_i #=> 3 * Rational(300.6).to_i #=> 300 @@ -1366,9 +1369,9 @@ nurat_round_common(int argc, VALUE *argv, VALUE self, /* * call-seq: - * rat.floor => integer - * rat.floor(precision=0) => numeric - * + * rat.floor => integer + * rat.floor(precision=0) => numeric + * * Returns the largest integer less than or equal to _rat_ as an +Integer+ * object. Contrast with +Rational#ceil+. * @@ -1377,9 +1380,9 @@ nurat_round_common(int argc, VALUE *argv, VALUE self, * decimal places. If _precision_ is negative, the result is rounded downwards * to the nearest 10**_precision_. By default _precision_ is equal to 0, * causing the result to be a whole number. - * + * * For example: - * + * * Rational(2, 3).floor #=> 0 * Rational(3).floor #=> 3 * Rational(300.6).floor #=> 300 @@ -1400,9 +1403,9 @@ nurat_floor_n(int argc, VALUE *argv, VALUE self) /* * call-seq: - * rat.ceil => integer - * rat.ceil(precision=0) => numeric - * + * rat.ceil => integer + * rat.ceil(precision=0) => numeric + * * Returns the smallest integer greater than or equal to _rat_ as an +Integer+ * object. Contrast with +Rational#floor+. * @@ -1413,7 +1416,7 @@ nurat_floor_n(int argc, VALUE *argv, VALUE self) * causing the result to be a whole number. * * For example: - * + * * Rational(2, 3).ceil #=> 1 * Rational(3).ceil #=> 3 * Rational(300.6).ceil #=> 301 @@ -1445,7 +1448,7 @@ nurat_ceil_n(int argc, VALUE *argv, VALUE self) * causing the result to be a whole number. * * For example: - * + * * Rational(2, 3).truncate #=> 0 * Rational(3).truncate #=> 3 * Rational(300.6).truncate #=> 300 @@ -1467,9 +1470,9 @@ nurat_truncate_n(int argc, VALUE *argv, VALUE self) /* * call-seq: - * rat.round => integer + * rat.round => integer * rat.round(precision=0) => numeric - * + * * Rounds _rat_ to an integer, and returns the result as an +Integer+ object. * * An optional _precision_ argument can be supplied as an +Integer+. If @@ -1481,7 +1484,7 @@ nurat_truncate_n(int argc, VALUE *argv, VALUE self) * A +TypeError+ is raised if _integer_ is given and not an +Integer+ object. * * For example: - * + * * Rational(9, 3.3).round #=> 3 * Rational(9, 3.3).round(1) #=> (27/10) * Rational(9,3.3).round(2) #=> (273/100) @@ -1493,7 +1496,7 @@ nurat_truncate_n(int argc, VALUE *argv, VALUE self) * Rational(-123.456).round.to_f #=> -123.0 * Rational(-123.456).round(-1).to_f #=> -120.0 * Rational(-123.456).round(-2).to_f #=> -100.0 - * + * */ static VALUE nurat_round_n(int argc, VALUE *argv, VALUE self) @@ -1503,13 +1506,13 @@ nurat_round_n(int argc, VALUE *argv, VALUE self) /* * call-seq: - * rat.to_f => float - * + * rat.to_f => float + * * Converts _rat_ to a floating point number and returns the result as a * +Float+ object. * * For example: - * + * * Rational(2).to_f #=> 2.0 * Rational(9, 4).to_f #=> 2.25 * Rational(-3, 4).to_f #=> -0.75 @@ -1524,12 +1527,12 @@ nurat_to_f(VALUE self) /* * call-seq: - * rat.to_r => self - * + * rat.to_r => self + * * Returns self, i.e. a +Rational+ object representing _rat_. * * For example: - * + * * Rational(2).to_r #=> (2/1) * Rational(-8, 6).to_r #=> (-4/3) * Rational(39.2).to_r #=> (2758454771764429/70368744177664) @@ -1571,13 +1574,13 @@ nurat_format(VALUE self, VALUE (*func)(VALUE)) /* * call-seq: - * rat.to_s => string - * + * rat.to_s => string + * * Returns a +String+ representation of _rat_ in the form * "_numerator_/_denominator_". * * For example: - * + * * Rational(2).to_s #=> "2/1" * Rational(-8, 6).to_s #=> "-4/3" * Rational(0.5).to_s #=> "1/2" @@ -1590,13 +1593,13 @@ nurat_to_s(VALUE self) /* * call-seq: - * rat.inspect => string - * + * rat.inspect => string + * * Returns a +String+ containing a human-readable representation of _rat_ in * the form "(_numerator_/_denominator_)". * * For example: - * + * * Rational(2).to_s #=> "(2/1)" * Rational(-8, 6).to_s #=> "(-4/3)" * Rational(0.5).to_s #=> "(1/2)" @@ -1644,16 +1647,16 @@ nurat_marshal_load(VALUE self, VALUE a) /* * call-seq: - * int.gcd(_int2_) => integer - * + * int.gcd(_int2_) => integer + * * Returns the greatest common divisor of _int_ and _int2_: the largest * positive integer that divides the two without a remainder. The result is an - * +Integer+ object. + * +Integer+ object. * * An +ArgumentError+ is raised unless _int2_ is an +Integer+ object. * * For example: - * + * * 2.gcd(2) #=> 2 * -2.gcd(2) #=> 2 * 8.gcd(6) #=> 2 @@ -1668,8 +1671,8 @@ rb_gcd(VALUE self, VALUE other) /* * call-seq: - * int.lcm(_int2_) => integer - * + * int.lcm(_int2_) => integer + * * Returns the least common multiple (or "lowest common multiple") of _int_ * and _int2_: the smallest positive integer that is a multiple of both * integers. The result is an +Integer+ object. @@ -1677,7 +1680,7 @@ rb_gcd(VALUE self, VALUE other) * An +ArgumentError+ is raised unless _int2_ is an +Integer+ object. * * For example: - * + * * 2.lcm(2) #=> 2 * -2.gcd(2) #=> 2 * 8.gcd(6) #=> 24 @@ -1692,17 +1695,17 @@ rb_lcm(VALUE self, VALUE other) /* * call-seq: - * int.gcdlcm(_int2_) => array - * + * int.gcdlcm(_int2_) => array + * * Returns a two-element +Array+ containing _int_.gcd(_int2_) and * _int_.lcm(_int2_) respectively. That is, the greatest common divisor of * _int_ and _int2_, then the least common multiple of _int_ and _int2_. Both - * elements are +Integer+ objects. + * elements are +Integer+ objects. * * An +ArgumentError+ is raised unless _int2_ is an +Integer+ object. * * For example: - * + * * 2.gcdlcm(2) #=> [2, 2] * -2.gcdlcm(2) #=> [2, 2] * 8.gcdlcm(6) #=> [2, 24] @@ -1748,6 +1751,12 @@ rb_Rational(VALUE x, VALUE y) #define id_to_r rb_intern("to_r") #define f_to_r(x) rb_funcall(x, id_to_r, 0) +/* + * call-seq: + * num.numerator => integer + * + * Returns the numerator of _num_ as an +Integer+ object. + */ static VALUE numeric_numerator(VALUE self) { @@ -1760,18 +1769,36 @@ numeric_denominator(VALUE self) return f_denominator(f_to_r(self)); } +/* + * call-seq: + * int.numerator => self + * + * Returns self. + */ static VALUE integer_numerator(VALUE self) { return self; } +/* + * call-seq: + * int.numerator => 1 + * + * Returns 1. + */ static VALUE integer_denominator(VALUE self) { return INT2FIX(1); } +/* + * call-seq: + * flo.numerator => integer + * + * Returns the numerator of _flo_ as an +Integer+ object. + */ static VALUE float_numerator(VALUE self) { @@ -1781,6 +1808,12 @@ float_numerator(VALUE self) return rb_call_super(0, 0); } +/* + * call-seq: + * flo.denominator => integer + * + * Returns the denominator of _flo_ as an +Integer+ object. + */ static VALUE float_denominator(VALUE self) { @@ -1792,12 +1825,12 @@ float_denominator(VALUE self) /* * call-seq: - * nil.to_r => Rational(0, 1) - * + * nil.to_r => Rational(0, 1) + * * Returns a +Rational+ object representing _nil_ as a rational number. * * For example: - * + * * nil.to_r #=> (0/1) */ static VALUE @@ -1809,12 +1842,12 @@ nilclass_to_r(VALUE self) /* * call-seq: - * int.to_r => rational - * + * int.to_r => rational + * * Returns a +Rational+ object representing _int_ as a rational number. * * For example: - * + * * 1.to_r #=> (1/1) * 12.to_r #=> (12/1) */ @@ -1850,13 +1883,13 @@ float_decode(VALUE self) /* * call-seq: - * flt.to_r => rational - * + * flt.to_r => rational + * * Returns _flt_ as an +Rational+ object. Raises a +FloatDomainError+ if _flt_ * is +Infinity+ or +NaN+. * * For example: - * + * * 2.0.to_r #=> (2/1) * 2.5.to_r #=> (5/2) * -0.75.to_r #=> (-3/4) @@ -2009,15 +2042,15 @@ string_to_r_strict(VALUE self) /* * call-seq: - * string.to_r => rational - * + * string.to_r => rational + * * Returns a +Rational+ object representing _string_ as a rational number. * Leading and trailing whitespace is ignored. Underscores may be used to * separate numbers. If _string_ is not recognised as a rational, (0/1) is * returned. - * + * * For example: - * + * * "2".to_r #=> (2/1) * "300/2".to_r #=> (150/1) * "-9.2/3".to_r #=> (-46/15) @@ -2137,14 +2170,14 @@ nurat_s_convert(int argc, VALUE *argv, VALUE klass) * * The first argument is the numerator, the second the denominator. If the * denominator is not supplied it defaults to 1. The arguments can be - * +Numeric+ or +String+ objects. + * +Numeric+ or +String+ objects. * * Rational(12) == Rational(12, 1) #=> true * * A +ZeroDivisionError+ will be raised if 0 is specified as the denominator: * * Rational(3, 0) #=> ZeroDivisionError: divided by zero - * + * * The numerator and denominator of a +Rational+ object can be retrieved with * the +Rational#numerator+ and +Rational#denominator+ accessors, * respectively. @@ -2163,28 +2196,28 @@ nurat_s_convert(int argc, VALUE *argv, VALUE klass) * 30.to_r #=> (30/1) * 3.33.to_r #=> (1874623344892969/562949953421312) * '33/3'.to_r #=> (11/1) - * + * * The reverse operations work as you would expect: - * + * * Rational(30, 1).to_i #=> 30 * Rational(1874623344892969, 562949953421312).to_f #=> 3.33 * Rational(11, 1).to_s #=> "11/1" - * + * * +Rational+ objects can be compared with other +Numeric+ objects using the * normal semantics: * * Rational(20, 10) == Rational(2, 1) #=> true * Rational(10) > Rational(1) #=> true * Rational(9, 2) <=> Rational(8, 3) #=> 1 - * + * * Similarly, standard mathematical operations support +Rational+ objects, too: * * Rational(9, 2) * 2 #=> (9/1) * Rational(12, 29) / Rational(2,3) #=> (18/29) * Rational(7,5) + Rational(60) #=> (307/5) * Rational(22, 5) - Rational(5, 22) #=> (459/110) - * Rational(2,3) ** 3 #=> (8/27) - */ + * Rational(2,3) ** 3 #=> (8/27) + */ void Init_Rational(void) { @@ -2249,7 +2282,7 @@ Init_Rational(void) rb_define_method(rb_cRational, "divmod", nurat_divmod, 1); #if 0 - rb_define_method(rb_cRational, "quot", nurat_quot, 1); + rb_define_method(rb_cRational, "quot", nurat_quot, 1); #endif rb_define_method(rb_cRational, "remainder", nurat_rem, 1); #if 0