次のようなコードセグメントを考えると、私は知りたいだけです
- long doubleの最大値が32ビットより64ビットの方が小さいのはなぜですか?
- なぜ64ビットバージョンは「40」精度の出力を満たすために32ビットバージョンほど多くの桁を拡張できないのですか?
- LDBL_MINとLDBL_MAXの値が等しいようですが、それはバグですか?
マシンのfloat.hファイルを調べましたが、これらのマクロ定数の明示的な定義が見つかりません。
テストコード(プラットフォーム= Win7-64ビット)
#include <cfloat>
#include <iomanip>
cout<<"FLT_MAX ="<< setprecision(40) << FLT_MAX << endl;
cout<<"DBL_MAX ="<< setprecision(40) << DBL_MAX << endl;
cout<<"LDBL_MAX ="<< setprecision(40) << LDBL_MAX << endl;
cout<<"FLT_MIN ="<< setprecision(40) << FLT_MIN << endl;
cout<<"DBL_MIN ="<< setprecision(40) << DBL_MIN << endl;
cout<<"LDBL_MIN ="<< setprecision(40) << LDBL_MIN << endl;
32ビットの結果(MinGW-20120426)
FLT_MAX =340282346638528859811704183484516925440
DBL_MAX =1.797693134862315708145274237317043567981e+308
LDBL_MAX =1.189731495357231765021263853030970205169e+4932
FLT_MIN =1.175494350822287507968736537222245677819e-038
DBL_MIN =2.225073858507201383090232717332404064219e-308
LDBL_MIN =3.362103143112093506262677817321752602598e-4932
64ビットの結果(MinGW64-TDM 4.6)
FLT_MAX =340282346638528860000000000000000000000
DBL_MAX =1.7976931348623157e+308
LDBL_MAX =1.132619801677474e-317
FLT_MIN =1.1754943508222875e-038
DBL_MIN =2.2250738585072014e-308
LDBL_MIN =1.132619801677474e-317
ありがとう。
[編集]:最新のMinGW64-TGM 4.7.1を使用すると、LDBL_MAX、LDBL_MINの「バグ」が削除されたようです。