Ruby 1.9.2 リファレンスマニュアル > ライブラリ一覧 > 組み込みライブラリ > Numericクラス
class Numeric
クラスの継承リスト: Numeric < Comparable < Object < Kernel < BasicObject
Abstract
数値を表す抽象クラスです。Fixnum や Float などの数値クラスは Numeric のサブクラスとして 実装されています。
演算や比較を行うメソッド(+, -, *, /, <=>)は Numeric のサブクラスで定義されま す。Numeric で定義されているメソッドは、サブクラスで提供されているメソッド (+, -, *, /, %) を利用して定義されるものがほとんどです。 つまり Numeric で定義されているメソッドは、Numeric のサブクラスとして新たに数値クラスを定義した時に、 演算メソッド(+, -, *, /, %, <=>, coerce)だけを定義すれば、数値クラスのそのほかのメソッドが 適切に定義されることを意図して提供されています。
+@, -@ は単項演算子 +, - を表しメソッド定義などではこの記法を利用します。
効率のため Numeric のメソッドと同じメソッドがサブクラスで再定義されている場合があります。
Numeric#coerce メソッドを使うことによって異なる数値クラス間で演算を行うこともできます。
数値関連のメソッドを実際に定義しているクラス一覧
ほとんどの数値関連のメソッドはサブクラスで再定義されています。これは、 効率のためであったり上位抽象クラスで実装を定義することができなかったり するためです。実際にどのメソッドがどのクラスに定義されているかは以下の 表を参照してください。
=> ruby 1.8.6 (2007-06-18 patchlevel 5000) [i686-linux] Numeric Integer Fixnum Bignum Float --------------------------------------------------------------------- % | - - o o o & | - - o o - * | - - o o o ** | - - o o o + | - - o o o +@ | o - - - - - | - - o o o -@ | o - o o o / | - - o o o < | - - o - o Numeric Integer Fixnum Bignum Float --------------------------------------------------------------------- << | - - o o - <= | - - o - o <=> | o - o o o == | - - o o o > | - - o - o >= | - - o - o >> | - - o o - [] | - - o o - ^ | - - o o - abs | o - o o o Numeric Integer Fixnum Bignum Float --------------------------------------------------------------------- ceil | o o - - o chr | - o - - - coerce | o - - o o div | o - o o - divmod | o - o o o downto | - o - - - eql? | o - - o o fdiv | o - o o - finite? | - - - - o floor | o o - - o Numeric Integer Fixnum Bignum Float --------------------------------------------------------------------- hash | - - - o o id2name | - - o - - infinite? | - - - - o integer? | o o - - - modulo | o - o o o nan? | - - - - o next | - o - - - nonzero? | o - - - - quo | o - o o - remainder | o - - o - Numeric Integer Fixnum Bignum Float --------------------------------------------------------------------- round | o o - - o singleton_method_added | o - - - - size | - - o o - step | o - - - - succ | - o - - - times | - o - - - to_f | - - o o o to_i | - o - - o to_int | o o - - o to_s | - - o o o Numeric Integer Fixnum Bignum Float --------------------------------------------------------------------- to_sym | - - o - - truncate | o o - - o upto | - o - - - zero? | o - o - o | | - - o o - ~ | - - o o -
丸めメソッドの動作一覧
Numeric#ceil, Numeric#floor, Numeric#round, Numeric#truncate のふるまいの違いの表です。左の実数に対して各メソッドを呼ぶと表のような数を 返します。
| ceil floor round truncate ---------------------------------------------------- 1.9 | 2 1 2 1 1.1 | 2 1 1 1 -1.1 | -1 -2 -1 -1 -1.9 | -1 -2 -2 -1
丸めメソッドの拡張例
切上げはceil, floor を使用して以下のように定義できます。
if n > 0 then n.ceil else n.floor end
また、任意桁の切上げ、切捨て、四捨五入を行うメソッドは以下のように 定義できます。
class Numeric def roundup(d=0) x = 10**d if self > 0 (self * x).ceil.quo(x) else (self * x).floor.quo(x) end end def rounddown(d=0) x = 10**d if self < 0 (self * x).ceil.quo(x) else (self * x).floor.quo(x) end end def roundoff(d=0) x = 10**d if self < 0 (self * x - 0.5).ceil.quo(x) else (self * x + 0.5).floor.quo(x) end end end
インスタンスメソッド
+ -> self
-
単項演算子の + です。 self を返します。
- -> Numeric
-
単項演算子の - です。 self の符号を反転させたものを返します。
このメソッドは、二項演算子 - で 0 - self によって定義されています。
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
abs -> Numeric
-
自身が 0 以上ならば self を、そうでない場合は -self を返します。
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
clone
dup
-
このメソッドを呼び出すことはできません。呼び出すと例外が発生します。
数値などの immutable なオブジェクトは clone や dup が禁止されています。
1.dup # => in `clone': can't clone Fixnum (TypeError)
- [EXCEPTION] TypeError:
- このメソッドを呼び出した場合に発生します
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:
- オペランドを数値で指定します。
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) -> [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
-
自身と等しいかより小さな整数のうち最大のものを返します。
1.floor #=> 1 1.2.floor #=> 1 (-1.2).floor #=> -2 (-1.5).floor #=> -2
[SEE_ALSO] Numeric#ceil, Numeric#round, Numeric#truncate
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 (あるいは Integer#/)で求められます。 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
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 に切り上げされます。いわゆる四捨五入ですが、偶数丸めではありません。
1.round #=> 1 1.2.round #=> 1 (-1.2).round #=> -1 (-1.5).round #=> -2
[SEE_ALSO] Numeric#ceil, Numeric#floor, Numeric#truncate
scalar? -> bool
-
自身が Complex かそのサブクラスのインスタンスでない場合に true を返します。そうでない場合に false を返します。
Numeric のサブクラスは、このメソッドを適切に再定義しなければなりません。
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 が表示されない
to_int -> Integer
-
self.to_i と同じです。
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
追加されるメソッド
arg -> Fixnum | Float
[added by complex]-
複素数として見た場合の偏角を[-π,π]の範囲で返します。 非負なら0、負なら Math::PI を返します。
例:
n = 1000 f = -12.345 p n.arg #=> 0 p f.arg #=> 3.14159265358979
conj -> self
[added by complex]conjugate -> self
[added by complex]-
複素数として見た場合の共役を返します。 つまり、self が実数の場合はselfを返します。
im -> Complex
[added by complex]-
実数に対し、純虚数化した Complex クラスのオブジェクトを返します。
例:
n = 100 p n.im #=> Complex(0, 100)
image -> Fixnum
[added by complex]imag -> Fixnum
[added by complex]-
複素数として見た場合の虚部を返します。 つまり、self が実数の場合は 0 を返します。
real -> self
[added by complex]-
複素数として見た場合の実部を返します。 つまり、self が実数の場合はそのまま、selfを返します。