Ruby 1.8.7 リファレンスマニュアル > ライブラリ一覧 > rationalライブラリ > Rationalクラス

class Rational + Numeric + Comparable

クラスの継承リスト: Rational < Numeric < Comparable < Object < Kernel

要約

有理数を扱うクラスです。

「1/3」のような有理数を扱う事ができます。IntegerFloat と同様に Rational.new ではなく、 Kernel.#Rational を使用して Rational オブジェクトを作成します。

Integer < Rational < Float の順に強いです。つまり other が Float なら、 self を Float に変換してから演算子を適用します。other が Integer なら other を Rational に変換してから演算子を適用します。冪乗は例外です。

特異メソッド

new!(num, den = 1) -> Rational

Rational オブジェクトを生成します。

[PARAM] num:
分子を指定します。
[PARAM] den:
分母を指定します。省略した場合は 1 です。

Kernel#Rational とは異なり、約分していない Rational オブジェ クトを返します。

例:

Rational.new!(1, 3)         # => Rational(1, 3)
Rational.new!(2, 6)         # => Rational(2, 6)

また、引数のチェックも行われません。

例:

Rational.new!(1, 0)         # => Rational(1, 0)
Rational(1, 0)              # => ZeroDivisionError

注意:

Rational.new! は 1.9系 では廃止されました。Kernel.#Rational の方 を使用してください。

# 1.9.1 の場合
Rational.new!(1, 3)  # => NoMethodError
reduce(num, den = 1) -> Rational

約分された Rational オブジェクトを生成します。

[PARAM] num:
分子を指定します。
[PARAM] den:
分母を指定します。省略した場合は 1 です。
[EXCEPTION] ZeroDivisionError:
den に 0 を指定した場合に発生します。

引数 num、den の両方を指定した場合、num/den を既約になるまで約分した Rational オブジェクトを返します。

Kernel#Rational とは異なり、num と den には整数しか指定できません。

例:

Rational.reduce(2, 6)              # => Rational(1, 3)
Rational.reduce(Rational(1, 3), 1) # => NoMethodError: undefined method `gcd' for Rational(1, 3):Rational

注意:

Rational.reduce は 1.9 系 では廃止されました。Kernel.#Rational の 方を使用してください。

# 1.9.1 の場合
Rational.reduce(2, 6)  # => NoMethodError

インスタンスメソッド

self % other -> Rational | Float

剰余を計算します。絶対値が self の絶対値を越えない、符号が self と同じ Numeric を返します。

[PARAM] other:
自身を割る数

例:

Rational(3, 4) % 2               # => Rational(3, 4)
Rational(3, 4) % Rational(2, 1)  # => Rational(3, 4)
Rational(3, 4) % 2.0             # => 0.75
self * other -> Rational | Float

積を計算します。

[PARAM] other:
自身に掛ける数

other に Float を指定した場合は、計算結果を Float で返しま す。

例:

Rational(3, 4) * 2              # => Rational(3, 2)
Rational(3, 4) * 4              # => Rational(3, 1)
Rational(3, 4) * 0.5            # => 0.375
Rational(3, 4) * Rational(1, 2) # => Rational(3, 8)

other に 0 を指定した場合も Rational を返します。

Rational(3, 4) * 0              # => Rational(0, 1)
self ** rhs -> Numeric [redefined by mathn]

[TODO]

self のべき乗を返します。 Rational になるようであれば Rational で返します。

self ** other -> Rational | Float

冪(べき)乗を計算します。

[PARAM] other:
自身を other 乗する数

other に整数を指定した場合は、計算結果を Rational で返します。 other に整数以外を指定した場合は計算結果を Float で返します。

例:

Rational(3, 4) ** 2              # => Rational(9, 16)
Rational(3, 4) ** Rational(2, 1) # => 0.5625
Rational(3, 4) ** 2.0            # => 0.5625

注意:

1.9 系とは計算結果のオブジェクトが異なる場合がある事に注意してください。 other に Rational を指定した場合には戻り値が Rational を返 す場合があります。

