给定如下代码段,我只想知道
- 为什么 long double 的最大值在 64 位中小于 32 位?
- 为什么 64 位版本不能像 32 位版本那样扩展尽可能多的数字来填充“40”精度输出?
- 似乎 LDBL_MIN 和 LDBL_MAX 的值相等,这是一个错误吗?
我查看了机器中的 float.h 文件,但找不到这些宏常量的显式定义。
测试代码(平台= Win7-64bit)
#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 的“错误”似乎已删除。