Ruby 2.1.0 リファレンスマニュアル > ライブラリ一覧 > 組み込みライブラリ > Numericクラス

class Numeric

クラス・モジュールの継承リスト: Numeric < Comparable < Object < Kernel < BasicObject

要約

数値を表す抽象クラスです。IntegerFloat などの数値クラスは Numeric のサブクラスとして実装されています。

演算や比較を行うメソッド(+, -, *, /, <=>)は Numeric のサブクラスで定義されます。Numeric で定義されているメソッドは、サブクラスで提供されているメソッド (+, -, *, /, %) を利用して定義されるものがほとんどです。つまり Numeric で定義されているメソッドは、Numeric のサブクラスとして新たに数値クラスを定義した時に、演算メソッド(+, -, *, /, %, <=>, coerce)だけを定義すれば、数値クラスのそのほかのメソッドが適切に定義されることを意図して提供されています。

+@, -@ は単項演算子 +, - を表しメソッド定義などではこの記法を利用します。

効率のため Numeric のメソッドと同じメソッドがサブクラスで再定義されている場合があります。

Numeric#coerce メソッドを使うことによって異なる数値クラス間で演算を行うこともできます。

数値関連のメソッドを実際に定義しているクラス一覧

ほとんどの数値関連のメソッドはサブクラスで再定義されています。これは、効率のためであったり上位抽象クラスで実装を定義することができなかったりするためです。以下の表は 2.1.2 での一覧です。実際にどのメソッドがどのクラスに定義されているかはそれぞれのクラスを参照してください。

=> ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-linux]
                          Numeric    Integer     Fixnum     Bignum     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
                     / |     -          -          o          o          o          o          o
                     < |     -          -          o          o          o          -          -
                          Numeric    Integer     Fixnum     Bignum     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          -          -          -
                          Numeric    Integer     Fixnum     Bignum     Float     Rational   Complex
          -------------------------------------------------------------------------------------------
                   abs |     o          -          o          o          o          -          o
                  abs2 |     o          -          -          -          -          -          o
                 angle |     o          -          -          -          o          -          o
                   arg |     o          -          -          -          o          -          o
            bit_length |     -          -          o          o          -          -          -
                  ceil |     o          o          -          -          o          o          -
                   chr |     -          o          -          -          -          -          -
                coerce |     o          -          -          o          o          o          o
                  conj |     o          -          -          -          -          -          o
             conjugate |     o          -          -          -          -          -          o
                          Numeric    Integer     Fixnum     Bignum     Float     Rational   Complex
          -------------------------------------------------------------------------------------------
           denominator |     o          o          -          -          o          o          o
                   div |     o          -          o          o          -          -          -
                divmod |     o          -          o          o          o          -          -
                downto |     -          o          -          -          -          -          -
                  eql? |     o          -          -          o          o          -          o
                 even? |     -          o          o          o          -          -          -
                  fdiv |     o          -          o          o          o          o          o
               finite? |     -          -          -          -          o          -          -
                 floor |     o          o          -          -          o          o          -
                   gcd |     -          o          -          -          -          -          -
                          Numeric    Integer     Fixnum     Bignum     Float     Rational   Complex
          -------------------------------------------------------------------------------------------
                gcdlcm |     -          o          -          -          -          -          -
                  hash |     -          -          -          o          o          o          o
                     i |     o          -          -          -          -          -          -
                  imag |     o          -          -          -          -          -          o
             imaginary |     o          -          -          -          -          -          o
             infinite? |     -          -          -          -          o          -          -
               inspect |     -          -          o          o          o          o          o
              integer? |     o          o          -          -          -          -          -
                   lcm |     -          o          -          -          -          -          -
             magnitude |     o          -          o          o          o          -          o
                          Numeric    Integer     Fixnum     Bignum     Float     Rational   Complex
          -------------------------------------------------------------------------------------------
                modulo |     o          -          o          o          o          -          -
                  nan? |     -          -          -          -          o          -          -
                  next |     -          o          -          -          -          -          -
              nonzero? |     o          -          -          -          -          -          -
             numerator |     o          o          -          -          o          o          o
                  odd? |     -          o          o          o          -          -          -
                   ord |     -          o          -          -          -          -          -
                 phase |     o          -          -          -          o          -          o
                 polar |     o          -          -          -          -          -          o
                  pred |     -          o          -          -          -          -          -
                          Numeric    Integer     Fixnum     Bignum     Float     Rational   Complex
          -------------------------------------------------------------------------------------------
                   quo |     o          -          -          -          o          o          o
           rationalize |     -          o          -          -          o          o          o
                  real |     o          -          -          -          -          -          o
                 real? |     o          -          -          -          -          -          o
                  rect |     o          -          -          -          -          -          o
           rectangular |     o          -          -          -          -          -          o
             remainder |     o          -          -          o          -          -          -
                 round |     o          o          -          -          o          o          -
