次の方法で共有


_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 arg1arg2
    関数の最初の引数と (存在する場合は) 2 番目の引数。

  • double retval
    関数から返される値。

type では、数値演算エラーの種類を指定します。Math.h で定義された、次のいずれかの値をとります。

  • _DOMAIN
    引数のドメイン エラー。

  • _SING
    引数が無効。

  • _OVERFLOW
    オーバーフローが発生。

  • _PLOSS
    有効桁数の一部が失われた。

  • _TLOSS
    有効桁数のすべてが失われた。

  • _UNDERFLOW
    結果が小さすぎるため表現できない。この条件は、現在サポートされていません。

構造体メンバ name は、エラーが発生した関数名を含む NULL で終わる文字列へのポインタです。構造体メンバ arg1arg2 には、エラーの原因となった値が格納されます。引数が 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 を使用します。詳細については、「プラットフォーム呼び出しの例」を参照してください。

参照

参照

浮動小数点サポート

Long Double 型