マニュアルページ 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 に設 定
     されます。