- ベストアンサー
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 ピッタリ合っている 宜しくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
その他の回答 (4)
- chie65536(@chie65535)
- ベストアンサー率44% (8812/19983)
- chie65536(@chie65535)
- ベストアンサー率44% (8812/19983)
- jacta
- ベストアンサー率26% (845/3158)
- php504
- ベストアンサー率42% (926/2160)
お礼
回答有り難う御座います。 HEWのマニュアルに浮動小数点数の仕様が書いて有りました。 それから最大値を計算すると、次のようになりました。 16777215 * 2^104 = 3.402823466 3852885981170418348452e+38 すると、次の値が妥当のようです。 #define FLT_MAX 3.402823466e+38F 更に最大値の次の値は下のようになりました。 16777215 * 2^104 = 3.402823466 3852885981170418348452e+38 最大値 16777214 * 2^104 = 3.402823263 5611925616003375953727e+38 最大値の次の値 3.402823466 と 3.402823263 の差が大きいのが分かります。 これで、次の疑問も解けました。 ---------------------------- FLT_MIN に比べ有効桁数が多いのが気になる。 同じ有効桁数で区切っても ...567 と ...466 とでは誤差が大きい。 FLT_MAX 3.402823567 7973364e+38f Max= 3.402823466 385288600E+38 FLT_MIN 1.175494351e-38F ---------------------------- まだ次のように、実験結果が今までの計算と合っているのに、HEWの ヘッダの値が他と違うと言う疑問が残りますが、大体の疑問が解けました。 みなさん、有り難う御座いました。 #define FLT_MAX 3.402823567 7973364e+38f HEW 実験結果 Max= 3.402823466 385288600E+38