# 1.9.1 の場合
Rational(3, 4) ** Rational(2, 1)  # => (9/16)
self + other -> Rational | Float

和を計算します。

[PARAM] other:
自身に足す数

other に Float を指定した場合は、計算結果を Float で返しま す。

例:

Rational(3, 4) + 2               # => Rational(11, 4)
Rational(3, 4) + Rational(2, 1)  # => Rational(11, 4)
Rational(3, 4) + 2.0             # => 2.75
+ -> self

単項演算子の + です。 self を返します。

self - other -> Rational | Float

差を計算します。

[PARAM] other:
自身から引く数

other に Float を指定した場合は、計算結果を Float で返しま す。

例:

Rational(3, 4) - 1   # => Rational(-1, 4)
Rational(3, 4) - 0.5 # => 0.25
- -> Numeric

単項演算子の - です。 self の符号を反転させたものを返します。

このメソッドは、二項演算子 - で 0 - self によって定義されています。

self / other -> Rational | Float

商を計算します。

[PARAM] other:
自身を割る数

other に Float を指定した場合は、計算結果を Float で返しま す。

例:

Rational(3, 4) / 2              # => Rational(3, 8)
Rational(3, 4) / Rational(2, 1) # => Rational(3, 8)
Rational(3, 4) / 2.0            # => 0.375
Rational(3, 4) / 0              # => ZeroDivisionError
[EXCEPTION] ZeroDivisionError:
other が 0 の時に発生します。
self < other -> bool

比較演算子 <=> をもとにオブジェクト同士を比較します。 <=> が負の整数を返した場合に、true を返します。 それ以外の整数を返した場合に、false を返します。

[PARAM] other:
自身と比較したいオブジェクトを指定します。
[EXCEPTION] ArgumentError:
<=> が nil を返したときに発生します。
self <= other -> bool

比較演算子 <=> をもとにオブジェクト同士を比較します。 <=> が負の整数か 0 を返した場合に、true を返します。 それ以外の整数を返した場合に、false を返します。

[PARAM] other:
自身と比較したいオブジェクトを指定します。
[EXCEPTION] ArgumentError:
<=> が nil を返したときに発生します。
self <=> other -> -1 | 0 | 1 | nil

self と other を比較して、self が大きい時に 1、等しい時に 0、小さい時に -1 を返します。比較できない場合はnilを返します。

[PARAM] other:
自身と比較する数値
[RETURN]
-1 か 0 か 1 か nil を返します。

例:

Rational(2, 3)  <=> Rational(2, 3)  # => 0
Rational(5)     <=> 5               # => 0
Rational(2, 3)  <=> Rational(1,3)   # => 1
Rational(1, 3)  <=> 1               # => -1
Rational(1, 3)  <=> 0.3             # => 1
Rational(1, 3)  <=> nil             # => nil
self <=> other -> -1 | 0 | 1 | nil

自身が other より大きい場合に 1 を、等しい場合に 0 を、小さい場合には -1 をそれぞれ返します。 自身と other が比較できない場合には nil を返します。

Numeric のサブクラスは、上の動作を満たすよう このメソッドを適切に再定義しなければなりません。

[PARAM] other:
自身と比較したい数値を指定します。
1 <=> 0   #=> 1
1 <=> 1   #=> 0
1 <=> 2   #=> -1
1 <=> "0" #=> nil
self == other -> bool

数値として等しいか判定します。

[PARAM] other:
自身と比較する数値
[RETURN]
self と other が等しい場合 true を返します。 そうでなければ false を返します。

例:

Rational(2, 3)  == Rational(2, 3)   # => true
Rational(5)     == 5                # => true
Rational(0)     == 0.0              # => true
Rational(1, 3)  == 0.33             # => false
Rational(1, 2)  == '1/2'            # => false

注意:

Rational.new! で作成したオブジェクトと比較した場合、同じ数値を表 すオブジェクトでも true を返さない事があります。

Rational(1,2) == Rational(4,8)          # => true
Rational(1,2) == Rational.new!(4,8)     # => false

