MATHTRAP(3M) — UNIX Programmer’s Manual
名称
mathtrap − 浮動小数点例外トラップを使用可能/不能にする
形式
#include <math.h>
int mathtrap(flags)
int flags;
解説
この関数は、 浮動小数点例外トラップの使用をイネーブル(enable)または ディセーブル(disable)にする フラグをセットします。flags は、<math.h> 内に定義されている フラグの論理的ORで指定されます。mathtrap は、flags の以前の値を 返します。
<math.h>のフラグ名と例外名は、 次のとおりです。
例外<math.h>
アンオーダード数をBranch/Setに使ったFPET_BSUNO
イリーガル数(NaN)FPET_SGNAN
オペランドエラーFPET_OPERR
オーバーフロー FPET_OVFLW
アンダーフロー FPET_UNDFL
ゼロ除算 FPET_DIVZR
不明 FPET_INEXA
たとえば、“オペランドエラー”および“ゼロ除算”の 例外トラップを使用可能にするためには、 次のように呼び出します。
mathtrap(FPET_OPERR | FPET_DIVZR);
すべての浮動小数点例外トラップを 使用不能にする(これはデフォルトの状態)ためには、 次のように呼び出します。
mathtrap(FPET_CLEAR);
IEEE 754の“Invalid Operation (無効なオペレーション)”を 指定するためには、 次のように呼び出します。
mathtrap(FPET_INVOP);
ここで、FPET_INVOPは、 FPET_BSUNO | FPET_SGNAN | FPET_OPERRと同じです。
トラップハンドラは、signal(3)関数を用いて指定されます。 すべての浮動小数点例外トラップのシグナル番号はSIGFPEであり、 これは“<signal.h>”に定義されています。 シグナルナンバーは、次のとおりです。
例外シグナルコード(<signal.h>)
アンオーダード数をBranch/Setに使ったFPE_UNORDERED_TRAP
イリーガル数(NaN) FPE_SNAN_TRAP
オペランドエラーFPE_OPERAND_TRAP
オーバーフロー FPE_OVERFLOW_TRAP
アンダーフロー FPE_UNDERFLOW_TRAP
ゼロ除算 FPE_DIVZERO_TRAP
不明 FPE_INEXACT_TRAP
各種の例外を認識するサンプルの トラップハンドラを以下に示します。
#include <math.h>
#include <signal.h>
main()
{
int handler();
/∗
∗Set up exception handler
∗/
mathtrap(FPET_INVOP | FPET_OVFLW |
FPET_DIVZR | FPET_UNDFL);
signal(SIGFPE ,handler);
.
.
.
}
/∗
∗Exception handler
∗/
handler(sig, code)
int sig, code;
{
switch (code) {
case FPE_UNORDERED_TRAP :
/∗
∗Branch/Set on Unordered TRAP
∗/
break;
case FPE_SNAN_TRAP :
/∗
∗Signaling NaN (Not a Number)
∗/
break;
case FPE_OPERAND_TRAP :
/∗
∗Operand error TRAP
∗/
break;
case FPE_OVERFLOW_TRAP :
/∗
∗Over Flow
∗/
break;
case FPE_UNDERFLOW_TRAP :
/∗
∗Under Flow
∗/
break;
case FPE_DIVZERO_TRAP :
/∗
∗Divide by 0
∗/
break;
case FPE_INEXACT_TRAP :
/∗
∗Inexact TRAP
∗/
break;
}
.
.
.
}
関連事項
MOTOROLA "MC68881/MC68882 Floating−Point Coprocessor User’s Manual"
intro(3), math(3m)
関連ファイル
/usr/include/math.h
/usr/include/signal.h
NEWS-OSRelease 3.3