Complex構造体は.NET Framework 4より使用できるようになった構造体で、複素数型を表す構造体です。 実部・虚部それぞれをDouble型の値で格納し、一つの型として扱えるようにした型となっています。
なお、BigInteger構造体と同様、Complex構造体はアセンブリSystem.Numerics.dllに含まれています。 使用する場合は、System.Numerics.dllへの参照を追加する必要があります。
演算子
Complex構造体には、四則演算子・等価/不等価演算子が定義されているため、プリミティブな実数型と同じように演算式を記述することができます。
また、IEquatable<BigInteger>も実装しているので、このインターフェースを使用した比較も行えます。
IEquatableインターフェイスおよびIEquatableインターフェイスを使った比較については等価性の定義と比較を参照してください。
型変換
Complex構造体は、Doubleなどの実数型、Int32などの整数型からの暗黙の型変換をサポートしています。 型変換によりComplex構造体を構築した場合、値は実部として扱われ、虚部は常に0となります。 Decimal, BigIntegerからも型変換を行うことができますが、オーバーフローや精度が失われる可能性があるため明示的な型変換を行う必要があります。
PointF構造体などからの変換はサポートされていないので、コンストラクタを使う必要があります。
また、Complex型から他の実数型・整数型へ直接変換することはできないので、実部・虚部を個別に取得して変換する必要があります。
実部・虚部・絶対値・偏角
Complexに格納されている値の状態を知るために、次のようなプロパティが用意されています。
プロパティ | 値 |
---|---|
Real | 複素数の実部の値(Re z)を取得する。 |
Imaginary | 複素数の虚部の値(Im z)を取得する。 |
Magnitude | 複素数の絶対値(|z|)を取得する。 返される値はMath.Sqrt(z.Real * z.Real + z.Imaginary * z.Imaginary)と同じ。 |
Phase | 複素数のガウス平面上での偏角(arg z)を取得する。 単位はラジアン。 返される値はMath.Atan2(z.Imaginary, z.Real)と同じ。 |
なお、絶対値 |z| はComplex.Absメソッドでも得られます。
定数
Complex構造体には、次のような定数を参照するための静的フィールドが用意されています。
フィールド | 定数 |
---|---|
Zero | 実部・虚部ともに0のComplex (0 + i0) |
One | 実部が1、虚部が0のComplex (1 + i0) |
ImaginaryOne | 実部が0、虚部が1のComplex、虚数単位 (0 + i1) |
極形式
絶対値と偏角からComplex型を構築するには、FromPolarCoordinatesメソッドを使います。 このメソッドを使う場合、
- Complex構造体は直行形式で値を格納するため、極形式→直行形式の変換が行われることによる誤差が生じる場合がある
- Phaseプロパティで得られる偏角は -π ~ +π の範囲に正規化されるため、メソッドに指定した偏角とは異なる値となる場合がある
の2点に注意が必要です。
共役・逆数
共役複素数を得るには、Conjugateメソッドが使えます。 得られる結果は、単純に虚部の符号を反転した値をコンストラクタに指定した場合と同じです。
逆数を得るには、Reciprocalメソッドが使えます。
逆数を1に対する除算で求める場合と、Reciprocalメソッドで求める場合の違いは、値(除数)が0だった場合の結果の違いです。 1に対する除算で逆数を求めた場合、値が0の場合は結果が非数NaNとなります。 一方で、Reciprocalメソッドで逆数を求めた場合は、値が0の場合でも結果は0となります。
数学関数
Mathクラスに用意されている数学関数は、Complexをサポートしていません。 代わりに、これらの関数はComplex構造体のメソッドとして提供されています。 Complexには次のようなメソッドが用意されています(rはDoubleの数、z, wはComplexの数)。 Mathクラスと同様、いずれも静的メソッドです。
関数 | Complexのメソッド | 相当するMathクラスのメソッド |
---|---|---|
絶対値 |z| | Complex.Abs(z) | Math.Abs |
累乗 zr | Complex.Pow(z, r) | Math.Pow |
累乗 zw | Complex.Pow(z, w) | Math.Pow |
ネイピア数の累乗 ez | Complex.Exp(z) | Math.Exp |
平方根 √z | Complex.Sqrt(z) | Math.Sqrt |
自然対数 ln z | Complex.Log(z) | Math.Log |
常用対数 log10z | Complex.Log10(z) | Math.Log10 |
対数 logrz | Complex.Log(z, r) | Math.Log |
三角関数 sin z, cos z, tan z | Complex.Sin(z), Complex.Cos(z), Complex.Tan(z) | Math.Sin, Math.Cos, Math.Tan |
逆三角関数 sin-1z, cos-1z, tan-1z | Complex.Asin(z), Complex.Acos(z), Complex.Atan(z) | Math.Asin, Math.Acos, Math.Atan |
双曲線関数 sinh z, cosh z, tanh z | Complex.Sinh(z), Complex.Cosh(z), Complex.Tanh(z) | Math.Sinh, Math.Cosh, Math.Tanh |
関数 | Complexのメソッド | 相当するMathクラスのメソッド |
実部・虚部が非数NaNや無限大を含む場合の動作と結果は、Mathクラスのものとほぼ同じとなります。 詳しくは各メソッドのリファレンスを参照してください。
書式
Complex構造体は書式指定子を指定した文字列化をサポートしています。 Double型の値に適用できる書式指定文字を指定することができ、実部・虚部それぞれの値に書式が適用されます。
Complex型を文字列化する場合、その形式は常に "(実部, 虚部)" となります。 これ以外の形式にしたい場合は、個別に書式を指定するか、カスタム書式プロバイダを実装する必要があります。
書式の種類については書式指定子、書式プロバイダに関しては書式の定義と実装およびカルチャと書式・テキスト処理・暦を参照してください。
Complexの使用例・マンデルブロ集合
Complex構造体を使った例として、マンデルブロ集合の描画を行ってみます。