EN JA
FPGETROUND(3)
FPGETROUND(3) FreeBSD Library Functions Manual FPGETROUND(3)

名称

fpgetround, fpsetround, fpsetprec, fpgetprec, fpgetmask, fpsetmask, fpgetsticky, fpresetstickyIEEE 浮動小数点インタフェース

書式

#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 を利用するようにコンパイルされるとき、無効であるかもしれません、そして、多くのライブラリ関数とコンパイラの最適化は、正しい振る舞いのためのデフォルトの精度に依存します。

関連項目

fenv(3), isnan(3)

歴史

このルーチンは、同じ名前の SysV/386 ルーチンに基づいています。

警告

浮動小数点例外の後で、マスクが設定される前に、スティッキフラグは、リセットされなければなりません。スティッキフラグがリセットされる前に、別の例外が発生したなら、間違った例外タイプのシグナルが送られるかもしれません。
December 3, 2010 FreeBSD