_matherr, _matherrl

提供: RAD Studio
移動先: 案内検索

math.h:インデックス への移動


ヘッダーファイル

math.h

カテゴリ

診断ルーチン,演算ルーチン

プロトタイプ

int _matherr(struct _exception *e);

int _matherrl(struct _exceptionl *e);

説明

ユーザーが変更可能な算術エラーハンドラです。

_matherr は,算術ライブラリによってエラーが生成された場合に呼び出されます。

_matherrl は long double バージョンです。long double 算術関数によってエラーが生成された場合に呼び出されます。

_matherr と _matherrl はユーザーフック(ユーザーがカスタマイズできる関数)として機能し,ユーザーが独自の算術エラー処理ルーチンを記述して動作を変更できます。

_matherr と _matherrl は,算術関数によって発生する定義域と範囲のエラーをトラップするための情報として役立ちます。これらは,ゼロ除算などの浮動小数点例外はトラップできません。このようなエラーをトラップするための情報については,シグナルを参照してください。

独自の _matherr または _matherrl ルーチンを定義して,カスタムエラーハンドラ(特定の種類のエラーを捕捉して解決するハンドラ)を作成できます。カスタマイズした関数は,C ライブラリのデフォルトバージョンをオーバーライドします。カスタマイズした _matherr または _matherrl は,エラーを解決できなかった場合は 0 を返し,エラーを解決できた場合は 0 以外を返します。_matherr または _matherrl が 0 以外を返す場合,エラーメッセージは出力されず,グローバル変数 errno は変更されません。

次は,_exception および _exceptionl 構造体です(math.h で定義)。

struct _exception {

int type;

char *name;

double arg1, arg2, retval;

};

struct _exceptionl {

int type;

char *name;

long double arg1, arg2, retval;

};

次の表は,_exception および _exceptionl 構造体のメンバーです。

type

発生した算術エラーの種類。typedef _mexcep で定義されている列挙型です(この後の定義を参照)。

name

エラーになった算術ライブラリ関数の名前を保持するヌルで終わる文字列へのポインタ。

arg1, arg2

エラーが発生した(name が指す関数に渡された)引数。関数に 1 つだけ引数が渡された場合は,arg1 に格納されます。

retval

_matherr(または _matherrl)のデフォルトの戻り値。この値は変更できます。



typedef _mexcep(math.h で定義)は,次の算術エラーを表す定数シンボルを列挙します。

DOMAIN

関数の定義域にない引数です。たとえば,log(-1)。

SING

異常値になる引数です。たとえば,pow(0, -2)。

OVERFLOW

関数の結果が DBL_MAX(または LDBL_MAX)より大きくなる引数です。たとえば,exp(1000)。

UNDERFLOW

関数の結果が DBL_MIN(または LDBL_MIN)より小さくなる引数です。たとえば,exp(-1000)。

TLOSS

関数結果の有効桁が完全に失われる引数です。たとえば,sin(10e70)。



DBL_MAX,DBL_MIN,LDBL_MAX,および LDBL_MIN マクロは,float.h で定義されています。

デフォルトの _matherr と _matherrl のソースコードは,C++Builder 配布ディスクに収録されています。

UNIX 形式の _matherr と _matherrl のデフォルトの動作(メッセージを出力して終了)は,ANSI 互換ではありません。これらのルーチンの UNIX 形式バージョンが必要な場合は,C++Builder 配布ディスクに収録されている MATHERR.C および MATHERRL.C を使用してください。



 #include <math.h>
 #include <string.h>
 #include <stdio.h>
 int _matherr (struct _exception *a)
 {
   if (a->type == DOMAIN)
     if (!strcmp(a->name,"sqrt")) {
       a->retval = sqrt (-(a->arg1));
     return 1;
     }
   return 0;
 }
 int main(void)
 {
   double x = -2.0, y;
   y = sqrt(x);
   printf("_Matherr corrected value: %lf\n",y);
   return 0;
 }