CPLXERR(3C++)

名前
cplxerr - complex error - C++ 複素数数学ライブラリのエラー処理関数

形式

#include <complex.h>

class complex { ... };

static const complex complex_zero(0.0, 0.0);

const int SING		= ...;
const int OVERFLOW	= ...;
const int UNDERFLOW	= ...;

class c_exception
{
public:
	c_exception(char *n, const complex& a1, const complex& a2=complex_zero);
	c_exception(unsigned char *n, const complex& a1, const complex& a2=complex_zero);

	friend int complex_error(c_exception&); // 上書き可能
private:
	int type;
	char *name;
	complex arg1, arg2;
	complex retval;
};

機能説明

関数 exp()、 log()、 log10()、 sinh()、 cosh() は、 cplxexp(3C++) と cplxtrig(3C++) で説明されている条件で 関数 complex_error() を呼び出します。 complex_error() がゼロを返すと、 説明にあるように戻り値と errno の設定が行われます。 さらに、エラーの種類を示すメッセージ、そのエラーを検出した関数、 エラーの原因となった値が cerr に書き込まれます (入出力ストリームのドキュメントを参照)。 complex_error がゼロ以外の値を返した場合は、 errno の設定とメッセージの書き込みは行われません。

complex_error() は、デフォルトではゼロを返すだけです。 プログラマは、この関数の代替バージョンを用意するだけで必要なアクションを行うように することができます。 complex_error() は c_exception のフレンド関数で、 「 c_exception への参照」型のパラメタを 1 つとります。

  クラス c_exception
このクラスは、次のフィールドから構成されます。

int type
    値の型を表す整数。ヘッダ内で定数として宣言され、 次のいずれかの値をとります。

    SING
        ゼロ除算などの、引数異常

    OVERFLOW
        オーバーフロー範囲エラー

    UNDERFLOW
        アンダーフロー範囲エラー

char* name
    エラーが検出された関数の名前を表す NULL で終わる文字列を指すポインタ。

complex arg1, arg2
    エラーを検出した関数の呼び出し時に指定された引数 ( complex_err() を 呼び出す関数は引数を 1 つしかとらないため、 arg2 は使用しないでください)。

complex retval
    complex_err() が他の値を設定しない場合に使用する 呼び出し側関数のデフォルトの戻り値。

complex_err() の代替バージョンを作成する場合、 errno の設定と cerr への書き込みが必要なときにはゼロ、 それ以外の場合にはゼロ以外の値を返すようにしてください。 デフォルトの戻り値を変更したい場合は、 パラメタ c_exception の retval フィールドを変更することも できます。

使用例

errno の設定は行わずに、 cerr (または他の場所) への書き込みだけを行う場合を考えます。 次に示す関数 ( complex_err() の代替バージョン) はゼロ以外の値を返します。 そのため、メッセージの書き込みは行われません。 ただし、 errno の設定も行われなくなってしまうため、 それを自分で行なっています。
#include <complex.h>

int c_exception(c_exception& x)
{
	switch( x.type ) {
	case UNDERFLOW:
	case OVERFLOW:
		errno = ERANGE;
		break;
	case SING:
		errno = EDOM;
		break;
	}
	return 1;
}

関連項目

cplx.intro(3C++), cartpol(3C++), cplxexp(3C++), cplxops(3C++), cplxtrig(3C++), intro(2), Ios.intro(3C++)

『C++ ライブラリ・リファレンス』の第 2 章「複素数ライブラリ」