matherr, _matherr - 数学関数例外ハンドラ
【書式】
#include <math.h>
int matherr(struct exception *x);
double _matherr(int type, char *name, double *arg1, double *arg2,
double r);
【解説】
matherr() は数学関数の実行で発生したエラーを処理するユーザ定義の関数
です。
struct exception型の構造体は<math.h>で次に示すように定義されており、
エラーの種類、発生した関数名、そのパラメタ、デフォルトの関数値が格納
されています。
struct exception {
int type; /* エラーの種類 */
char *name; /* 関数名 */
double arg1; /* 第1パラメタ */
double arg2; /* 第2パラメタ */
double retval; /* 関数値 */
};
エラーの種類は<math.h>で定義されています。
DOMAIN
パラメタが定義域に存在しません
SING
関数の特異点です
OVERFLOW
オーバーフローしました
UNDERFLOW
アンダーフローしました
TLOSS
全体的に桁落ちしました
PLOSS
部分的に桁落ちしました
アプリケーションが独自のmatherr()を用意しておけば、 エラーからの回復
処理を実行することができます。必要な処理を実行した後にmatherr()が1を
返すとエラーメッセージは表示されず、errnoも変更されません。matherr()
が 0 を返したときにはerrnoにはEDOMあるいはERANGEがセットされます。ま
た、typeがDOMAIN, SING, TLOSSのときには対応するエラーメッセージが標
準エラー出力(stderr)に表示されます。
_matherr() は数学関数から呼び出され、 matherr() を呼び出します。
matherr()が0を返してくるとstderrにエラーメッセージを表示するのはこの
関数です。 したがって、数学関数をROM化するときには_matherr()をご自分
で必ず用意してください。
【リターン値】
エラーを処理できたときには0以外を返し、処理できなかったときには0を返
します。
【エラー】
EDOM
パラメタが定義域を超えています
ERANGE
結果が正確に表現できません
【可搬性】
UNIX, DOS窓
【参照】
trig(3M), hyperbolic(3M), exp(3M)
【copyright (c) 安江正樹@東海大学理学部物理学科】