次の方法で共有


_matherr

数値演算エラーを処理します。

構文

int _matherr(struct _exception *except);

パラメーター

except
エラー情報を保持する構造体へのポインター。

戻り値

_matherr は、エラーを示す場合は 0 を返し、成功を示す場合は 0 以外の値を返します。

  • _matherr 0 が返された場合は、エラー メッセージを表示し、errnoが適切なエラー値に設定されます。
  • _matherrが 0 以外の値を返した場合、エラー メッセージは表示されず、errnoは変更されません。

リターン コードの詳細については、「errno_doserrno_sys_errlist、および _sys_nerr」を参照してください。

解説

_matherr関数は、数学ライブラリの浮動小数点関数によって生成されたエラーを処理します。 これらの関数は、エラーが検出されたときに _matherr を呼び出します。 この相互作用は、コンパイラの 浮かび上がりポイント モード または 浮き上がりポイント制御ワードの影響を受け_matherrはライブラリ関数であるため、数学intrinsic 関数はそれを呼び出しません。

特別なエラー処理の場合は、 _matherrの別の定義を指定できます。 動的にリンクされたバージョンの C ランタイム ライブラリ (CRT) を使用する場合は、クライアント実行可能ファイルの既定の _matherr ルーチンをユーザー定義バージョンに置き換えることができます。 ただし、CRT DLL の DLL クライアントで既定の _matherr ルーチンを置き換えることはできません。

数値演算ルーチンでエラーが発生すると、 _matherr は引数として _exception 型構造体 ( <math.h> で定義) へのポインターを使用して呼び出されます。 _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

関連項目

数値演算と浮動小数点のサポート