# マニュアルページ cplxerr.3

## 名前

         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 章「複素数ライブラ
         リ」