詳しくは Rational.new! を確認してください。

self == other -> bool | nil

比較演算子 <=> をもとにオブジェクト同士を比較します。 <=> が 0 を返した時に、true を返します。 それ以外を返した場合は、false を返します。

<=> が nil を返した場合は、 nil を返します。

[PARAM] other:
自身と比較したいオブジェクトを指定します。
self > other -> bool

比較演算子 <=> をもとにオブジェクト同士を比較します。 <=> が正の整数を返した場合に、true を返します。 それ以外の整数を返した場合に、false を返します。

[PARAM] other:
自身と比較したいオブジェクトを指定します。
[EXCEPTION] ArgumentError:
<=> が nil を返したときに発生します。
self >= other -> bool

比較演算子 <=> をもとにオブジェクト同士を比較します。 <=> が正の整数か 0 を返した場合に、true を返します。 それ以外の整数を返した場合に、false を返します。

[PARAM] other:
自身と比較したいオブジェクトを指定します。
[EXCEPTION] ArgumentError:
<=> が nil を返したときに発生します。
abs -> Rational

自身の絶対値を返します。

例:

Rational(1, 2).abs.to_s  # => 1/2
Rational(-1, 2).abs.to_s # => 1/2
abs -> Numeric

自身が 0 以上ならば self を、そうでない場合は -self を返します。

between?(min, max) -> bool

比較演算子 <=> をもとに self が min と max の範囲内(min, max を含みます)にあるかを判断します。

以下のコードと同じです。

self >= min and self <= max
[PARAM] min:
範囲の下端を表すオブジェクトを指定します。
[PARAM] max:
範囲の上端を表すオブジェクトを指定します。
[EXCEPTION] ArgumentError:
self <=> min か、self <=> max が nil を返 したときに発生します。
3.between?(1, 5)               #=> true
6.between?(1, 5)               #=> false
'cat'.between?('ant', 'dog')   #=> true
'gnu'.between?('ant', 'dog')   #=> false
ceil -> Integer

自身と等しいかより大きな整数のうち最小のものを返します。

例:

Rational(3).ceil      # => 3
Rational(2, 3).ceil   # => 1
Rational(-3, 2).ceil  # => -1

[SEE_ALSO] Rational#floor, Rational#round, Rational#truncate

ceil -> Integer

自身と等しいかより大きな整数のうち最小のものを返します。

1.ceil        #=> 1
1.2.ceil      #=> 2
(-1.2).ceil   #=> -1
(-1.5).ceil   #=> -1

[SEE_ALSO] Numeric#floor, Numeric#round, Numeric#truncate

coerce(other) -> Array

自身と other が同じクラスになるよう、自身か other を変換し [other, self] という 配列にして返します。

[PARAM] other:
比較または変換するオブジェクト

例:

Rational(1).coerce(2)   # => [Rational(2, 1), Rational(1, 1)]
Rational(1).coerce(2.2) # => [2.2, 1.0]
coerce(other) -> [Numeric]

自身と other が同じクラスになるよう、自身か other を変換し [other, self] という配列にして返します。

デフォルトでは self と other を Float に変換して [other, self] という配列にして返します。 Numeric のサブクラスは、このメソッドを適切に再定義しなければなりません。 以下は Rational の coerce のソースです。other が自身の知らない数値クラスであった場合、 super を呼んでいることに注意して下さい。

# lib/rational.rb より

def coerce(other)
  if other.kind_of?(Float)
    return other, self.to_f
  elsif other.kind_of?(Integer)
    return Rational.new!(other, 1), self
  else
    super
  end
end

数値クラスの算術演算子は通常自分と演算できないクラスをオペランドとして受け 取ると coerce を使って自分とオペランドを変換した上で演算を行います。 以下は Rational の + メソッドを一部省略したものです。 引数が自身の知らない数値クラスである場合、引数の coerce により自身を変換してから + 演算子を呼んでいます。

# lib/rational.rb より

