float.h のテスト結果がおかしい
float.h をテストするため、次のようなプログラムを作りました。
float.h に書かれている値が書き出されると思ったのですが、少し値が違います。
FLT_MAX と DBL_MAX の値が違っています。本当にこのヘッダファイルを読んでいるかと思い、
#define FLT_MAX 3.4e+3f と変更すれば、
Max= 3.400000000000000000E+03 と出てきます。
一致しない原因は何でしょう。
コンパイラはルネサスのHEWで、CPUはH8/3052です。
*** float.h ***
#define FLT_MAX 3.4028235677973364e+38f
#define FLT_MIN 1.175494351e-38F
#define DBL_MAX 1.7976931348623158e+308
#define DBL_MIN 2.2250738585072014e-308
*** プログラム ***
sprintf(str," float :%ldBytes Max= %.18E Min= %.18E\r\n", sizeof(float), FLT_MAX, FLT_MIN) ;
Put_str(str) ;
sprintf(str," double:%ldBytes Max= %.18E Min= %.18E\r\n", sizeof(double), DBL_MAX, DBL_MIN) ;
Put_str(str) ;
*** 結果 ***
float :4Bytes Max= 3.402823466385288600E+38
Min= 1.175494350822287500E-38
double:8Bytes Max= 1.797693134862315700E+308
Min= 2.225073858507201400E-308
*** まとめて整理 ***
元の原稿は比較し易いように縦に数字が並ぶように書いているのですが、
ここに書き込むとずれてしまいます。
#define FLT_MAX 3.4028235677973364e+38f
Max= 3.402823466385288600E+38
FLT_MIN に比べ有効桁数が多いのが気になる。
同じ有効桁数で区切っても ...567 と ...466 とでは誤差が大きい。
FLT_MAX 3.402823567 7973364e+38f
Max= 3.402823466 385288600E+38
FLT_MIN 1.175494351e-38F
#define FLT_MIN 1.175494351e-38F
Min= 1.175494350822287500E-38
四捨五入なら分かる。
#define DBL_MAX 1.7976931348623158e+308
Max= 1.797693134862315700E+308
最後が8と7で違う。しかし、DBL_MAX は8バイトで表せる値に対して四捨五入したために7が8になったと考えれば納得出来る。
#define DBL_MIN 2.2250738585072014e-308
Min= 2.225073858507201400E-308
ピッタリ合っている
宜しくお願いします。
お礼
ありがとうございます。 参考になりました。