[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.18 クロスコンパイルと浮動小数点

最近の計算機は整数については、全て 2 の補数表現を使っているが、 浮動小数点数の表現の方には色々な種類がある。 このため、クロスコンパイラの場合は、コンパイルしたプログラムの 浮動小数点数表現と、コンパイルを実行したマシンの浮動小数点数表現とでは 異なっていることがある。

表現の仕組みが違うと、表現できる数の範囲と精度も違ってくる可能性が あるので、クロスコンパイラがホストマシンの浮動小数点演算に 頼ることはできない。 このため、浮動小数点定数はターゲットマシンの形式で表現しなければ ならない。このことは、クロスコンパイラは、浮動小数点定数を パースするのに atof を使えないということを意味する。 代わりの専用のルーチンを用意して、それを使う必要がある。 さらに、定数の畳み込みも、ターゲットマシンの演算をエミュレートする 必要がある(あるいは、全く何もしないかである)。

以下の表に示すマクロは、異なる浮動小数点形式の間でクロスコンパイルを 行なう場合にだけ定義すること。

その他の場合には、定義しないこと。 そうすると、デフォルトの定義が設定され、データ型として double を 使う、等しいかどうかのテストには == を使う、等々。

これらのマクロはどれも、そのオペランドを何度使ってもかまわない。 副作用があるオペランドをコンパイラが使うことはないので。

REAL_VALUE_TYPE

ターゲットマシンの形式で浮動小数点値を保持するのに使われる C のデータ型を 表すマクロである。普通は、int の配列を含む struct になる。

REAL_VALUES_EQUAL (x, y)

REAL_VALUE_TYPE 型の二つの値 xy の等価性を 比較する C の式を表すマクロである。

REAL_VALUES_LESS (x, y)

xy より小さいかどうかをテストする C の式を 表すマクロである。 どちらの値も REAL_VALUE_TYPE であり、ターゲットマシンの表現での 浮動小数点数と解釈される。

REAL_VALUE_LDEXP (x, scale)

標準ライブラリ関数 ldexp を実行する C の式を定義するマクロである。 ただし、ターゲット機種の浮動小数点表現を使う。 x とこの式の値はどちらも REAL_VALUE_TYPE 型である。 二番目の引数 scale は整数である。

REAL_VALUE_FIX (x)

ターゲット機種の浮動小数点値 x を符号付き整数に変換する C の式を 定義するマクロである。 x の型は REAL_VALUE_TYPE である。

REAL_VALUE_UNSIGNED_FIX (x)

ターゲット機種の浮動小数点値 x を符号なし整数に変換する C の式を 定義するマクロである。 x の型は REAL_VALUE_TYPE である。

REAL_VALUE_RNDZINT (x)

ターゲット機種の浮動小数点値 x を 0 に向かっての整数値への 丸めを行なう C の式を定義するマクロである。ただし、値は以前として 浮動小数数である。 x とこの値の型は、REAL_VALUE_TYPE である。

REAL_VALUE_UNSIGNED_RNDZINT (x)

ターゲット機種の浮動小数点値 x を 0 に向かっての符号なし整数値への 丸めを行なう C の式を定義するマクロである。ただし、値は以前として 浮動小数数である。 x とこの値の型は、REAL_VALUE_TYPE である。

REAL_VALUE_ATOF (string, mode)

char * 型の式である string を、モード mode の ターゲット機種の浮動小数点数に変換する C の式を定義するマクロである。 この値の型は REAL_VALUE_TYPE である。

REAL_INFINITY

無限大が浮動小数点値として許されており、従って 0 による割り算が 正当なものである場合にこのマクロを定義する。

REAL_VALUE_ISINF (x)

浮動小数点値 x が、無限大かどうかを決定する C の式を定義する。このマクロの値は int 型である。 デフォルトでは、isinf の呼び出しとして定義される。

REAL_VALUE_ISNAN (x)

浮動小数点値 x が、非数 (nan, not-a-number) かどうかを決定する C の式を定義する。このマクロの値は int 型である。 デフォルトでは、isnan の呼び出しとして定義される。

クロスコンパイル時に浮動小数点定数の畳み込みを動作させたいなら、 以下のマクロを定義する。 これらのマクロを定義しない場合は、クロスコンパイルは可能だが、 浮動小数点値については定数畳み込みが行なわれない。

REAL_ARITHMETIC (output, code, x, y)

このマクロは一個の C の文を定義する。 その文では、二つの浮動小数点値 xy の 算術演算を行なう。どちらの型もターゲット機種の表現での REAL_VALUE_TYPE である。 結果も同じ型と同じ表現になり、output に格納され、 後で利用可能になる。

実行されるべき演算は code で指定される。 これは木コードで常に次のどれか一つである。 PLUS_EXPRMINUS_EXPRMULT_EXPRRDIV_EXPRMAX_EXPRMIN_EXPR

このマクロを展開したものは、オーバーフローを検査する責任がある。 オーバーフローが発生下場合は、マクロの展開したものは return 0; という文を実行して、要求された算術演算を 実行することが出来ないことを知らせるべきである。

REAL_VALUE_NEGATE (x)

浮動小数点値 x の符号反転値を返す C の式を表すマクロである。 x とこの式の値はどちらも REAL_VALUE_TYPE 型で、 ターゲット機種の浮動小数点表現である。

このマクロではオーバーフローを知らせる方法はない。 符号反転演算ではオーバーフローは起きないからである。

REAL_VALUE_TRUNCATE (mode, x)

浮動小数点数値 x をモード mode に変換する C の式を 定義するマクロである。

x とこの式の値はどちらも、ターゲット機種の浮動小数点表現であり、 REAL_VALUE_TYPE 型である。 ただし、その値は、モード mode の精度を持つ浮動小数点定数として 正しく出力されるビットパターンになっている必要がある。

このマクロは、オーバーフローを報告する機能を持たない。

REAL_VALUE_TO_INT (low, high, x)

浮動小数点数値 x を倍精度整数に変換し、二つの int 型の 変数、lowhigh に格納する C の式を定義するマクロである。

REAL_VALUE_FROM_INT (x, low, high, mode)

二つの int 型変数 lowhigh に格納されている 倍精度整数を浮動小数点数値に変換し、x に格納する C の式を 定義するマクロである。


This document was generated using texi2html 1.78.