def + (a)
  if a.kind_of?(Rational)
    # 長いので省略
  elsif a.kind_of?(Integer)
    # 長いので省略
  elsif a.kind_of?(Float)
    Float(self) + a
  else
    x, y = a.coerce(self)
    x + y
  end
end
[PARAM] other:
オペランドを数値で指定します。
denominator -> Integer

分母を返します。常に正の整数を返します。

[RETURN]
分母を返します。

例:

Rational(7).denominator       # => 1
Rational(7, 1).denominator    # => 1
Rational(9, -4).denominator   # => 4
Rational(-2, -10).denominator # => 5

[SEE_ALSO] Rational#numerator

div(other) -> Integer

self を other で割った整数の商を返します。

[PARAM] other:
自身を割る数

例:

Rational(1, 2).div(Rational(2, 3)) # => 0
div(other) -> Integer

self を other で割った整数の商 q を返します。

ここで、商 q と余り r は、それぞれ

  • self == other * q + r

  • other > 0 のとき: 0 <= r < other
  • other < 0 のとき: other < r <= 0
  • q は整数

をみたす数です。 商に対応する余りは Numeric#modulo で求められます。 div はメソッド / の呼び出しとして定義されています。

[PARAM] other:
自身を割る数を指定します。
p 3.div(2) # => 1
p (-3).div(2) # => -2
p (-3.0).div(2) # => -2
divmod(other) -> [Integer, Float | Rational]

self を other で割った、商と余りの配列を返します。

other に Float を指定した場合は、余りを Float で返します。

[PARAM] other:
自身を割る数

例:

Rational(3,4).divmod(Rational(2,3))  # => [1, Rational(1, 12)]
Rational(-3,4).divmod(Rational(2,3)) # => [-2, Rational(7, 12)]
Rational(3,4).divmod(Rational(-2,3)) # => [-2, Rational(-7, 12)]

Rational(9,4).divmod(2)              # => [1, Rational(1, 4)]
Rational(9,4).divmod(Rational(2, 1)) # => [1, Rational(1, 4)]
Rational(9,4).divmod(2.0)            # => [1, 0.25]

[SEE_ALSO] Numeric#divmod

divmod(other) -> [Numeric]

self を other で割った商 q と余り r を、 [q, r] という 2 要素の配列にして返します。 商 q は常に整数ですが、余り r は整数であるとは限りません。

ここで、商 q と余り r は、

  • self == other * q + r

  • other > 0 のとき: 0 <= r < other
  • other < 0 のとき: other < r <= 0
  • q は整数

をみたす数です。 divmod が返す商は Numeric#div と同じです。 また余りは、Numeric#modulo と同じです。 このメソッドは、メソッド / と % によって定義されています。

[PARAM] other:
自身を割る数を指定します。
11.divmod(3)         #=> [3, 2]
(11.5).divmod(3.5)   #=> [3, 1.0]
11.divmod(-3)        #=> [-4, -1]
11.divmod(3.5)       #=> [3, 0.5]
(-11).divmod(3.5)    #=> [-4, 3.0]

[SEE_ALSO] Numeric#div, Numeric#modulo

eql?(other) -> bool

自身と other のクラスが等しくかつ == メソッドで比較して等しい場合に true を返します。 そうでない場合に false を返します。

Numeric のサブクラスは、eql? で比較して等しい数値同士が同じハッシュ値を返すように hash メソッドを適切に定義する必要があります。

[PARAM] other:
自身と比較したい数値を指定します。
p 1.eql?(1)    #=> true
p 1.eql?(1.0)  #=> false
p 1 == 1.0     #=> true

[SEE_ALSO] Object#equal?, Object#eql?, Object#==, Object#===

quo(other) -> Float
fdiv(other) -> Float

self を other で割った実数の商を返します。

Numeric のサブクラスは、このメソッドを適切に再定義しなければなりません。

[PARAM] other:
自身を割る数を指定します。
p 1.quo(3)      # => 0.3333333333333333

require 'rational'
p 1.quo(3)      # => Rational(1, 3)
floor -> Integer

