Ruby 3.0 リファレンスマニュアル > ライブラリ一覧 > 組み込みライブラリ > Numericクラス
クラス・モジュールの継承リスト: Numeric < Comparable < Object < Kernel < BasicObject
数値を表す抽象クラスです。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
Numeric には除法(除算;割り算;division)に関するメソッドがいくつもありますが、除法にはいくつか種類があるため、全貌が把握しづらくなっています。この節では除法の種類を説明し、各メソッドがどの除法に基づいているのかが分かるようにします。
まず用語についてですが、割られる数を被除数(dividend)、割る数を除数(divisor)、割った結果を商(quotient)と言います。
除法は大きく2つに分類できます。
そのうちの一つを、ここでは「普通の除法」と呼ぶことにします。普通の除法は、被除数を x、除数を y、商を q としたとき、x == q⋅y となるよう定義された除法です。 7 割る 2 を 3.5 とする除法は、普通の除法です。
普通の除法における商をここでは「普通の商」と呼ぶことにしましょう。
もう一つの除法は、商が必ず整数になるよう定義されるもので、これを「整除法」と言います。 7 割る 2 を 3 余り 1 とする除法は、整除法です。
整除法における商を特に「整商」と言います。
整除法では、被除数を x、除数を y、商を q としたとき、x と q⋅y が一致する(つまり割り切れる)とは限りません。その差 x − q⋅y を剰余(余り;remainder)と言います。整除法は商と剰余がセットで決まる除法なので「剰余付き除法」とも呼ばれます。
しばしば「整除法は整数の世界でしか成り立たない」と誤解されていますが、 2.5 メートルの紐から 0.75 メートルの紐が何本取れて何メートルの半端が出るか、という問題を考えれば、被除数や除数が整数でなくてもよいことが分かります。
例: Float の世界の整商と剰余
p 2.5.divmod(0.75) # => [3, 0.25]
# 2.5 メートルの紐から 0.75 メートルの紐が 3 本取れて 0.25 メートル余る
ただし、複素数の世界では整商・剰余は考えないので、Complex に divmod などのメソッドは定義されていません。
以下では、まず普通の除法に基づくメソッドについて述べます。
普通の商を得るメソッドは Numeric#quo です。 quo の返り値のクラスは、被除数・除数のクラスによって異なります。例えば、被除数・除数の一方が Integer、他方が Float なら返り値は Float です。
普通の商を得るメソッドには、Numeric#fdiv もあります。これは商を Float で返します(被除数・除数の一方が Complex のときは Complex を返します)。
整数同士の除法の場合、quo は厳密値を Rational で返しますが、 fdiv では丸め誤差が生じうることに注意してください。
次に整除法に基づくメソッドについて述べます。
重要なことは、整除法の定義(言い換えれば整商・剰余の定義)がいくつもある、ということです。
しかし、どの定義にも共通していることが二つあります。
それは、被除数を x、除数を y としたときの整商を q、剰余を r とすると、第一に、
x == y * q + r (ただし q は整数)
が成り立つということです。第二に、剰余 r は「半端」ですから、r の絶対値は y の絶対値より小さくなくてはならないということです。
この二つを満たす整商・剰余の定義は何通りもありますが、 Ruby では、2通りの定義を採用し、剰余について Numeric#modulo メソッドと Numeric#remainder メソッドとして実装されています。
modulo は、
となるように定められた剰余です。定義からすぐ分かるとおり、剰余 r の符号は除数 y の符号と一致します。
modulo の別名は % で、普通はメソッド呼び出しの形ではなく二項演算子の形で用います。
modulo に対応する整商は Numeric#div です。これは、普通の商を Numeric#floor で整数化したものと一致します。
さきほどの例で出てきた Numeric#divmod は、 div と modulo の値を一度に配列で返すメソッドです。
一方、remainder は
となるように定められた剰余です。定義からすぐ分かるとおり、剰余 r の符号は被除数 x の符号と一致します。
remainder に対応する整商を得るメソッドはありませんが、 x.quo(y).truncate で得ることができます。
x と y の符号が同じとき、modulo と remainder は一致します。
商を得るメソッドには Numeric#/ もあります。普通はメソッド呼び出しの形ではなく、二項演算子として用います。これは被除数・除数のクラスによって挙動が異なります。例えば Integer 同士なら div と同じ、Integer や Rational と Float なら quo と同じ、といった具合です。被除数のクラスの / メソッドの説明をご覧ください。
定義 | 説明 | |
---|---|---|
modulo(other) -> Numeric
|
self を other で割った余り r を返します。 |
|
+ self -> self
|
単項演算子の + です。 self を返します。 |
|
- self -> Numeric
|
単項演算子の - です。 self の符号を反転させたものを返します。 |
|
self / other -> Numeric
|
除算の演算子です。 self を other で割った商を返します。 |
|
self <=> other -> -1 | 0 | 1 | nil
|
自身が other より大きい場合に 1 を、等しい場合に 0 を、小さい場合には -1 をそれぞれ返します。自身と other が比較できない場合には nil を返します。 |
|
abs -> Numeric
|
自身の絶対値を返します。 |
|
abs2 -> Numeric
|
自身の絶対値の 2 乗を返します。 |
|
arg -> 0 | Math::PI
|
自身の偏角(正の数なら 0、負の数なら Math::PI)を返します。 |
|
ceil -> Integer
|
自身と等しいかより大きな整数のうち最小のものを返します。 |
|
coerce(other) -> [Numeric]
|
自身と other が同じクラスになるよう、自身か other を変換し [other, self] という配列にして返します。 |
|
conj -> Numeric
|
常に self を返します。 |
|
denominator -> Integer
|
自身を Rational に変換した時の分母を返します。 |
|
div(other) -> Integer
|
self を other で割った整数の商 q を返します。 |
|
divmod(other) -> [Numeric]
|
self を other で割った商 q と余り r を、 [q, r] という 2 要素の配列にして返します。商 q は常に整数ですが、余り r は整数であるとは限りません。 |
|
eql?(other) -> bool
|
自身と other のクラスが等しくかつ == メソッドで比較して等しい場合に true を返します。そうでない場合に false を返します。 |
|
fdiv(other) -> Float | Complex
|
self を other で割った商を Float で返します。ただし Complex が関わる場合は例外です。その場合も成分は Float になります。 |
|
finite? -> bool
|
self の絶対値が有限値の場合に true を、そうでない場合に false を返します。 |
|
floor(ndigits = 0) -> Integer
|
自身と等しいかより小さな整数のうち最大のものを返します。 |
|
i -> Complex
|
Complex(0, self) を返します。 |
|
imag -> 0
|
常に 0 を返します。 |
|
infinite? -> nil
|
常に nil を返します。自身が Float かComplex、もしくはそのサブクラスのインスタンスの場合は、self の絶対値が負の無限大の場合に-1を、正の無限大の場合に1を、有限値の場合に nil を返します。 |
|
integer? -> bool
|
自身が Integer かそのサブクラスのインスタンスの場合にtrue を返します。そうでない場合に false を返します。 |
|
negative? -> bool
|
self が 0 未満の場合に true を返します。そうでない場合に false を返します。 |
|
nonzero? -> self | nil
|
自身がゼロの時 nil を返し、非ゼロの時 self を返します。 |
|
numerator -> Integer
|
自身を Rational に変換した時の分子を返します。 |
|
polar -> [Numeric, Numeric]
|
自身の絶対値と偏角を配列にして返します。正の数なら [self, 0]、負の数なら [-self, Math::PI] を返します。 |
|
positive? -> bool
|
self が 0 より大きい場合に true を返します。そうでない場合に false を返します。 |
|
quo(other) -> Rational | Float | Complex
|
self を other で割った商を返します。整商を得たい場合は Numeric#div を使ってください。 |
|
real -> Numeric
|
自身を返します。 |
|
real? -> bool
|
常に true を返します。(Complex またはそのサブクラスではないことを意味します。) |
|
rect -> [Numeric, Numeric]
|
[self, 0] を返します。 |
|
remainder(other) -> Numeric
|
self を other で割った余り r を返します。 |
|
round -> Integer
|
自身ともっとも近い整数を返します。 |
|
step(limit, step = 1) {|n| ... } -> self
|
self からはじめ step を足しながら limit を越える前までブロックを繰り返します。step は負の数も指定できます。また、limit や step には Float なども指定できます。 |
|
to_c -> Complex
|
自身を複素数 (Complex) に変換します。Complex(self, 0) を返します。 |
|
to_int -> Integer
|
self.to_i と同じです。 |
|
truncate -> Integer
|
0 から 自身までの整数で、自身にもっとも近い整数を返します。 |
|
zero? -> bool
|
自身がゼロの時、trueを返します。そうでない場合は false を返します。 |
!
!=
__id__
__send__
instance_eval
instance_exec
method_missing
singleton_method_added
singleton_method_removed
singleton_method_undefined
!~
==
===
=~
_dump
class
clone
define_singleton_method
display
enum_for
equal?
extend
freeze
frozen?
hash
initialize
initialize_copy
inspect
instance_of?
instance_variable_defined?
instance_variable_get
instance_variable_set
instance_variables
is_a?
itself
marshal_dump
marshal_load
method
methods
nil?
object_id
pretty_inspect
pretty_print
pretty_print_cycle
pretty_print_inspect
pretty_print_instance_variables
private_methods
protected_methods
psych_to_yaml
public_method
public_methods
public_send
remove_instance_variable
respond_to?
respond_to_missing?
send
singleton_class
singleton_method
singleton_methods
taint
tainted?
tap
then
to_a
to_ary
to_hash
to_io
to_proc
to_regexp
to_s
to_str
trust
untaint
untrust
untrusted?
.new
.yaml_tag
::ARGF
::ARGV
::DATA
::ENV
::FALSE
::NIL
::RUBY_COPYRIGHT
::RUBY_DESCRIPTION
::RUBY_ENGINE
::RUBY_ENGINE_VERSION
::RUBY_PATCHLEVEL
::RUBY_PLATFORM
::RUBY_RELEASE_DATE
::RUBY_REVISION
::RUBY_VERSION
::SCRIPT_LINES__
::STDERR
::STDIN
::STDOUT
::TOPLEVEL_BINDING
::TRUE