singleton_method_added |     o          -          -          -          -          -          -
                  size |     -          -          o          o          -          -          -
                          Numeric    Integer     Fixnum     Bignum     Float     Rational   Complex
          -------------------------------------------------------------------------------------------
                  step |     o          -          -          -          -          -          -
                  succ |     -          o          o          -          -          -          -
                 times |     -          o          -          -          -          -          -
                  to_c |     o          -          -          -          -          -          o
                  to_f |     -          -          o          o          o          o          o
                  to_i |     -          o          -          -          o          o          o
                to_int |     o          o          -          -          o          -          -
                  to_r |     -          o          -          -          o          o          o
                  to_s |     -          -          o          o          o          o          o
              truncate |     o          o          -          -          o          o          -
                          Numeric    Integer     Fixnum     Bignum     Float     Rational   Complex
          -------------------------------------------------------------------------------------------
                  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.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 -> 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
magnitude -> Numeric

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

abs2 -> Numeric

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

arg -> 0 | Math::PI
angle -> 0 | Math::PI
phase -> 0 | Math::PI

自身の偏角(正の数なら 0、負の数なら Math::PI)を返します。

ceil -> Integer

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

coerce(other) -> [Numeric]

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

conj -> Numeric
conjugate -> 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 になります。

floor -> Integer

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

i -> Complex

Complex(0, self) を返します。

imag -> 0
imaginary -> 0

常に 0 を返します。

integer? -> bool

自身が Integer かそのサブクラスのインスタンスの場合にtrue を返します。そうでない場合に false を返します。

nonzero? -> self | nil

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

numerator -> Integer

自身を Rational に変換した時の分子を返します。

polar -> [Numeric, Numeric]

自身の絶対値と偏角を配列にして返します。正の数なら [self, 0]、負の数なら [-self, Math::PI] を返します。

quo(other) -> Rational | Float | Complex

self を other で割った商を返します。整商を得たい場合は Numeric#div を使ってください。

real -> Numeric

自身を返します。

real? -> bool

常に true を返します。(Complex またはそのサブクラスではないことを意味します。)

rect -> [Numeric, Numeric]
rectangular -> [Numeric, Numeric]

[self, 0] を返します。

remainder(other) -> Numeric

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

round -> Integer

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

step(limit, step = 1) {|n| ... } -> self
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 なども指定できます。

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 must_be must_be_close_to must_be_empty must_be_instance_of must_be_kind_of must_be_nil must_be_same_as must_be_within_epsilon must_equal must_include must_match must_raise must_respond_to must_send must_throw 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 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_PATCHLEVEL ::RUBY_PLATFORM ::RUBY_RELEASE_DATE ::RUBY_REVISION ::RUBY_VERSION ::SCRIPT_LINES__ ::STDERR ::STDIN ::STDOUT ::TOPLEVEL_BINDING ::TRUE