自身と等しいかより小さな整数のうち最大のものを返します。

例:

Rational(3).floor     # => 3
Rational(2, 3).floor  # => 0
Rational(-3, 2).floor # => -2

自身にもっとも近い整数を返す Rational#to_i とは違う結果を返す事に 注意してください。

例:

Rational(+7, 4).to_i  # => 1
Rational(+7, 4).floor # => 1
Rational(-7, 4).to_i  # => -1
Rational(-7, 4).floor # => -2

[SEE_ALSO] Rational#ceil, Rational#round, Rational#truncate

floor -> Integer

自身と等しいかより小さな整数のうち最大のものを返します。

1.floor        #=> 1
1.2.floor      #=> 1
(-1.2).floor   #=> -2
(-1.5).floor   #=> -2

[SEE_ALSO] Numeric#ceil, Numeric#round, Numeric#truncate

hash -> Integer

自身のハッシュ値を返します。

[RETURN]
ハッシュ値を返します。
inspect [redefined by mathn]

有理数値を人間が読みやすい形の文字列表現にして返します。

現在のバージョンでは "3/5", "-17/7" のように10進数の既約分数表記を返します。

inspect -> String

自身を"Rational(分子, 分母)" 形式の文字列にして返します。

[RETURN]
文字列を返します。

例:

Rational(5, 8).inspect  # => "Rational(5, 8)"
Rational(2).inspect     # => "Rational(2, 1)"
Rational(-8, 6).inspect # => "Rational(-4, 3)"

1.9系とは結果が異なる事に注意してください。

# 1.9.1の場合
Rational(5, 8).inspect  # => "(5/8)"
Rational(2).inspect     # => "(2/1)"
Rational(-8, 6).inspect # => "(-4/3)"

[SEE_ALSO] Rational#to_s

integer? -> bool

self が整数の時、真を返します。そうでない場合に false を返します。

Numeric のサブクラスは、このメソッドを適切に再定義しなければなりません。

modulo(other) -> Numeric

self を other で割った余り r を返します。

ここで、商 q と余り r は、

  • self == other * q + r

  • other > 0 のとき 0 <= r < other
  • other < 0 のとき other < r <= 0
  • q は整数

をみたす数です。 余り r は、other と同じ符号になります。 商 q は、Numeric#div (あるいは 「/」)で求められます。 modulo はメソッド % の呼び出しとして定義されています。

[PARAM] other:
自身を割る数を指定します。
p 13.modulo(4)       #=>  1
p (11.5).modulo(3.5) #=> 1.0
p 13.modulo(-4)      #=> -3
p (-13).modulo(4)    #=>  3
p (-13).modulo(-4)   #=> -1
p (-11).modulo(3.5)  #=> 3.0

[SEE_ALSO] Numeric#divmod, Numeric#remainder

nonzero? -> self | nil

自身がゼロの時 nil を返し、非ゼロの時 self を返します。

p 10.nonzero?              #=> 10
p 0.nonzero?               #=> nil
p 0.0.nonzero?             #=> nil

require 'rational'
p Rational(0, 2).nonzero?  #=> nil
numerator -> Integer

分子を返します。

[RETURN]
分子を返します。

例:

Rational(7).numerator       # => 7
Rational(7, 1).numerator    # => 7
Rational(9, -4).numerator   # => -9
Rational(-2, -10).numerator # => 1

[SEE_ALSO] Rational#denominator

power2 [redefined by mathn]

[TODO]

remainder(other) -> Numeric

self を other で割った余り r を返します。

ここで、商 q と余り r は、

  • self == other * q + r

  • self > 0 のとき 0 <= r < |other|
  • self < 0 のとき -|other| < r <= 0
  • q は整数

をみたす数です。r の符号は self と同じになります。 商 q を直接返すメソッドはありません。self.quo(other).truncate がそれに相当します。

