共用方式為


_matherr

處理算術錯誤。

int _matherr(
   struct _exception *except 
);

參數

  • 除了
    包含錯誤資訊的結構指標。

傳回值

_matherr 會傳回 0,表示非零值以指示成功或錯誤。 如果 _matherr 可以顯示傳回 0,錯誤訊息和errno設定為適當的錯誤值。 如果 _matherr 傳回非零的值,沒有任何錯誤訊息會顯示與errno會保持不變。

多個傳回碼的詳細資訊,請參閱 _doserrno、 errno、 _sys_errlist,以及 _sys_nerr

備註

_Matherr 函式處理浮點函式的數學程式庫所產生的錯誤。 這些函式呼叫 _matherr 偵測到錯誤時。

特殊的錯誤處理,您可以提供不同的定義 _ 的matherr。 如果您使用 c 執行階段程式庫 (Msvcr90.dll) 的動態連結的版本時,您可以取代預設 _matherr 例行用戶端可執行與使用者定義的版本中。 不過,您不能取代預設的**_matherr**常式 DLL 的用戶端 Msvcr90.dll 中。

當錯誤發生在數學常式,_matherr 變數的指標,以呼叫 _exception 輸入做為引數的結構 (如 Math.h 所述)。 _Exception 結構包含下列項目。

  • int 型別
    例外狀況型別。

  • char * 名稱
    在發生錯誤的函式名稱。

  • 雙精度浮點 arg1arg2 參數
    第一個和第二個 (如果有的話) 函式的引數。

  • 雙精度浮點 retval
    函式所傳回的值。

型別指定的數學錯誤類型。 它是一個下列的值,Math.h 所述。

  • _DOMAIN
    引數的網域錯誤。

  • _SING
    引數異常。

  • _OVERFLOW
    溢位範圍錯誤。

  • _PLOSS
    重要的部分的損失。

  • _TLOSS
    總損失的重要性。

  • _UNDERFLOW
    結果會太小,無法表示。 (這種情況是不目前支援。

結構成員名稱是以 null 結束的字串,包含造成錯誤的函式名稱的指標。 結構成員 arg1arg2 參數了造成錯誤的值。 (如果只指定一個引數,則會儲存在 arg1。)

預設值會傳回指定的錯誤值是 retval。 如果您變更傳回的值,則必須指定是否確實發生錯誤。

需求

常式

所需的標頭

_matherr

<math.h>

如需相容性資訊,請參閱相容性在簡介中。

文件庫

所有版本的 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 */
}

Output

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。 如需詳細資訊,請參閱平台叫用範例

請參閱

參考

浮點支援

長雙