マニュアルページ 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 章「複素数ライブラ
     リ」