要約
複素数を表すクラスです。
実部・虚部を、実数を表す数値オブジェクトとして保持します。
Complex オブジェクトは以下の方法で生成できます。
- 虚数リテラルで記述する
- Kernel?.Complex、Complex.rect、Complex.polar を使う
- 他の数値クラスのオブジェクトから Numeric#to_c で変換する
- 文字列表現から String#to_c で変換する
p 1i # => (0+1i)
# 虚部は Integer オブジェクトで保持される
p 1.0i # => (0+1.0i)
# 虚部は Float オブジェクトで保持される
p 1ri # => (0+(1/1)*i)
p 0.5ri # => (0+(1/2)*i)
# 虚部は Rational オブジェクトで保持される
p 1+2i # => (1+2i)
# `1+2i` という形式のリテラルがあるわけではなく、
# Integer のリテラル `1` と虚数リテラル `2i` と
# 減算演算子 `-` からなる演算子式
Complex メソッドによる生成
# 実部のみ与える
p Complex(1) # => (1+0i)
p Complex(0.3) # => (0.3+0i)
# 実部と虚部を与える
p Complex(2, 3) # => (2+3i)
# 文字列表現を与える(実部・虚部に浮動小数点リテラル形式を使う)
p Complex("0.3-0.5i") # => (0.3-0.5i)
# 文字列表現を与える(実部・虚部に有理数リテラル形式を使う)
p Complex("2/3+3/4i") # => ((2/3)+(3/4)*i)
# 文字列表現を与える(絶対値と偏角による極形式)
p Complex("2@3.141592653589793") # => (-2+0.0i)
Complex.rect メソッドによる生成
# 実部と虚部を与える
p Complex.rect(2, 3) # => (2+3i)
# `Complex(2, 3)` と変わらない
Complex.polar メソッドによる生成
# 絶対値と偏角を与える
p Complex.polar(0.5, Math::PI / 2) # => (0.0+0.5i)
他の数値クラスオブジェクトからの変換による生成
p 3.to_c # => (3+0i)
p 0.3.to_c # => (0.3+0i)
p 0.5r.to_c # => ((1/2)+0i)
文字列表現からの変換による生成
p "0.3-0.5i".to_c # => (0.3-0.5i)
p "2/3+3/4i".to_c # => ((2/3)+(3/4)*i)
p "2@3.141592653589793".to_c # => (-2+0.0i)
複素数演算において、オペランドの実部・虚部のクラスは演算結果の実部・虚部のクラスに影響します。
例a = 3.0 + 3i
# 実部が Float、虚部が Integer
p a / 2 # => (1.5+(3/2)*i)
# 実部は Float、虚部は Rational になる
実部・虚部ともに Integer もしくは Rational であるような Complex オブジェクト、および Integer オブジェクト、Rational オブジェクトの間の加減乗除算は丸め誤差なく行われます。
p ([1ri / 10] * 10).sum
# => (0+(1/1)*i)
# 演算誤差無し
# 参考:
p ([1.0i / 10] * 10).sum
# => (0+0.9999999999999999i)
# `1.0i / 10` の時点で誤差が生じている
# それを 10 個足し合わせることで、`to_s` でも分かる誤差になっている
目次
- 特異メソッド
- インスタンスメソッド
- privateメソッド
- 追加されるメソッド
- 定数
継承しているメソッド
- Numericから継承しているメソッド
特異メソッド
polar(r, theta = 0) -> Complex[permalink][rdoc][edit](Numeric, ?Numeric) → Complex-
絶対値が
r、偏角がthetaである Complex クラスのオブジェクトを生成します。複素数の極形式(polar form)に基づくためこの名があります。
- [PARAM]
r: - 生成する複素数の絶対値。
- [PARAM]
theta: - 生成する複素数の偏角。単位はラジアンです。省略した場合は 0 です。
p Complex.polar(2.0) # => (2.0+0.0i) p Complex.polar(2.0, 0) # => (2.0+0.0i) p Complex.polar(2.0, Math::PI) # => (-2.0+0.0i) - [PARAM]
rect(real, imag = 0) -> ComplexRuby 1.9.3 から[permalink][rdoc][edit]rectangular(real, imag = 0) -> Complex(Numeric, ?Numeric) → Complex-
実部が
real、虚部がimagである Complex クラスのオブジェクトを生成します。複素数の直交形式(rectangular form)に基づくためこの名があります。
- [PARAM]
real: - 生成する複素数の実部。
- [PARAM]
imag: -
生成する複素数の虚部。省略した場合は
0です。
p Complex.rect(1) # => (1+0i) p Complex.rect(1, 2) # => (1+2i) p Complex.rectangular(1, 2) # => (1+2i)[SEE_ALSO] Kernel?.Complex
- [PARAM]
インスタンスメソッド
self * other -> Complex[permalink][rdoc][edit](Numeric) → Complex-
selfにotherを掛けた値(=積)を返します。Complexオブジェクトを左項とする算術演算子*はこのメソッドの呼び出しになります。- [PARAM]
other: -
selfに対する乗数
p Complex(1, 2) * 2 # => (2+4i) p Complex(1, 2) * Complex(2, 3) # => (-4+7i) p Complex(1, 2) * Rational(1, 2) # => ((1/2)+(1/1)*i) - [PARAM]
self ** other -> Complex[permalink][rdoc][edit](Numeric) → Complex-
selfのother乗を返します。Complexオブジェクトを左項とする算術演算子**はこのメソッドの呼び出しになります。- [PARAM]
other: -
selfに対する冪指数(べきしすう)
p 1i ** 2 # => (-1+0i) - [PARAM]
self + other -> Complex[permalink][rdoc][edit](Numeric) → Complex-
selfにotherを足した値(=和)を返します。Complexオブジェクトを左項とする算術演算子+はこのメソッドの呼び出しになります。- [PARAM]
other: -
selfに加算する数値
p Complex(1, 2) + Complex(2, 3) # => (3+5i) - [PARAM]
self - other -> Complex[permalink][rdoc][edit](Numeric) → Complex-
selfからotherを引いた値(=差)を返します。Complexオブジェクトを左項とする算術演算子-はこのメソッドの呼び出しになります。- [PARAM]
other: -
selfから減算する数値
p Complex(1, 2) - Complex(2, 3) # => (-1-1i) - [PARAM]
- self -> ComplexRuby 1.9.3 から[permalink][rdoc][edit]() → Complex-
0からselfを引いた値を返します。
例Complexオブジェクトに対する単項演算子-はこのメソッドの呼び出しになります。p -Complex(1) # => (-1+0i) p -Complex(-1, 1) # => (1-1i) self / other -> Complex[permalink][rdoc][edit]quo(other) -> Complex(Numeric) → Complex-
selfをotherで割った値(=商)を返します。Complexオブジェクトを左項とする算術演算子/はこのメソッドの呼び出しになります。- [PARAM]
other: -
selfに対する除数
p Complex(1.0) / 2 # => (0.5+0i) # 実部が Float、虚部が Integer p Complex(1) / 2.0 # => (0.5+0.0i) # 実部・虚部ともに Float p Complex(3, 4) / 2 # => ((3/2)+2i) # 実部が Rational、虚部が Integer[SEE_ALSO] Numeric#quo
- [PARAM]
self <=> other -> -1 | 0 | 1 | nil[permalink][rdoc][edit](untyped) → Integer?-
selfとotherが共に実数(=虚部がゼロの数)のときself.real <=> other.realの結果を返します。そうでないときは
nilを返します。Complexオブジェクトを左項とする二項演算子<=>はこのメソッドの呼び出しになります。- [PARAM]
other: - 比較対象
p Complex(2, 3) <=> Complex(2, 3) # => nil p Complex(2, 3) <=> 1 # => nil p Complex(2) <=> 1 # => 1 p Complex(2) <=> 2 # => 0 p Complex(2) <=> 3 # => -1 - [PARAM]
self == other -> bool[permalink][rdoc][edit](untyped) → bool-
selfが数値としてotherと等しければtrueを、そうでなければfalseを返します。otherが数値でないときはfalseを返します。Complexオブジェクトを左項とする比較演算子==はこのメソッドの呼び出しになります。- [PARAM]
other: - 比較対象
p Complex(2, 1) == Complex(1) # => false p Complex(1, 0) == Complex(1) # => true p Complex(1, 0) == 1 # => true p Complex(1, 0) == 1.0 # => true - [PARAM]
abs -> Numeric[permalink][rdoc][edit]magnitude -> NumericRuby 1.9.3 から() → Numeric-
selfの絶対値(absolute value)を返します。以下の計算の結果を Float オブジェクトで返します。
例sqrt(self.real ** 2 + self.imag ** 2)p Complex(1, 2).abs # => 2.23606797749979 p Complex(3, 4).abs # => 5.0 p Complex('1/2', '1/2').abs # => 0.7071067811865476[SEE_ALSO] Complex#abs2
abs2 -> Numeric[permalink][rdoc][edit]() → Numeric-
selfの絶対値の 2 乗を返します。以下の計算の結果を返します。
例self.real ** 2 + self.imag ** 2p Complex(1, 1).abs2 # => 2 p Complex(1.0, 1.0).abs2 # => 2.0 p Complex('1/2', '1/2').abs2 # => (1/2)[SEE_ALSO] Complex#abs
arg -> Float[permalink][rdoc][edit]angle -> Floatphase -> FloatRuby 1.9.3 から() → Float-
例selfの偏角を [-π,π] の範囲で返します。p Complex.polar(3, Math::PI/2).arg # => 1.5707963267948966非正の実軸付近での挙動に注意してください。以下の例のように虚部が 0.0 と -0.0 では値が変わります。
例p Complex(-1, 0).arg # => 3.141592653589793 p Complex(-1, -0).arg # => 3.141592653589793 p Complex(-1, -0.0).arg # => -3.141592653589793 p Complex(0, 0.0).arg # => 0.0 p Complex(0, -0.0).arg # => -0.0 p Complex(-0.0, 0).arg # => 3.141592653589793 p Complex(-0.0, -0.0).arg # => -3.141592653589793メソッド名の
argは argument(偏角)に由来しますが、「引数」の argument と紛らわしいためか、argumentというエイリアスは用意されていません。[SEE_ALSO] Numeric#arg
coerce(other) -> [Complex, Complex][permalink][rdoc][edit](Numeric) → [ Complex, Complex ]-
otherを Complex に変換して[変換後の other, self]の配列を返します。- [EXCEPTION]
TypeError: - 変換できないオブジェクトを指定した場合に発生します。
p Complex(1).coerce(2) # => [(2+0i), (1+0i)] - [EXCEPTION]
conjugate -> Complex[permalink][rdoc][edit]conj -> Complex() → Complex-
例selfの共役複素数を返します。p Complex(1, 2).conj # => (1-2i) denominator -> Integer[permalink][rdoc][edit]() → Integer-
selfの分母(denominator)を返します。以下のように、実部と虚部の分母の最小公倍数を整数で返します。
例1 2 3+4i <- numerator(分子) - + -i -> ---- 2 3 6 <- denominator(分母)p Complex('1/2+2/3i').denominator # => 6 p Complex(3).denominator # => 1[SEE_ALSO] Complex#numerator
fdiv(other) -> ComplexRuby 1.9.3 から[permalink][rdoc][edit](Numeric) → Complex-
selfをotherで割った商を返します。実部と虚部が共に Float の値になります。- [PARAM]
other: -
selfに対する除数
p Complex(11, 22).fdiv(3) # => (3.6666666666666665+7.333333333333333i) p Complex(11, 22).quo(3) # => ((11/3)+(22/3)*i)[SEE_ALSO] Complex#quo
- [PARAM]
finite? -> boolRuby 2.4.0 から[permalink][rdoc][edit]() → bool-
実部と虚部の両方が有限値の場合に
例trueを、そうでない場合にfalseを返します。p (1 + 1i).finite? # => true p (Float::INFINITY + 1i).finite? # => false[SEE_ALSO] Complex#infinite?
imag -> Numeric[permalink][rdoc][edit]imaginary -> NumericRuby 1.9.3 から() → Numeric-
例selfの虚部を返します。p Complex(3, 2).imag # => 2[SEE_ALSO] Numeric#imag
infinite? -> nil | 1Ruby 2.4.0 から[permalink][rdoc][edit]() → Integer?-
実部と虚部のどちらも正または負の無限大ではない場合に
例nilを、そうでない場合に1を返します。p (1+1i).infinite? # => nil p (Float::INFINITY + 1i).infinite? # => 1[SEE_ALSO] Complex#finite?
inspect -> String[permalink][rdoc][edit]() → String-
例selfを人間が読みやすい形の文字列表現にして返します。p Complex(2).inspect # => "(2+0i)" p Complex('-8/6').inspect # => "((-4/3)+0i)" p Complex('1/2i').inspect # => "(0+(1/2)*i)" p Complex(0, Float::INFINITY).inspect # => "(0+Infinity*i)" p Complex(Float::NAN, Float::NAN).inspect # => "(NaN+NaN*i)" numerator -> Complex[permalink][rdoc][edit]() → Complex-
例selfの分子(numerator)を返します。p Complex('1/2+2/3i').numerator # => (3+4i) p Complex(3).numerator # => (3+0i)[SEE_ALSO] Complex#denominator
polar -> [Numeric, Numeric][permalink][rdoc][edit]() → [ Numeric, Float ]-
例selfの絶対値と偏角を配列にして返します。p Complex.polar(1, 2).polar # => [1.0, 2.0][SEE_ALSO] Numeric#polar
rationalize -> RationalRuby 1.9.3 から[permalink][rdoc][edit]rationalize(eps) -> Rational(?Numeric eps) → Rational-
selfの虚部が Integer か Rational のゼロであれば実部を Rational に変換して返します。許容誤差epsを与えることもできます。- [PARAM]
eps: - 許容する誤差。
- [EXCEPTION]
RangeError: - 虚部がゼロでなかったり Float のゼロである場合に発生します。
変換できない例p Complex(0.1).rationalize # => (1/10) p Complex(Math::PI).rationalize(0.01) # => (22/7)# 虚部がゼロでない (1 + 2i).rationalize # ~> RangeError # 虚部がゼロだが Float の 0.0 である (1 + 0.0i).rationalize # ~> RangeError[SEE_ALSO] Float#rationalize, Integer#rationalize, Rational#rationalize
- [PARAM]
real -> Numeric[permalink][rdoc][edit]() → Numeric-
例selfの実部を返します。p Complex(3, 2).real # => 3 real? -> falseRuby 1.9.3 から[permalink][rdoc][edit]() → false-
常に
例falseを返します。p (2+3i).real? # => false p (2+0i).real? # => false[SEE_ALSO] Numeric#real?
rect -> [Numeric, Numeric]Ruby 1.9.3 から[permalink][rdoc][edit]rectangular -> [Numeric, Numeric]() → [ Numeric, Numeric ]-
selfの実部と虚部を配列にして返します。メソッド名は、これが複素数の直交形式(rectangular form)の成分を得るものであることから。
例p Complex(3).rect # => [3, 0] p Complex(3.5).rect # => [3.5, 0] p Complex(3, 2).rect # => [3, 2][SEE_ALSO] Numeric#rect
to_c -> selfRuby 1.9.1 から[permalink][rdoc][edit]() → Complex-
例selfを返します。p Complex(2).to_c # => (2+0i) p Complex(-8, 6).to_c # => (-8+6i) to_f -> FloatRuby 1.9.3 から[permalink][rdoc][edit]() → Float-
selfの虚部が Integer か Rational のゼロであれば実部を Float に変換して返します。- [EXCEPTION]
RangeError: - 虚部がゼロでなかったり Float のゼロである場合に発生します。
変換できない例p (1 + 0i).to_f # => 1.0 p (1 + 0ri).to_f # => 1.0# 虚部がゼロでない (1 + 2i).to_f # ~> RangeError # 虚部がゼロだが Float の 0.0 である (1 + 0.0i).to_f # ~> RangeError - [EXCEPTION]
to_i -> IntegerRuby 1.9.3 から[permalink][rdoc][edit]() → Integer-
selfの虚部が Integer か Rational のゼロであれば実部を Integer に変換して返します。- [EXCEPTION]
RangeError: - 虚部がゼロでなかったり Float のゼロである場合に発生します。
変換できない例p (1.9 + 0i).to_i # => 1 p (1.9 + 0ri).to_i # => 1# 虚部がゼロでない (1 + 2i).to_i # ~> RangeError # 虚部がゼロだが Float の 0.0 である (1 + 0.0i).to_i # ~> RangeError - [EXCEPTION]
to_r -> RationalRuby 1.9.3 から[permalink][rdoc][edit]() → Rational-
selfの虚部がゼロであれば実部を Rational に変換して返します。- [EXCEPTION]
RangeError: - 虚部がゼロでない場合に発生します。
変換できない例p (0.75 + 0i).to_r # => (3/4) p (0.75 + 0ri).to_r # => (3/4) p (0.75 + 0.0i).to_r # => (3/4)# 虚部がゼロでない (1 + 2i).to_r # ~> RangeError - [EXCEPTION]
to_s -> String[permalink][rdoc][edit]() → String-
例selfを "実部 + 虚部i" 形式の文字列にして返します。p Complex(2).to_s # => "2+0i" p Complex('-8/6').to_s # => "-4/3+0i" p Complex('1/2i').to_s # => "0+1/2i" p Complex(0, Float::INFINITY).to_s # => "0+Infinity*i" p Complex(Float::NAN, Float::NAN).to_s # => "NaN+NaN*i"
privateメソッド
marshal_dump -> ArrayRuby 1.9.3 から[permalink][rdoc][edit]-
Marshal?.load のためのメソッドです。
Complex::compatible#marshal_loadで復元可能な配列を返します。2.0 以降では Marshal?.load で 1.8 系の Complex オブジェクトを保存した文字列も復元できます。
[注意]
Complex::compatibleは通常の方法では参照できません。
追加されるメソッド
json_create(hash) -> ComplexRuby 2.1.0 から[permalink][rdoc][edit] [added by json/add/complex]-
JSON のオブジェクトから Complex のオブジェクトを生成して返します。
- [PARAM]
hash: - 実部をキー 'r'、虚部をキー 'i' に持つハッシュを指定します。
- [PARAM]
to_json(*args) -> StringRuby 2.1.0 から[permalink][rdoc][edit] [added by json/add/complex]-
自身を JSON 形式の文字列に変換して返します。
内部的にはハッシュにデータをセットしてから JSON::Generator::GeneratorMethods::Hash#to_json を呼び出しています。
- [PARAM]
args: - 引数はそのまま JSON::Generator::GeneratorMethods::Hash#to_json に渡されます。
require 'json/add/complex' p (2+3i).to_json # => "{\"json_class\":\"Complex\",\"r\":2,\"i\":3}" - [PARAM]
定数
I -> Complex[permalink][rdoc][edit]-
虚数単位です。
(0+1i)を返します。