要約
数値を表す抽象クラスです。Integer や Float などの数値クラスは Numeric のサブクラスとして実装されています。
演算や比較を行うメソッド(+, -, *, /, <=>)は Numeric のサブクラスで定義されます。Numeric で定義されているメソッドは、サブクラスで提供されているメソッド (+, -, *, /, %) を利用して定義されるものがほとんどです。つまり Numeric で定義されているメソッドは、Numeric のサブクラスとして新たに数値クラスを定義した時に、演算メソッド(+, -, *, /, %, <=>, coerce)だけを定義すれば、数値クラスのそのほかのメソッドが適切に定義されることを意図して提供されています。
+@, -@ は単項演算子 +, - を表しメソッド定義などではこの記法を利用します。
効率のため Numeric のメソッドと同じメソッドがサブクラスで再定義されている場合があります。
Numeric#coerce メソッドを使うことによって異なる数値クラス間で演算を行うこともできます。
数値関連のメソッドを実際に定義しているクラス一覧
ほとんどの数値関連のメソッドはサブクラスで再定義されています。これは、効率のためであったり上位抽象クラスで実装を定義することができなかったりするためです。以下の表は 2.4.2 での一覧です。実際にどのメソッドがどのクラスに定義されているかはそれぞれのクラスを参照してください。
=> ruby 2.4.2p198 (2017-09-14 revision 59899) [x86_64-darwin15] Numeric Integer Float Rational Complex -------------------------------------------------------------------------------- % | 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 o o o < | - o o - - Numeric Integer Float Rational Complex -------------------------------------------------------------------------------- << | - o - - - <= | - o o - - <=> | o o o o - == | - o o o o === | - o o - - > | - o o - - >= | - o o - - >> | - o - - - [] | - o - - - ^ | - o - - - Numeric Integer Float Rational Complex -------------------------------------------------------------------------------- abs | o o o o o abs2 | o - - - o angle | o - o - o arg | o - o - o bit_length | - o - - - ceil | o o o o - chr | - o - - - coerce | o o o o o conj | o - - - o conjugate | o - - - o Numeric Integer Float Rational Complex -------------------------------------------------------------------------------- denominator | o o o o o digits | - o - - - div | o o - - - divmod | o o o - - downto | - o - - - eql? | o - o - o even? | - o - - - fdiv | o o o o o finite? | o - o - o floor | o o o o - Numeric Integer Float Rational Complex -------------------------------------------------------------------------------- gcd | - o - - - gcdlcm | - o - - - hash | - - o o o i | o - - - - imag | o - - - o imaginary | o - - - o infinite? | o - o - o inspect | - o o o o integer? | o o - - - lcm | - o - - - Numeric Integer Float Rational Complex -------------------------------------------------------------------------------- magnitude | o o o o o modulo | o o o - - nan? | - - o - - negative? | o - o o - next | - o - - - next_float | - - o - - nonzero? | o - - - - numerator | o o o o o odd? | - o - - - ord | - o - - - Numeric Integer Float Rational Complex -------------------------------------------------------------------------------- phase | o - o - o polar | o - - - o positive? | o - o o - pred | - o - - - prev_float | - - o - - quo | o - o o o rationalize | - o o o o real | o - - - o real? | o - - - o rect | o - - - o Numeric Integer Float Rational Complex -------------------------------------------------------------------------------- rectangular | o - - - o remainder | o o - - - round | o o o o - singleton_method_added | o - - - - size | - o - - - step | o - - - - succ | - o - - - times | - o - - - to_c | o - - - o to_f | - o o o o Numeric Integer Float Rational Complex -------------------------------------------------------------------------------- to_i | - o o o o to_int | o o o - - to_r | - o o o o to_s | - o o o o truncate | o o o o - upto | - o - - - zero? | 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.quo(x).ceil * x else self.quo(x).floor * x end end def rounddown(d=0) x = 10**d if self < 0 self.quo(x).ceil * x else self.quo(x).floor * x end end def roundoff(d=0) x = 10**d if self < 0 (self.quo(x) - 0.5).ceil * x else (self.quo(x) + 0.5).floor * x end end end
目次
- インスタンスメソッド
継承しているメソッド
インスタンスメソッド
modulo(other) -> Numeric
[permalink][rdoc][edit]self % 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
+ self -> self
[permalink][rdoc][edit]-
単項演算子の + です。 self を返します。
例:
+ 10 # => 10 + (-10) # => -10 + 0.1 # => 0.1 + (3r) # => (3/1) + (1+3i) # => (1+3i)
- self -> Numeric
[permalink][rdoc][edit]-
単項演算子の - です。 self の符号を反転させたものを返します。
このメソッドは、二項演算子 - で 0 - self によって定義されています。
[SEE_ALSO] Integer#-@、Float#-@、Rational#-@、Complex#-@
self <=> other -> -1 | 0 | 1 | nil
[permalink][rdoc][edit]-
自身が other より大きい場合に 1 を、等しい場合に 0 を、小さい場合には -1 をそれぞれ返します。自身と other が比較できない場合には nil を返します。
Numeric のサブクラスは、上の動作を満たすよう このメソッドを適切に再定義しなければなりません。
- [PARAM] other:
- 自身と比較したい数値を指定します。
1 <=> 0 #=> 1 1 <=> 1 #=> 0 1 <=> 2 #=> -1 1 <=> "0" #=> nil
abs -> Numeric
[permalink][rdoc][edit]magnitude -> Numeric
-
自身の絶対値を返します。
例:
12.abs #=> 12 (-34.56).abs #=> 34.56 -34.56.abs #=> 34.56
abs2 -> Numeric
[permalink][rdoc][edit]-
自身の絶対値の 2 乗を返します。
例:
2.abs2 # => 4 -2.abs2 # => 4 2.0.abs2 # => 4 -2.0.abs2 # => 4
Numeric のサブクラスは、このメソッドを適切に再定義しなければなりません。
arg -> 0 | Math::PI
[permalink][rdoc][edit]angle -> 0 | Math::PI
phase -> 0 | Math::PI
-
自身の偏角(正の数なら 0、負の数なら Math::PI)を返します。
例:
1.arg # => 0 -1.arg # => 3.141592653589793
Numeric のサブクラスは、このメソッドを適切に再定義しなければなりません。
[SEE_ALSO] Complex#arg
ceil -> Integer
[permalink][rdoc][edit]-
自身と等しいかより大きな整数のうち最小のものを返します。
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) -> [Numeric]
[permalink][rdoc][edit]-
自身と 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:
- オペランドを数値で指定します。
conj -> Numeric
[permalink][rdoc][edit]conjugate -> Numeric
-
常に self を返します。
自身が Complex かそのサブクラスのインスタンスの場合は、自身の共役複素数(実数の場合は常に自身)を返します。
Numeric のサブクラスは、このメソッドを適切に再定義しなければなりません。
例:
10.conj # => 10 0.1.conj # => 0.1 (2/3r).conj # => (2/3)
[SEE_ALSO] Complex#conj
denominator -> Integer
[permalink][rdoc][edit]-
自身を Rational に変換した時の分母を返します。
- [RETURN]
- 分母を返します。
[SEE_ALSO] Numeric#numerator、Integer#denominator、Float#denominator、Rational#denominator、Complex#denominator
div(other) -> Integer
[permalink][rdoc][edit]-
self を other で割った整数の商 q を返します。
ここで、商 q と余り r は、それぞれ
- self == other * q + r
と
- other > 0 のとき: 0 <= r < other
- other < 0 のとき: other < r <= 0
- q は整数
をみたす数です。商に対応する余りは Numeric#modulo で求められます。 div はメソッド / を呼びだし、floorを取ることで計算されます。
メソッド / の定義はサブクラスごとの定義を用います。
- [PARAM] other:
- 自身を割る数を指定します。
p 3.div(2) # => 1 p (-3).div(2) # => -2 p (-3.0).div(2) # => -2
divmod(other) -> [Numeric]
[permalink][rdoc][edit]-
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
[permalink][rdoc][edit]-
自身と 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#===
fdiv(other) -> Float | Complex
[permalink][rdoc][edit]-
self を other で割った商を Float で返します。ただし Complex が関わる場合は例外です。その場合も成分は Float になります。
Numeric のサブクラスは、このメソッドを適切に再定義しなければなりません。
- [PARAM] other:
- 自身を割る数を指定します。
1.fdiv(3) #=> 0.3333333333333333 Complex(1, 1).fdiv 1 #=> (1.0+1.0i) 1.fdiv Complex(1, 1) #=> (0.5-0.5i)
[SEE_ALSO] Numeric#quo
finite? -> bool
[permalink][rdoc][edit]-
self の絶対値が有限値の場合に true を、そうでない場合に false を返します。
例:
10.finite? # => true Rational(3).finite? # => true Float::INFINITY.finite? # => false Float::INFINITY.is_a?(Numeric) # => true
[SEE_ALSO] Numeric#infinite?
floor(ndigits = 0) -> Integer
[permalink][rdoc][edit]-
自身と等しいかより小さな整数のうち最大のものを返します。
- [PARAM] ndigits:
- 10進数での小数点以下の有効桁数を整数で指定します。負の整数を指定した場合、小数点位置から左に少なくとも n 個の 0 が並びます。
1.floor #=> 1 1.2.floor #=> 1 (-1.2).floor #=> -2 (-1.5).floor #=> -2
[SEE_ALSO] Numeric#ceil, Numeric#round, Numeric#truncate
[SEE_ALSO] Integer#floor
i -> Complex
[permalink][rdoc][edit]-
Complex(0, self) を返します。
ただし、Complex オブジェクトでは利用できません。
例:
10.i # => (0+10i) -10.i # => (0-10i) (0.1).i # => (0+0.1i) Rational(1, 2).i # => (0+(1/2)*i)
imag -> 0
[permalink][rdoc][edit]imaginary -> 0
-
常に 0 を返します。
例:
12.imag # => 0 -12.imag # => 0 1.2.imag # => 0 -1.2.imag # => 0
Numeric のサブクラスは、このメソッドを適切に再定義しなければなりません。
[SEE_ALSO] Numeric#real、Complex#imag
infinite? -> nil
[permalink][rdoc][edit]-
常に nil を返します。自身が Float かComplex、もしくはそのサブクラスのインスタンスの場合は、self の絶対値が負の無限大の場合に-1を、正の無限大の場合に1を、有限値の場合に nil を返します。
例:
10.infinite? # => nil (3r).infinite? # => nil
[SEE_ALSO] Numeric#finite?、Float#infinite?、Complex#infinite?
integer? -> bool
[permalink][rdoc][edit]-
自身が Integer かそのサブクラスのインスタンスの場合にtrue を返します。そうでない場合に false を返します。
Numeric のサブクラスは、このメソッドを適切に再定義しなければなりません。
例:
(1.0).integer? #=> false (1).integer? #=> true
[SEE_ALSO] Numeric#real?
negative? -> bool
[permalink][rdoc][edit]-
self が 0 未満の場合に true を返します。そうでない場合に false を返します。
例:
-1.negative? # => true 0.negative? # => false 1.negative? # => false
[SEE_ALSO] Numeric#positive?
nonzero? -> self | nil
[permalink][rdoc][edit]-
自身がゼロの時 nil を返し、非ゼロの時 self を返します。
p 10.nonzero? #=> 10 p 0.nonzero? #=> nil p 0.0.nonzero? #=> nil p Rational(0, 2).nonzero? #=> nil
非ゼロの時に self を返すため、自身が 0 の時に他の処理をさせたい場合に以下のように記述する事もできます。
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"]
[SEE_ALSO] Numeric#zero?
numerator -> Integer
[permalink][rdoc][edit]-
自身を Rational に変換した時の分子を返します。
- [RETURN]
- 分子を返します。
[SEE_ALSO] Numeric#denominator、Integer#numerator、Float#numerator、Rational#numerator、Complex#numerator
polar -> [Numeric, Numeric]
[permalink][rdoc][edit]-
自身の絶対値と偏角を配列にして返します。正の数なら [self, 0]、負の数なら [-self, Math::PI] を返します。
例:
1.0.polar # => [1.0, 0] 2.0.polar # => [2.0, 0] -1.0.polar # => [1.0, 3.141592653589793] -2.0.polar # => [2.0, 3.141592653589793]
Numeric のサブクラスは、このメソッドを適切に再定義しなければなりません。
[SEE_ALSO] Complex#polar
positive? -> bool
[permalink][rdoc][edit]-
self が 0 より大きい場合に true を返します。そうでない場合に false を返します。
例:
1.positive? # => true 0.positive? # => false -1.positive? # => false
[SEE_ALSO] Numeric#negative?
quo(other) -> Rational | Float | Complex
[permalink][rdoc][edit]-
self を other で割った商を返します。整商を得たい場合は Numeric#div を使ってください。
Numeric#fdiv が結果を Float で返すメソッドなのに対して quo はなるべく正確な数値を返すことを意図しています。具体的には有理数の範囲に収まる計算では Rational の値を返します。 Float や Complex が関わるときはそれらのクラスになります。
Numeric のサブクラスは、このメソッドを適切に再定義しなければなりません。
- [PARAM] other:
- 自身を割る数を指定します。
1.quo(3) #=> (1/3) 1.0.quo(3) #=> 0.3333333333333333 1.quo(3.0) #=> 0.3333333333333333 1.quo(0.5) #=> 2.0 Complex(1, 1).quo(1) #=> ((1/1)+(1/1)*i) 1.quo(Complex(1, 1)) #=> ((1/2)-(1/2)*i)
[SEE_ALSO] Numeric#fdiv
real -> Numeric
[permalink][rdoc][edit]-
自身を返します。
Numeric のサブクラスは、このメソッドを適切に再定義しなければなりません。
例:
10.real # => 10 -10.real # => -10 0.1.real # => 0.1 Rational(2, 3).real # => (2/3)
[SEE_ALSO] Numeric#imag、Complex#real
real? -> bool
[permalink][rdoc][edit]-
常に true を返します。(Complex またはそのサブクラスではないことを意味します。)
Numeric のサブクラスは、このメソッドを適切に再定義しなければなりません。
例:
10.real? # => true -10.real? # => true 0.1.real? # => true Rational(2, 3).real? # => true
[SEE_ALSO] Numeric#integer?、Complex#real?
rect -> [Numeric, Numeric]
[permalink][rdoc][edit]rectangular -> [Numeric, Numeric]
-
[self, 0] を返します。
例:
1.rect # => [1, 0] -1.rect # => [-1, 0] 1.0.rect # => [1.0, 0] -1.0.rect # => [-1.0, 0]
Numeric のサブクラスは、このメソッドを適切に再定義しなければなりません。
[SEE_ALSO] Complex#rect
remainder(other) -> Numeric
[permalink][rdoc][edit]-
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
[permalink][rdoc][edit]-
自身ともっとも近い整数を返します。
中央値 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
[permalink][rdoc][edit]step(limit, step = 1) -> Enumerator
step(by: 1, to: Float::INFINITY) {|n| ... } -> self
step(by: 1, to: Float::INFINITY) -> Enumerator
step(by:, to: -Float::INFINITY) {|n| ... } -> self
step(by:, to: -Float::INFINITY) -> Enumerator
-
self からはじめ step を足しながら limit を越える前までブロックを繰り返します。step は負の数も指定できます。また、limit や step には Float なども指定できます。
- [PARAM] limit:
- ループの上限あるいは下限を数値で指定します。step に負の数が指定された場合は、下限として解釈されます。
- [PARAM] step:
- 各ステップの大きさを数値で指定します。負の数を指定することもできます。
- [PARAM] to:
- 引数limitと同じですが、省略した場合はキーワード引数byが正の数であれば Float::INFINITY、負の数であれば -Float::INFINITYを指定したとみなされます。
- [PARAM] by:
- 引数 step と同じです。
- [RETURN]
- ブロックが指定された時は self を返します。
- [RETURN]
- ブロックが指定されなかった時は Enumerator を返します。
- [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 3.step(by:2, to:10){|n| p n} 3 5 7 9
注:浮動小数点数の 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_c -> Complex
[permalink][rdoc][edit]-
自身を複素数 (Complex) に変換します。Complex(self, 0) を返します。
例:
1.to_c # => (1+0i) -1.to_c # => (-1+0i) 1.0.to_c # => (1.0+0i) Rational(1, 2).to_c # => ((1/2)+0i)
Numeric のサブクラスは、このメソッドを適切に再定義しなければなりません。
to_int -> Integer
[permalink][rdoc][edit]-
self.to_i と同じです。
例:
(2+0i).to_int # => 2 Rational(3).to_int # => 3
truncate -> Integer
[permalink][rdoc][edit]-
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
[permalink][rdoc][edit]-
自身がゼロの時、trueを返します。そうでない場合は false を返します。
p 10.zero? #=> false p 0.zero? #=> true p 0.0.zero? #=> true
[SEE_ALSO] Numeric#nonzero?