IEEE_FLAGS(3M)

名前
ieee_flags - IEEE 標準算術機構のモードおよびステータス関数

形式

cc [ flag ... ] file ... -lsunmath -lm [ library ... ]

#include <sunmath.h>

int ieee_flags(const char *action, const char *mode, const char *in, char **out);

機能説明

この関数により、C プログラム中で ANSI/IEEE 規格 754-1985 の算術機構を有効に利用するために必要な モードおよびステータスへ簡単にアクセスすることができます。 指定する引数は、すべて文字列へのポインタです。 処理効率を考慮し、無効な引数または無効な組み合わせの 引数を指定した場合の結果は未定義です。

引数 action には、``get''、``set''、``clear''、``clearall'' のいずれかを指定できます。 引数 mode には 3 種類のモードの指定が可能で、 そのうちの 2 つは IEEE 算術機構のモードに対応しています。

    ``direction'',		... 現在の丸め方向モード
    ``precision'',		... 現在の丸め精度モード

もう 1 つは IEEE 算術機構のステータスに対応しています。

    ``exception''. 		... 存続例外発生ステータス

引数 in および out には、次の 14 種類の値が指定できます。

    ``nearest'',		... 最も近い値への丸め
    ``tozero'', 		... ゼロ方向への丸め
    ``negative'',		... 負の無限大方向の丸め
    ``positive'',		... 正の無限大方向の丸め
    ``extended'',
    ``double'',
    ``single'',
    ``inexact'',
    ``division'', 		... ゼロ除算例外
    ``underflow'',
    ``overflow'',
    ``invalid'',
    ``all'',			... 上記 5 種類の例外のすべて
    ``common''. 		... 無効な演算、オーバーフロー、ゼロ除算の共通例外

注意 : ``all'' および ``common'' には、 ``set'' または ``clear'' を指定した場合にだけ意味を持ちます。

``clearall'' を指定した場合、 ieee_flags() の戻り値は 0 で、モードとステータスはすべてデフォルト値に設定されます。 out には何も代入されません。 たとえば、

    char *mode, *out, *in;
    ieee_flags("clearall",mode, in, &out);

とすると、 丸め方向が ``nearest''、 丸め精度が ``extended''、 存続例外発生ステータスがゼロに設定されます。

``clear'' を指定すると、 ieee_flags() の戻り値はゼロで、モードとステータスはデフォルト値に設定されます。 out には何も代入されません。 たとえば、

    char *out, *in;
    ieee_flags("clear","direction", in, &out);       ...

とすると丸め方向が ``nearest'' に設定されます。

``set'' を指定すると、 ieee_flags() の戻り値は、指定したアクションが正常に終了した場合は 0、 対応するステータスまたはモードが利用できない (たとえば、 ハードウェアでサポートされていない) 場合は 1 になります。 out には何も代入されません。 たとえば、

    char *out, *in;
    ieee_flags ("set","direction","tozero",&out);	...

とすると、丸め方向がゼロ方向に設定されます。

``get'' を指定すると、 次のような状況が考えられます。

状況 1: mode が ``direction'' のとき、 out には ``nearest''、``tozero''、``positive''、``negative'' の いずれかの文字列が代入されます。 ieee_flags() は、 <sys/ieeefp.h> で定義されている列挙型 fp_direction_type に従って、 out に対応する値を返します。

状況 2: mode が ``precision'' のとき、 out には ``extended''、``double''、``single'' のいずれかの文字列が代入されます。 ieee_flags() は、 <sys/ieeefp.h> で定義されている列挙型 fp_precision_type に従って、 out に対応する値を返します。

状況 3: mode が ``exception'' のとき、 out には次のいずれかの文字列が代入されます。

    (a)  ``not available'' - 例外に関する情報が得られない場合
    (b) ``'' (空の文字列) - 存続例外がない場合
    (c) 例外のうち次に示す優先順位で一番高いもの

         (1) in により指定された例外
         (2) ``invalid''
         (3) ``overflow''
         (4) ``division''
         (5) ``underflow''
         (6) ``inexact''

この場合、 ieee_flags() は、5 または 6 ビットで構成される値を返します。 各ビットは個々の例外発生存続ステータスフラグに対応し、 0 はオフ、1 はオンを表します ( <sys/ieeefp.h> の列挙型 fp_exception_type を参照)。 特定の例外に対応するビットは アーキテクチャによって異なります ( /usr/include/sys/ieeefp.h を参照)。

例 :

    extern int ieee_flags(const char *, const char *, const char *, char **);
    char *out;
    int k;
    ieee_flags ("clear","exception","all",&out);	/* すべての存続例外をクリア */
    ...
    ... (3 つの例外を生成するコード: overflow, invalid, inexact)
    ...
    k = ieee_flags("get","exception","overflow",&out);

このコードを実行すると、 out は ``overflow''、 k は 25 に設定されます。