[#6143] — Christophe Poucet <christophe.poucet@...>

Hello,

17 messages 2005/10/04
[#6147] Re: patch.tgz — nobu.nokada@... 2005/10/04

Hi,

[#6199] Kernel rdoc HTML file not being created when rdoc is run on 1.8.3 — James Britt <ruby@...>

When 1.8.3 came out, I grabbed the source and ran rdoc on it. After

9 messages 2005/10/08

[#6251] RubyGems, upstream releases and idempotence of packaging — Mauricio Fern疣dez <mfp@...>

[sorry for the very late reply; I left this message in +postponed and forgot

14 messages 2005/10/12

[#6282] Wilderness: Need Code to invoke ELTS_SHARED response — "Charles E. Thornton" <ruby-core@...>

Testing the My Object Dump and I am trying to cause creation

13 messages 2005/10/14
[#6283] Re: Wilderness: Need Code to invoke ELTS_SHARED response — Mauricio Fern疣dez <mfp@...> 2005/10/14

On Fri, Oct 14, 2005 at 05:04:59PM +0900, Charles E. Thornton wrote:

[#6288] Re: Wilderness: Need Code to invoke ELTS_SHARED response — "Charles E. Thornton" <ruby-core@...> 2005/10/14

Mauricio Fern疣dez wrote:

[#6365] Time for built-in Rational and Complex classes? — Gavin Sinclair <gsinclair@...>

There has been some support for, but no comment on, RCR #260 ("Make

12 messages 2005/10/24
[#6366] Re: Time for built-in Rational and Complex classes? — "Ara.T.Howard" <Ara.T.Howard@...> 2005/10/24

On Mon, 24 Oct 2005, Gavin Sinclair wrote:

[#6405] Re: [PATCH] Pathname.exists?() — "Berger, Daniel" <Daniel.Berger@...>

12 messages 2005/10/25
[#6406] Re: [PATCH] Pathname.exists?() — TRANS <transfire@...> 2005/10/25

On 10/25/05, Berger, Daniel <Daniel.Berger@qwest.com> wrote:

[#6408] Re: [PATCH] Pathname.exists?() — Gavin Sinclair <gsinclair@...> 2005/10/25

On 10/26/05, TRANS <transfire@gmail.com> wrote:

[#6442] Wilderness: I Have formatted README.EXT into an HTML Document — "Charles E. Thornton" <ruby-core@...>

I have taken README.EXT (English Version Only) and have reformatted

14 messages 2005/10/27

[#6469] csv.rb a start on refactoring. — Hugh Sasse <hgs@...>

For a database application I found using CSV to be rather slow.

50 messages 2005/10/28
[#6470] Re: csv.rb a start on refactoring. — "Ara.T.Howard" <Ara.T.Howard@...> 2005/10/28

[#6471] Re: csv.rb a start on refactoring. — James Edward Gray II <james@...> 2005/10/28

On Oct 28, 2005, at 8:53 AM, Ara.T.Howard wrote:

[#6474] Re: csv.rb a start on refactoring. — "Ara.T.Howard" <Ara.T.Howard@...> 2005/10/28

On Fri, 28 Oct 2005, James Edward Gray II wrote:

[#6484] Re: csv.rb a start on refactoring. — James Edward Gray II <james@...> 2005/10/29

On Oct 28, 2005, at 9:58 AM, Ara.T.Howard wrote:

[#6485] Re: csv.rb a start on refactoring. — "Ara.T.Howard" <Ara.T.Howard@...> 2005/10/29

On Sat, 29 Oct 2005, James Edward Gray II wrote:

[#6486] Re: csv.rb a start on refactoring. — James Edward Gray II <james@...> 2005/10/29

On Oct 28, 2005, at 8:25 PM, Ara.T.Howard wrote:

[#6487] Re: csv.rb a start on refactoring. — "Ara.T.Howard" <Ara.T.Howard@...> 2005/10/29

On Sat, 29 Oct 2005, James Edward Gray II wrote:

[#6491] Re: csv.rb a start on refactoring. — James Edward Gray II <james@...> 2005/10/29

On Oct 28, 2005, at 8:43 PM, Ara.T.Howard wrote:

[#6493] Re: csv.rb a start on refactoring. — James Edward Gray II <james@...> 2005/10/29

On Oct 28, 2005, at 10:06 PM, James Edward Gray II wrote:

[#6496] Re: csv.rb a start on refactoring. — "Ara.T.Howard" <Ara.T.Howard@...> 2005/10/29

On Sun, 30 Oct 2005, James Edward Gray II wrote:

[#6502] Re: csv.rb a start on refactoring. — James Edward Gray II <james@...> 2005/10/30

On Oct 29, 2005, at 12:11 PM, Ara.T.Howard wrote:

[#6505] Re: csv.rb a start on refactoring. — "Ara.T.Howard" <Ara.T.Howard@...> 2005/10/30

On Mon, 31 Oct 2005, James Edward Gray II wrote:

[#6511] Planning FasterCSV (was Re: csv.rb a start on refactoring.) — James Edward Gray II <james@...> 2005/10/30

I've decided to create a FasterCSV library, based on the code we

[#6516] Re: Planning FasterCSV (was Re: csv.rb a start on refactoring.) — "Ara.T.Howard" <Ara.T.Howard@...> 2005/10/31

On Mon, 31 Oct 2005, James Edward Gray II wrote:

[#6518] Re: Planning FasterCSV (was Re: csv.rb a start on refactoring.) — "NAKAMURA, Hiroshi" <nakahiro@...> 2005/10/31

-----BEGIN PGP SIGNED MESSAGE-----

[PATCH] lib/rational.rb documentation

From: Gavin Sinclair <gsinclair@...>
Date: 2005-10-24 14:03:24 UTC
List: ruby-core #6364
Hi,

Please inspect and commit the following patch.

Thanks,
Gavin



Index: lib/rational.rb
===================================================================
RCS file: /src/ruby/lib/rational.rb,v
retrieving revision 1.13.2.1
diff -u -b -r1.13.2.1 rational.rb
--- lib/rational.rb	7 May 2004 08:48:23 -0000	1.13.2.1
+++ lib/rational.rb	24 Oct 2005 14:02:21 -0000
@@ -5,37 +5,29 @@
 #   	$Date: 1999/08/24 12:49:28 $
 #   	by Keiju ISHITSUKA(SHL Japan Inc.)
 #
-# --
-#   Usage:
-#   class Rational < Numeric
-#      (include Comparable)
-#
-#   Rational(a, b) --> a/b
-#
-#   Rational::+
-#   Rational::-
-#   Rational::*
-#   Rational::/
-#   Rational::**
-#   Rational::%
-#   Rational::divmod
-#   Rational::abs
-#   Rational::<=>
-#   Rational::to_i
-#   Rational::to_f
-#   Rational::to_s
-#
-#   Integer::gcd
-#   Integer::lcm
-#   Integer::gcdlcm
-#   Integer::to_r
-#
-#   Fixnum::**
-#   Fixnum::quo
-#   Bignum::**
-#   Bignum::quo
+# Documentation by Kevin Jackson and Gavin Sinclair.
 #
+# When you <tt>require 'rational'</tt>, all interactions between numbers
+# potentially return a rational result.  For example:
+#
+#   1.quo(2)              # -> 0.5
+#   require 'rational'
+#   1.quo(2)              # -> Rational(1,2)
+#
+# See Rational for full documentation.
+#
+

+#
+# Creates a Rational number (i.e. a fraction).  +a+ and +b+ should be Integers:
+#
+#   Rational(1,3)           # -> 1/3
+#
+# Note: trying to construct a Rational with floating point or real values
+# produces errors:
+#
+#   Rational(1.1, 2.3)      # -> NoMethodError
+#
 def Rational(a, b = 1)
   if a.kind_of?(Rational) && b == 1
     a
@@ -44,9 +36,38 @@
   end
 end

+#
+# Rational implements a rational class for numbers.
+#
+# <em>A rational number is a number that can be expressed as a fraction p/q
+# where p and q are integers and q != 0.  A rational number p/q is said to have
+# numerator p and denominator q.  Numbers that are not rational are called
+# irrational numbers.</em> (http://mathworld.wolfram.com/RationalNumber.html)
+#
+# To create a Rational Number:
+#   Rational(a,b)             # -> a/b
+#   Rational.new!(a,b)        # -> a/b
+#
+# Examples:
+#   Rational(5,6)             # -> 5/6
+#   Rational(5)               # -> 5/1
+#
+# Rational numbers are reduced to their lowest terms:
+#   Rational(6,10)            # -> 3/5
+#
+# But not if you use the unusual method "new!":
+#   Rational.new!(6,10)       # -> 6/10
+#
+# Division by zero is obviously not allowed:
+#   Rational(3,0)             # -> ZeroDivisionError
+#
 class Rational < Numeric
   @RCS_ID='-$Id: rational.rb,v 1.7 1999/08/24 12:49:28 keiju Exp keiju $-'

+  #
+  # Reduces the given numerator and denominator to their lowest terms.  Use
+  # Rational() instead.
+  #
   def Rational.reduce(num, den = 1)
     raise ZeroDivisionError, "denominator is zero" if den == 0

@@ -64,12 +85,20 @@
     end
   end

+  #
+  # Implements the constructor.  This method does not reduce to lowest terms or
+  # check for division by zero.  Therefore #Rational() should be preferred in
+  # normal use.
+  #
   def Rational.new!(num, den = 1)
     new(num, den)
   end

   private_class_method :new

+  #
+  # This method is actually private.
+  #
   def initialize(num, den)
     if den < 0
       num = -num
@@ -84,6 +113,14 @@
     end
   end

+  #
+  # Returns the addition of this value and +a+.
+  #
+  # Examples:
+  #   r = Rational(3,4)      # -> Rational(3,4)
+  #   r + 1                  # -> Rational(7,4)
+  #   r + 0.5                # -> 1.25
+  #
   def + (a)
     if a.kind_of?(Rational)
       num = @numerator * a.denominator
@@ -99,6 +136,15 @@
     end
   end

+  #
+  # Returns the difference of this value and +a+.
+  # subtracted.
+  #
+  # Examples:
+  #   r = Rational(3,4)    # -> Rational(3,4)
+  #   r - 1                # -> Rational(-1,4)
+  #   r - 0.5              # -> 0.25
+  #
   def - (a)
     if a.kind_of?(Rational)
       num = @numerator * a.denominator
@@ -114,6 +160,16 @@
     end
   end

+  #
+  # Returns the product of this value and +a+.
+  #
+  # Examples:
+  #   r = Rational(3,4)    # -> Rational(3,4)
+  #   r * 2                # -> Rational(3,2)
+  #   r * 4                # -> Rational(3,1)
+  #   r * 0.5              # -> 0.375
+  #   r * Rational(1,2)    # -> Rational(3,8)
+  #
   def * (a)
     if a.kind_of?(Rational)
       num = @numerator * a.numerator
@@ -129,6 +185,13 @@
     end
   end

+  #
+  # Returns the quotient of this value and +a+.
+  #   r = Rational(3,4)    # -> Rational(3,4)
+  #   r / 2                # -> Rational(3,8)
+  #   r / 2.0              # -> 0.375
+  #   r / Rational(1,2)    # -> Rational(3,2)
+  #
   def / (a)
     if a.kind_of?(Rational)
       num = @numerator * a.denominator
@@ -145,6 +208,15 @@
     end
   end

+  #
+  # Returns this value raised to the given power.
+  #
+  # Examples:
+  #   r = Rational(3,4)    # -> Rational(3,4)
+  #   r ** 2               # -> Rational(9,16)
+  #   r ** 2.0             # -> 0.5625
+  #   r ** Rational(1,2)   # -> 0.866025403784439
+  #
   def ** (other)
     if other.kind_of?(Rational)
       Float(self) ** other
@@ -168,16 +240,36 @@
     end
   end

+  #
+  # Returns the remainder when this value is divided by +other+.
+  #
+  # Examples:
+  #   r = Rational(7,4)    # -> Rational(7,4)
+  #   r % Rational(1,2)    # -> Rational(1,4)
+  #   r % 1                # -> Rational(3,4)
+  #   r % Rational(1,7)    # -> Rational(1,28)
+  #   r % 0.26             # -> 0.19
+  #
   def % (other)
     value = (self / other).to_i
     return self - other * value
   end

+  #
+  # Returns the quotient _and_ remainder.
+  #
+  # Examples:
+  #   r = Rational(7,4)        # -> Rational(7,4)
+  #   r.divmod Rational(1,2)   # -> [3, Rational(1,4)]
+  #
   def divmod(other)
     value = (self / other).to_i
     return value, self - other * value
   end

+  #
+  # Returns the absolute value.
+  #
   def abs
     if @numerator > 0
       Rational.new!(@numerator, @denominator)
@@ -186,6 +278,15 @@
     end
   end

+  #
+  # Returns +true+ iff this value is numerically equal to +other+.
+  #
+  # But beware:
+  #   Rational(1,2) == Rational(4,8)          # -> true
+  #   Rational(1,2) == Rational.new!(4,8)     # -> false
+  #
+  # Don't use Rational.new!
+  #
   def == (other)
     if other.kind_of?(Rational)
       @numerator == other.numerator and @denominator == other.denominator
@@ -198,6 +299,9 @@
     end
   end

+  #
+  # Standard comparison operator.
+  #
   def <=> (other)
     if other.kind_of?(Rational)
       num = @numerator * other.denominator
@@ -232,14 +336,35 @@
     end
   end

+  #
+  # Converts the rational to an Integer.  Not the _nearest_ integer, the
+  # truncated integer.  Study the following example carefully:
+  #   Rational(+7,4).to_i             # -> 1
+  #   Rational(-7,4).to_i             # -> -2
+  #   (-1.75).to_i                    # -> -1
+  #
+  # In other words:
+  #   Rational(-7,4) == -1.75                 # -> true
+  #   Rational(-7,4).to_i == (-1.75).to_i     # false
+  #
   def to_i
     Integer(@numerator.div(@denominator))
   end

+  #
+  # Converts the rational to a Float.
+  #
   def to_f
     @numerator.to_f/@denominator.to_f
   end

+  #
+  # Returns a string representation of the rational number.
+  #
+  # Example:
+  #   Rational(3,4).to_s          #  "3/4"
+  #   Rational(8).to_s            #  "8"
+  #
   def to_s
     if @denominator == 1
       @numerator.to_s
@@ -248,14 +373,25 @@
     end
   end

+  #
+  # Returns +self+.
+  #
   def to_r
     self
   end

+  #
+  # Returns a reconstructable string representation:
+  #
+  #   Rational(5,8).inspect     # -> "Rational(5, 8)"
+  #
   def inspect
     sprintf("Rational(%s, %s)", @numerator.inspect, @denominator.inspect)
   end

+  #
+  # Returns a hash code for the object.
+  #
   def hash
     @numerator.hash ^ @denominator.hash
   end
@@ -267,18 +403,38 @@
 end

 class Integer
+  #
+  # In an integer, the value _is_ the numerator of its rational equivalent.
+  # Therefore, this method returns +self+.
+  #
   def numerator
     self
   end

+  #
+  # In an integer, the denominator is 1.  Therefore, this method returns 1.
+  #
   def denominator
     1
   end

+  #
+  # Returns a Rational representation of this integer.
+  #
   def to_r
     Rational(self, 1)
   end

+  #
+  # Returns the <em>greatest common denominator</em> of the two numbers (+self+
+  # and +n+).
+  #
+  # Examples:
+  #   72.gcd 168           # -> 24
+  #   19.gcd 36            # -> 1
+  #
+  # The result is positive, no matter the sign of the arguments.
+  #
   def gcd(n)
     m = self.abs
     n = n.abs
@@ -312,29 +468,49 @@
     return a
   end

-  def lcm(int)
-    a = self.abs
-    b = int.abs
-    gcd = a.gcd(b)
-    (a.div(gcd)) * b
+  #
+  # Returns the <em>lowest common multiple</em> (LCM) of the two arguments
+  # (+self+ and +other+).
+  #
+  # Examples:
+  #   6.lcm 7        # -> 42
+  #   6.lcm 9        # -> 18
+  #
+  def lcm(other)
+    if self.zero? or other.zero?
+      0
+    else
+      (self.div(self.gcd(other)) * other).abs
   end
-
-  def gcdlcm(int)
-    a = self.abs
-    b = int.abs
-    gcd = a.gcd(b)
-    return gcd, (a.div(gcd)) * b
   end

+  #
+  # Returns the GCD _and_ the LCM (see #gcd and #lcm) of the two arguments
+  # (+self+ and +other+).  This is more efficient than calculating them
+  # separately.
+  #
+  # Example:
+  #   6.gcdlcm 9     # -> [3, 18]
+  #
+  def gcdlcm(other)
+    gcd = self.gcd(other)
+    if self.zero? or other.zero?
+      [gcd, 0]
+    else
+      [gcd, (self.div(gcd) * other).abs]
+    end
+  end
 end

 class Fixnum
   undef quo
+  # If Rational is defined, returns a Rational number instead of a Fixnum.
   def quo(other)
     Rational.new!(self,1) / other
   end
   alias rdiv quo

+  # Returns a Rational number if the result is in fact rational (i.e.
+other+ < 0).
   def rpower (other)
     if other >= 0
       self.power!(other)
@@ -355,11 +531,13 @@
   end

   undef quo
+  # If Rational is defined, returns a Rational number instead of a Bignum.
   def quo(other)
     Rational.new!(self,1) / other
   end
   alias rdiv quo

+  # Returns a Rational number if the result is in fact rational (i.e.
+other+ < 0).
   def rpower (other)
     if other >= 0
       self.power!(other)


In This Thread

Prev Next