C99に対応した標準Cライブラリの実装レポートを行っていきます。

プロフィール 

Author:高木信尚

ホームページ
ブログ

最近の記事 

最近のコメント 

最近のトラックバック 

月別アーカイブ 

カテゴリー 

ブロとも申請フォーム 

この人とブロともになる

ホーム 全記事一覧 << 前の記事 次の記事 >>

 

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:0CM:0

コメント
コメントの投稿

管理者にだけ表示を許可する


トラックバック
トラックバックURLはこちら
http://libc.blog47.fc2.com/tb.php/12-3b511e61

ホーム 全記事一覧 << 前の記事 次の記事 >>

ブログ内検索 

お勧め書籍 

RSSフィード 

リンク 

このブログをリンクに追加する

Powered By FC2ブログ 

Powered By FC2ブログ
ブログやるならFC2ブログ

Copyright(C) 2006 TAKAGI Nobuhisa All rights reserved.
Powered by FC2ブログ. 無料ホームページ アフィリエイト レンタルサーバー FC2ブログ 一戸建て template designed by 遥かなるわらしべ長者への挑戦.