FPGETROUND(3) | FreeBSD Library Functions Manual | FPGETROUND(3) |
名称
fpgetround, fpsetround, fpsetprec, fpgetprec, fpgetmask, fpsetmask, fpgetsticky, fpresetsticky — IEEE 浮動小数点インタフェース書式
#include < ieeefp.h>
typedef enum { FP_RN, /* 最も近い値に丸める */ FP_RM, /* マイナスの無限まで端数を切り捨てる */ FP_RP, /* プラスの無限まで端数を切り上げる */ FP_RZ /* 切り捨て */ } fp_rnd_t;
fp_rnd_t
fpgetround( void);
fp_rnd_t
fpsetround( fp_rnd_t direction);
typedef enum { FP_PS, /* 24 ビット (単精度) */ FP_PRS, /* リザーブ */ FP_PD, /* 53 ビット (倍精度) */ FP_PE /* 64 ビット (拡張精度) */ } fp_prec_t;
fp_prec_t
fpgetprec( void);
fp_prec_t
fpsetprec( fp_prec_t precision);
#define fp_except_t int #define FP_X_INV 0x01 /* 不正操作 */ #define FP_X_DNML 0x02 /* 非正規 */ #define FP_X_DZ 0x04 /* 0 除算 */ #define FP_X_OFL 0x08 /* オーバフロー */ #define FP_X_UFL 0x10 /* アンダフロー */ #define FP_X_IMP 0x20 /* (不)正確 */ #define FP_X_STK 0x40 /* スタックフォルト */
fp_except_t
fpgetmask( void);
fp_except_t
fpsetmask( fp_except_t mask);
fp_except_t
fpgetsticky( void);
fp_except_t
fpresetsticky( fp_except_t sticky);
解説
ここに説明されたルーチンは、推奨されません。新しいコードは、 fenv(3) によって提供された機能を使用するべきです。浮動小数点例外が検出されるとき、例外スティッキ (sticky) フラグが、設定され、例外マスクが、テストされます。マスクが設定されるなら、トラップが発生します。これらのルーチンによって、浮動小数点例外マスクを設定し、例外が検出された後に例外スティッキフラグをリセットできます。さらに、それらは、浮動小数点の丸めモードと精度を設定できます。
fpgetround() 関数は、現在の浮動小数点の丸めモードを返します。
fpsetround() 関数は、浮動小数点の丸めモードを設定し、前のモードを返します。
fpgetprec() 関数は、現在の浮動小数点の精度を返します。
fpsetprec() 関数は、浮動小数点の精度を設定し、前の精度を返します。
fpgetmask() 関数は、現在の浮動小数点の例外マスクを返します。
fpsetmask() 関数は、浮動小数点の例外マスクを設定し、前のマスクを返します。
fpgetsticky() 関数は、現在の浮動小数点のスティッキフラグを返します。
fpresetsticky() 関数は、浮動小数点のスティッキフラグをクリアし、前のフラグを返します。
0 除算でトラップを防ぐサンプルコードは、次の通りです:
fpsetmask(~FP_X_DZ); a = 1.0; b = 0; c = a / b; fpresetsticky(FP_X_DZ); fpsetmask(FP_X_DZ);
実装に関する注
fpgetprec() と fpsetprec() 関数は、多くのプラットフォームで利用不可能な機能を提供します。現在のところ、それらは、i386 と amd64 プラットフォームだけで実装されています。精度を変更することは、サポートしている機能ではありません: コードが SSE を利用するようにコンパイルされるとき、無効であるかもしれません、そして、多くのライブラリ関数とコンパイラの最適化は、正しい振る舞いのためのデフォルトの精度に依存します。歴史
このルーチンは、同じ名前の SysV/386 ルーチンに基づいています。警告
浮動小数点例外の後で、マスクが設定される前に、スティッキフラグは、リセットされなければなりません。スティッキフラグがリセットされる前に、別の例外が発生したなら、間違った例外タイプのシグナルが送られるかもしれません。December 3, 2010 | FreeBSD |