C++ ライブラリ・リファレンス |
第 2 章
複素数ライブラリ
3.2 + 4i1 + 3i1 + 2.3i
通常は、
0+3i
のように完全に虚部だけのものは通常3i
と書き、5+0i
のように完全に実部だけのものは通常5
と書きます。データ型complex
を使用すると複素数を表現することができます。
注 - 複素数ライブラリ (libcomplex
) は互換モードでのみ使用できます (-compat[=4]
)。標準モード (デフォルトのモード) では、同様の機能を持つ複素数クラスが C++ 標準ライブラリ (libCstd
) に含まれています。
複素数ライブラリ
複素数ライブラリは、新しいデータ型として複素数データ型を実装します。このライブラリには以下が含まれています。
複素数には、実部と虚部による表現方法の他に、絶対値と偏角による表現方法があります。複素数ライブラリには、実部と虚部によるデカルト表現と、絶対値と偏角による極座標表現とを互いに変換する関数も提供しています。
複素数ライブラリの使用方法
複素数ライブラリを使用する場合は、プログラムにヘッダーファイル
complex.h
をインクルードし、-lcomplex
オプションまたは-library=complex
オプションを使用してリンクしてください。
complex
型複素数ライブラリでは、クラス
complex
が 1 つだけ定義されています。クラスcomplex
のオブジェクトは、1 つの複素数を持つことができます。複素数は次の 2 つの部分で構成されています。各部の数値は
double
型で入っています。上は、クラスcomplex
の定義の例です。クラス
complex
のオブジェクトの値は、1 組のdouble
型の値です。最初の値が実部を表し、 2 番目の値が虚部を表します。
complex
クラスのコンストラクタ
complex
クラスには、2 つのコンストラクタがあります。以下は、その定義です。
complex::complex(){ re=0.0; im=0.0; }complex::complex(double r, double i = 0.0) { re=r; im=i; }複素数の変数を引数なしで宣言すると、最初のコンストラクタが使用され、実部も虚部もゼロで初期化されます。次の例では、実部も虚部もゼロの複素数の変数が生成されます。
complex aComp;引数は 1 つまたは 2 つ指定することができ、どちらの場合も 2 番目のコンストラクタが使用されます。次の例のように、引数を 1 つだけ指定した場合は、その値は実部の値とみなされ虚部はゼロに設定されます。
complex aComp(4.533);
4.533 + 0i次の例のように、引数を 2 つ指定した場合は、最初の値が実部、2 番目の値が虚部となります。
complex aComp(8.999, 2.333);
8.999 + 2.333iまた、複素数ライブラリが提供する
polar
関数を使用して複素数を生成することもできます (「数学関数」を参照してください)。polar
関数は、指定した
1 組の極座標値 (絶対値と偏角) を使用して複素数を作成します。算術演算子
複素数ライブラリでは、すべての基本算術演算子が定義されています。特に、次の 5 つの演算子は通常の型の演算と同様に使用することができ、優先順序も同じです。
+ - / * =演算子
-
は、通常の型の場合と同様に 2 項演算子としても単項演算子としても使用できます。この他、次の演算子の使用方法も通常の型で使用する演算子と同様です。
+= -= *= /=ただし、最後の 4 つの演算子では、式の中で使用できる値は生成されません。したがって、次のように使用することはできません。
complex a, b;...if ((a+=2)==0) {...}; // 誤りb = a *= b; // 誤りまた、等しいか否かを判定する次の 2 つの演算子は、通常の型で使用する演算子と同様に使用することができます。
== !=算術式で実数と複素数が混在しているときは、 C++ では複素数のための演算子関数が使用され、実数は複素数に変換されます。
数学関数
複素数ライブラリには、多くの数学関数が含まれています。複素数に特有のものもあれば、 C の標準数学ライブラリの関数と同じで複素数を対象にしたものもあります。
これらの関数はすべて、あらゆる可能な引数に対して結果を返します。関数が数学的に正しい結果を返せないような場合は、
complex_error
を呼び出して、何らかの適切な値を返します。たとえば、オーバーフローが実際に起こるのを避けるためにcomplex_error
を呼び出してメッセージを出します。次の表で複素数ライブラリの関数を説明します。
エラー処理
複素数ライブラリでは、エラー処理が次のように定義されています。
extern int errno;
class c_exception { ... };int complex_error(c_exception&);外部変数
errno
は C ライブラリの大域的なエラー状態です。errno
は、標準ヘッダーerrno.h
(perror
(3) のマニュアルページを参照) にリストされている値を持ちます。errno
には、多くの関数でゼロ以外の値が設定されます。ある特定の演算でエラーが起こったかどうか調べるには、次のようにしてください。
1. 演算実行前にerrno
をゼロに設定する。2. 演算終了後に値を調べる。関数
complex_error
はc_exception
型の参照引数を持ち、次に示す複素数ライブラリ関数に呼び出されます。デフォルトの
complex_error
はゼロを返します。ゼロが返されたということは、デフォルトのエラー処理が実行されたということです。ユーザーは独自のcomplex_error
関数を作成して、別のエラー処理を行うことができます。エラー処理については、cplexrr(
3CC4)
のマニュアルページで説明しています。デフォルトのエラー処理については、
cplxtrig(
3CC4)
とcplxexp(
3CC4)
のマニュアルページで説明しています。次に概要を示します。
入出力
複素数ライブラリでは、次の例に示す複素数のデフォルトの抽出子と挿入子が提供されています。
ostream& operator<<(ostream&, const complex&); //挿入子istream& operator>>(istream&, complex&) //抽出子抽出子と挿入子の基本的な説明については、「iostream 操作の基本構造」と 「iostream を使用した出力」を参照してください。
入力の場合、複素数の抽出子
>>
は、(括弧の中にあり、コンマで区切られた) 一組の値を入力ストリームから抽出し、複素数オブジェクトに読み込みます。最初の値が実部の値、 2 番目の値が虚部の値となります。たとえば、次のような宣言と入力文がある場合、
(3.45,5)
と入力すると、複素数x
の値は3.45+5.0i
となります。抽出子の場合はこの反対になります。complex x(3.45,5), cout << x
の場合は、(3.45,5)
と表示されます。
complex x;cin >> x;入力データは、通常括弧の中でコンマで区切られた一組の値で、スペースは入れても入れなくてもかまいません。値を 1 つだけ入力したとき (括弧とスペースは入力してもしなくても同じ) は、抽出子は虚部をゼロとします。シンボル
i
を入力してはいけません。挿入子は、複素数の実部と虚部をコンマで区切り、全体を括弧で囲んで挿入します。シンボル
i
は含まれません。2 つの値はdouble
型として扱われます。混合算術演算
complex
型は、組み込みの算術型と混在した式でも使用できるように定義されています。混合算術演算においては、算術型は自動的にcomplex
型に変換されます。算術演算子のすべてと数学関数のほとんどに対して、complex
型を使用できるバージョンが提供されています。次の例で考えてみます。
int i, j;double x, y;complex a, b;a = sin((b+i)/y) + x/j;
b+i
という式は混合算術演算です。整数i
は、コンストラクタcomplex::complex(double,double=0)
によって、complex
型に変換されます (このとき、まず整数からdouble
型に変換されます)。b+i
の計算結果をdouble
型のy
で割っているので、y
もまたcomplex
型に変換され、複素数除算演算が使用されます。商もまたcomplex
型ですので、複素数の正弦関数が呼び出され、その結果もcomplex
型になります。以下も同様です。ただし、すべての算術演算と型変換が暗黙に行われるわけではありませんし、定義されていないものもあります。たとえば、複素数は数学的な意味での大小関係が決められないので、比較は等しいか否かの判定しかできません。
complex a, b;a == b // OKa != b // OKa < b // エラー:演算子 < は complex 型に使用できないa >= b // エラー:演算子 >= は complex 型に使用できない同様に、
complex
型からそれ以外の型への変換もはっきりした定義ができないので、そのような自動変換は行われません。変換するときは、実部または虚部を取り出すのか、または絶対値を取り出すのかを指定する必要があります。
complex a;double f(double);f(abs(a)); // OKf(a); // エラー: f(complex) は、引数の型が一致していない効率
非常に簡単な関数が
inline
で宣言されており、関数呼び出しのオーバーヘッドをなくしています。効率に差があるものは、関数が多重定義されています。たとえば、
pow
関数には引数がcomplex
型のものの他に、引数がdouble
型とint
型のものがあります。
その方がdouble
型とint
型の計算がはるかに簡単になるからです。
complex.h
をインクルードすると、C の標準数学ライブラリヘッダーmath.h
も自動的にインクルードされます。C++ の多重定義の規則により、次のように最も効率の良い式の評価が行われます。
double x;complex x = sqrt(x);この例では、標準数学関数
sqrt(double)
が呼び出され、その計算結果がcomplex
型に変換されます。最初にcomplex
型に変換され、sqrt(complex)
が呼び出されるのではありません。これは、多重定義の解決規則から決まる方法で、最も効率の良い方法です。複素数ライブラリに関するマニュアルページ
このほか、複素数ライブラリに関連するマニュアルページには以下のものがあります。
表 2-4 complex
型に関するマニュアルページcplx.intro(
3CC4)
複素数ライブラリ全体の紹介 cartpol(
3CC4)
直角座標と極座標の関数 cplxerr(
3CC4)
エラー処理関数 cplxexp(3
CC4)
指数、対数、平方根の関数 cplxops(3
CC4)
算術演算子関数 cplxtrig(3
CC4)
三角関数
サン・マイクロシステムズ株式会社 Copyright information. All rights reserved. |
ホーム | 目次 | 前ページへ | 次ページへ | 索引 |