_matherr
更新 : 2007 年 11 月
数値演算エラーを処理します。
int _matherr(
struct _exception *except
);
パラメータ
- except
エラー情報を含む構造体へのポインタ。
戻り値
__matherr 関数は、エラーの場合は 0 を返し、成功した場合は 0 以外の値を返します。_matherr 関数が 0 を返した場合は、エラー メッセージが表示されることがあります。グローバル変数 errno には該当するエラー値が設定されます。_matherr 関数が 0 以外の値を返した場合、エラー メッセージは表示されず、グローバル変数 errno は変更されません。
リターン コードの詳細については、「_doserrno、errno、_sys_errlist、および _sys_nerr」を参照してください。
解説
_matherr 関数は、数値演算ライブラリの浮動小数点関数によって生成されたエラーを処理します。エラーが検出されると、これらの浮動小数点関数によって _matherr 関数が呼び出されます。
_matherr 関数にほかの定義を使用すると、特殊なエラー処理を行うことができます。動的リンク バージョンの C ランタイム ライブラリ (Msvcr90.dll) を使用する場合は、クライアントの実行可能ファイル内の既定の _matherr ルーチンをユーザー定義のバージョンに置き換えることができます。ただし、Msvcr90.dll の DLL クライアント内の既定の _matherr ルーチンを置き換えることはできません。
数値演算ルーチンでエラーが発生すると、Math.h で定義されている _exception 型構造体へのポインタを引数として _matherr が呼び出されます。_exception 型構造体は、次の各要素で構成されています。
int type
例外の種類。char *name
エラーが発生した関数の名前。double arg1、arg2
関数の最初の引数と (存在する場合は) 2 番目の引数。double retval
関数から返される値。
type では、数値演算エラーの種類を指定します。Math.h で定義された、次のいずれかの値をとります。
_DOMAIN
引数のドメイン エラー。_SING
引数が無効。_OVERFLOW
オーバーフローが発生。_PLOSS
有効桁数の一部が失われた。_TLOSS
有効桁数のすべてが失われた。_UNDERFLOW
結果が小さすぎるため表現できない。この条件は、現在サポートされていません。
構造体メンバ name は、エラーが発生した関数名を含む NULL で終わる文字列へのポインタです。構造体メンバ arg1 と arg2 には、エラーの原因となった値が格納されます。引数が 1 つの場合は、arg1 に格納されます。
発生したエラーに対する既定の戻り値は retval です。戻り値を変更する場合は、エラーが実際に発生したかどうかを示す戻り値にする必要があります。
必要条件
ルーチン |
必須ヘッダー |
---|---|
_matherr |
<math.h> |
互換性の詳細については、「C ランタイム ライブラリ」の「互換性」を参照してください。
ライブラリ
C ランタイム ライブラリのすべてのバージョン。
使用例
// crt_matherr.c
/* illustrates writing an error routine for math
* functions. The error function must be:
* _matherr
*/
#include <math.h>
#include <string.h>
#include <stdio.h>
int main()
{
/* Do several math operations that cause errors. The _matherr
* routine handles _DOMAIN errors, but lets the system handle
* other errors normally.
*/
printf( "log( -2.0 ) = %e\n", log( -2.0 ) );
printf( "log10( -5.0 ) = %e\n", log10( -5.0 ) );
printf( "log( 0.0 ) = %e\n", log( 0.0 ) );
}
/* Handle several math errors caused by passing a negative argument
* to log or log10 (_DOMAIN errors). When this happens, _matherr
* returns the natural or base-10 logarithm of the absolute value
* of the argument and suppresses the usual error message.
*/
int _matherr( struct _exception *except )
{
/* Handle _DOMAIN errors for log or log10. */
if( except->type == _DOMAIN )
{
if( strcmp( except->name, "log" ) == 0 )
{
except->retval = log( -(except->arg1) );
printf( "Special: using absolute value: %s: _DOMAIN "
"error\n", except->name );
return 1;
}
else if( strcmp( except->name, "log10" ) == 0 )
{
except->retval = log10( -(except->arg1) );
printf( "Special: using absolute value: %s: _DOMAIN "
"error\n", except->name );
return 1;
}
}
printf( "Normal: " );
return 0; /* Else use the default actions */
}
出力
Special: using absolute value: log: _DOMAIN error
log( -2.0 ) = 6.931472e-001
Special: using absolute value: log10: _DOMAIN error
log10( -5.0 ) = 6.989700e-001
Normal: log( 0.0 ) = -1.#INF00e+000
.NET Framework の相当するアイテム
適用できません。標準 C 関数を呼び出すには、PInvoke を使用します。詳細については、「プラットフォーム呼び出しの例」を参照してください。