_matherr
数値演算エラーを処理します。
構文
int _matherr(struct _exception *except);
パラメーター
except
エラー情報を保持する構造体へのポインター。
戻り値
_matherr
は、エラーを示す場合は 0 を返し、成功を示す場合は 0 以外の値を返します。
- 0 が返された場合
_matherr
は、エラー メッセージを表示でき、errno
適切なエラー値に設定されます。 - 0 以外の値を返した場合
_matherr
、エラー メッセージは表示されず、errno
変更されずメインされます。
リターン コードの詳細については、「errno
、_doserrno
、_sys_errlist
、および _sys_nerr
」を参照してください。
解説
関数は _matherr
、数学ライブラリの浮動小数点関数によって生成されたエラーを処理します。 これらの関数は、エラーが検出されたときに呼び出されます _matherr
。 この相互作用は、コンパイラまたは浮動小数点制御ワードの浮動小数点モードの影響を受けません。 ライブラリ関数であるため _matherr
、数学 組み込み関数 では呼び出されません。
特別なエラー処理の場合は、別の _matherr
定義を指定できます。 動的にリンクされたバージョンの C ランタイム ライブラリ (CRT) を使用する場合は、クライアント実行可能ファイルの既定 _matherr
のルーチンをユーザー定義バージョンに置き換えることができます。 ただし、CRT DLL の DLL クライアントの既定 _matherr
のルーチンを置き換えることはできません。
数値演算ルーチンでエラーが発生した場合は、_matherr
引数として型構造体 (で<math.h>
定義) への_exception
ポインターを使用して呼び出されます。 構造体には _exception
、次の要素が含まれています。
struct _exception
{
int type; // exception type - see below
char* name; // name of function where error occurred
double arg1; // first argument to function
double arg2; // second argument (if any) to function
double retval; // value to be returned by function
};
このメンバーは type
、数値演算エラーの種類を指定します。 これは、次で定義 <math.h>
されている次のいずれかの値です。
マクロ | 説明 |
---|---|
_DOMAIN |
引数のドメイン エラー |
_SING |
引数の特異性 |
_OVERFLOW |
オーバーフロー範囲エラー |
_PLOSS |
有効桁の部分的損失 |
_TLOSS |
有効桁の完全損失 |
_UNDERFLOW |
結果が小さすぎて表現できない。 (この条件は現在サポートされていません)。) |
構造体メンバー name
は、エラーの原因となった関数の名前を含む null で終わる文字列へのポインターです。 構造体のメンバー arg1
と、 arg2
エラーの原因となった値を指定します。 引数が 1 つだけ指定されている場合は、arg1
指定されたエラーの既定の戻り値は retval
. 戻り値を変更する場合、戻り値はエラーが実際に発生したかどうかを指定する必要があります。
必要条件
ルーチンによって返される値 | 必須ヘッダー |
---|---|
_matherr |
<math.h> |
互換性の詳細については、「 Compatibility」を参照してください。
例
/* crt_matherr.c
* Illustrates writing an error routine for math
* functions.
* The error handling function must be named _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-01
Special: using absolute value: log10: _DOMAIN error
log10( -5.0 ) = 6.989700e-01
Normal: log( 0.0 ) = -inf
関連項目
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示