_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 * 名稱
在發生錯誤的函式名稱。雙精度浮點 arg1, arg2 參數
第一個和第二個 (如果有的話) 函式的引數。雙精度浮點 retval
函式所傳回的值。
型別指定的數學錯誤類型。它是一個下列的值,Math.h 所述。
_DOMAIN
引數的網域錯誤。_SING
引數異常。_OVERFLOW
溢位範圍錯誤。_PLOSS
重要的部分的損失。_TLOSS
總損失的重要性。_UNDERFLOW
結果會太小,無法表示。(這種情況是不目前支援。
結構成員名稱是以 null 結束的字串,包含造成錯誤的函式名稱的指標。結構成員 arg1 和 arg2 參數了造成錯誤的值。(如果只指定一個引數,則會儲存在 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。 如需詳細資訊,請參閱平台叫用範例。