|
|
|
| 2008/10/07 11:41||▲
|
|
|
今回は、浮動小数点数の特性を表すマクロを定義する<float.h>についてお話します。"h8300-hms"ターゲットの場合、double型もlong double型も、すべてfloat型と同じ精度しか持ちませんので、DBL_〜マクロもLDBL_〜マクロも、定義すべき値は、対応するFLT_〜マクロと同じになります。ただし、正しい型として評価されるように、FLT_〜マクロには 'F' を、LDBL_〜マクロには 'L' を添え字として付ける必要がありそうです。
と、このように考えていたのですが、gccでは、それらのマクロを定義するために、"__"を前後に付けたマクロが予め定義されているようです。例えば、FLT_MAXの場合、それに対応する__FLT_MAX__が予め定義されているようなのです。
これで、<float.h>の実装は非常に簡単になります。
#define FLT_DIG __FLT_DIG__ #define FLT_EPSILON __FLT_EPSILON__ #define FLT_MANT_DIG __FLT_MANT_DIG__ #define FLT_MAX_10_EXP __FLT_MAX_10_EXP__ #define FLT_MIN_10_EXP __FLT_MIN_10_EXP__ #define FLT_MAX_EXP __FLT_MAX_EXP__ #define FLT_MIN_EXP __FLT_MIN_EXP__ #define FLT_MAX __FLT_MAX__ #define FLT_MIN __FLT_MIN__
それぞれのマクロの意味については、(C++用ではありますが)こちらを参照してください。DBL_〜マクロやLDBL_〜マクロについても、上記の同じように定義できますので、ここでは省略します。
他にもいくつかのマクロを定義する必要があります。
#define FLT_RADIX __FLT_RADIX__ #define FLT_EVAL_METHOD __FLT_EVAL_METHOD__ #define DECIMAL_DIG __DECIMAL_DIG__
このうち、FLT_EVAL_METHODとDECIMAL_DIGは、C99から新たに導入されたマクロです。<limits.h>のLLONG_MAXなどもそうだったのですが、C99より前のC言語では、これらのマクロをヘッダ内で定義するのは厳密には規格に反しているのですが、機能を制約して厳密に規格合致させるより、そのまま提供した方が便利なので、そうしています。__STRICT_ANSI__マクロを調べて場合分けしてもよいのですが、とりあえずはやめておきます。
FLT_EVAL_METHODは、浮動小数点の演算をどのような範囲と精度で行うかを表すもので、以下のような値をとります。
-1 不定 0 演算や定数の評価を、それぞれの型の範囲・精度で行う。 1 floatとdoubleはdoubleの、long doubleはlong doubleの範囲・精度で行う。 その他 上記以外の負の値は処理系定義。
DECIMAL_DIGは、処理系がサポートする最も大きい浮動小数点型の値を、いったん n 桁の10進数にしてから、また元に戻したときに、情報が失われない最小の n を表します。
もう一つだけマクロを定義しなければなりません。それはFLT_ROUNDSです。これは、gccの浮動小数点演算用のサブルーチンの仕様に依存しますが、もっとも近い値となる方向へ丸めるようなので 1 に定義します。
#define FLT_ROUNDS 1
これで、<float.h>の内容は一通り網羅できたと思います。
|
| 2006/01/25 12:02|処理系の特性|TB:0|CM:0|▲
|
|
|
コメント
|
|
コメントの投稿
|
|
|
|
|
トラックバック
|
トラックバックURLはこちら
http://libc.blog47.fc2.com/tb.php/12-3b511e61
|
|
|
|
|
ホーム
全記事一覧
<< 前の記事
次の記事 >>
|