[PARAM] other:
自身を割る数を指定します。
p 13.remainder(4)       #=>  1
p (11.5).remainder(3.5) #=> 1.0
p 13.remainder(-4)      #=>  1
p (-13).remainder(4)    #=> -1
p (-13).remainder(-4)   #=> -1
p (-11).remainder(3.5)  #=> -0.5

[SEE_ALSO] Numeric#divmod, Numeric#modulo

round -> Integer

自身ともっとも近い整数を返します。

中央値 0.5, -0.5 はそれぞれ 1,-1 に切り上げされます。

例:

Rational(3).round     # => 3
Rational(2, 3).round  # => 1
Rational(-3, 2).round # => -2

[SEE_ALSO] Rational#ceil, Rational#floor, Rational#truncate

round -> Integer

自身ともっとも近い整数を返します。

中央値 0.5, -0.5 はそれぞれ 1,-1 に切り上げされます。いわゆる四捨五入ですが、偶数丸めではありません。

1.round        #=> 1
1.2.round      #=> 1
(-1.2).round   #=> -1
(-1.5).round   #=> -2

[SEE_ALSO] Numeric#ceil, Numeric#floor, Numeric#truncate

step(limit, step = 1) {|n| ... } -> self
step(limit, step = 1) -> Enumerable::Enumerator

self からはじめ step を足しながら limit を越える 前までブロックを繰り返します。step は負の数も指定できます。また、limit や step には Float なども 指定できます。

[PARAM] limit:
ループの上限あるいは下限を数値で指定します。step に負の数が指定された場合は、 下限として解釈されます。
[PARAM] step:
各ステップの大きさを数値で指定します。負の数を指定することもできます。
[EXCEPTION] ArgumentError:
step に 0 を指定した場合に発生します。
2.step(5){|n| p n}
2
3
4
5

1.1.step(1.5, 0.1) {|n| p n}
=> 1.1
   1.2
   1.3
   1.4
   1.5

10.step(6, -1){|n| p n}
10
9
8
7
6

注:浮動小数点数の 0.1 は 2進数では正確な表現ができない(2進数で 0.1は 0.00011001100....となる)ので、以下のようなループでは誤差が 生じて意図した回数ループしないことがある。step はこの誤差を考慮し て実装されている。

i = 1.1
while i <= 1.5
  p i
  i += 0.1
end
=> 1.1
   1.2
   1.3
   1.4   <- 1.5 が表示されない

[SEE_ALSO] Integer#downto

to_f -> Float

自身を Float に変換します。

[RETURN]
実数を返します。

例:

Rational(9, 4).to_f   # => 2.25
Rational(-3, 4).to_f  # => -0.75
Rational(20, 3).to_f  # => 6.666666666666667
truncate -> Integer
to_i -> Integer

0 から 自身までの整数で、自身にもっとも近い整数を返します。

例:

Rational(2, 3).to_i   # => 0
Rational(3).to_i      # => 3
Rational(98, 71).to_i # => 1
Rational(-30, 2).to_i # => -15

[SEE_ALSO] Rational#ceil, Rational#floor

to_int -> Integer

self.to_i と同じです。

to_r -> Rational

自身を返します。

[RETURN]
自身を返します。
to_s -> String

自身を人間が読みやすい形の文字列表現にして返します。

"3/5", "-17/7" のように10進数の表記を返します。

[RETURN]
有理数の表記にした文字列を返します。

例:

Rational(-3, 4).to_s # => "-3/4"
Rational(8).to_s     # => "8"
Rational(-8, 6).to_s # => "-4/3"

[SEE_ALSO] Rational#inspect

truncate -> Integer

自身と 0 との間にある整数で、自身にもっとも近い整数を返します。

1.truncate        #=> 1
1.2.truncate      #=> 1
(-1.2).truncate   #=> -1
(-1.5).truncate   #=> -1

[SEE_ALSO] Numeric#ceil, Numeric#floor, Numeric#round

zero? -> bool

自身がゼロの時、真を返します。そうでない場合は false を返します。

p 10.zero?              #=> false
p 0.zero?               #=> true
p 0.0.zero?             #=> true
class Rational