_matherr_matherr

数値演算エラーを処理します。Handles math errors.

構文Syntax

int _matherr( struct _exception * except );

パラメーターParameters

exceptexcept
エラー情報を保持する構造体へのポインター。Pointer to the structure containing error information.

戻り値Return Value

_matherrは0を返し、エラーを示します。または、成功を示す0以外の値を返します。_matherr returns 0 to indicate an error, or a nonzero value to indicate success. _Matherrが0を返した場合は、エラーメッセージが表示され、 errnoに適切なエラー値が設定されます。If _matherr returns 0, an error message can be displayed and errno is set to an appropriate error value. _Matherrが0以外の値を返す場合、エラーメッセージは表示されず、 errnoは変更されません。If _matherr returns a nonzero value, no error message is displayed and errno remains unchanged.

リターン コードの詳細については、「errno、_doserrno、_sys_errlist、および _sys_nerr」を参照してください。For more information about return codes, see _doserrno, errno, _sys_errlist, and _sys_nerr.

RemarksRemarks

_Matherr関数は、数値演算ライブラリの浮動小数点関数によって生成されるエラーを処理します。The _matherr function processes errors generated by the floating-point functions of the math library. これらの関数は、エラーが検出されたときに _matherrを呼び出します。These functions call _matherr when an error is detected.

特別なエラー処理の場合は、 _matherrの別の定義を指定できます。For special error handling, you can provide a different definition of _matherr. 動的にリンクされたバージョンの C ランタイムライブラリ (CRT) を使用する場合は、クライアント実行可能ファイルの既定の _matherrルーチンをユーザー定義のバージョンに置き換えることができます。If you use the dynamically linked version of the C run-time library (CRT), you can replace the default _matherr routine in a client executable with a user-defined version. ただし、CRT DLL の DLL クライアントで既定の _matherrルーチンを置き換えることはできません。However, you cannot replace the default _matherr routine in a DLL client of the CRT DLL.

数値演算ルーチンでエラーが発生した場合、_matherr は引数として例外の型構造 ( > <で定義) へのポインターを使用して呼び出されます。When an error occurs in a math routine, _matherr is called with a pointer to an _exception type structure (defined in <math.h>) as an argument. _exception 構造体には次の要素が含まれます。The _exception structure contains the following elements.

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
};

のメンバーは、数値演算エラーの種類を指定します。The type member specifies the type of math error. 次の値のいずれかになります。 <この値は、> で定義されています。It is one of the following values, defined in <math.h>:

マクロMacro 説明Meaning
_DOMAIN_DOMAIN 引数ドメインエラーArgument domain error
通知 (_R)_SING 引数の特異点Argument singularity
_OVERFLOW_OVERFLOW オーバーフロー範囲エラーOverflow range error
コピー (_C)_PLOSS 有意性の部分的な損失Partial loss of significance
_TLOSS_TLOSS 有意性の損失の合計Total loss of significance
アンダーフロー (_S)_UNDERFLOW 結果が小さすぎて表現できない。The result is too small to be represented. (この条件は現在サポートされていません。)(This condition is not currently supported.)

構造体のメンバー name は、エラーの原因となった関数の名前を含む null で終わる文字列へのポインターです。The structure member name is a pointer to a null-terminated string containing the name of the function that caused the error. 構造体のメンバー arg1arg2 は、エラーの原因となった値を指定します。The structure members arg1 and arg2 specify the values that caused the error. 引数を1つだけ指定した場合は、 arg1に格納されます。If only one argument is given, it is stored in arg1.

発生したエラーの既定の戻り値は retval です。The default return value for the given error is retval. 戻り値を変更する場合、戻り値はエラーが実際に発生したかどうかを指定する必要があります。If you change the return value, it must specify whether an error actually occurred.

必要条件Requirements

ルーチンによって返される値Routine 必須ヘッダーRequired header
_matherr_matherr <math.h><math.h>

互換性の詳細については、「 互換性」を参照してください。For more compatibility information, see Compatibility.

Example

// 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-01
Special: using absolute value: log10: _DOMAIN error
log10( -5.0 ) = 6.989700e-01
Normal: log( 0.0 ) = -inf

関連項目See also

浮動小数点サポートFloating-Point Support