建議使用 Visual Studio 2017

_matherr

 

如需 Visual Studio 2017 的最新文件請參閱 Visual Studio 2017 文件

處理數學錯誤。

  
      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例行 Msvcr90.dll 的 DLL 用戶端中。

數學常式,_ 中發生的錯誤matherr的指標呼叫_exception輸入結構 (定義於 h.h) 做為引數。 _Exception結構包含下列項目。

int 型別
例外狀況類型。

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

double arg1arg2
第一個和第二個 (如果有的話) 至函式的引數。

double retval
函數所傳回的值。

類型指定的數學錯誤類型。 它是下列值,h.h 中定義的其中一個。

_DOMAIN
引數網域時發生錯誤。

_SING
引數獨一性。

_OVERFLOW
溢位範圍錯誤。

_PLOSS
部分遺失精確度。

_TLOSS
總遺失精確度。

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

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

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

常式必要的標頭
_matherr<math.h>

如需更多的相容性資訊,請參閱<簡介>中的 Compatibility

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

不適用。 若要呼叫標準 C 函式,請使用 PInvoke。 如需詳細資訊,請參閱 平台叫用範例

浮點支援
長雙精度

顯示: