回复 3楼 换空依晨
晕,你改代码了,我记得原来写的是 long,而不是 long double。
“long double 的精度有16个字节 吧 2^16 ”
------ 这都是哪些家伙瞎说的呀?!我已经晕了,平静的讲:
首先,C/C++没有规定long double占多少位,只要不比double少就行。原话是:
The set of values of the type float is a subset of the set of values of the type double;
the set of values of the type double is a subset of the set of values of the type long double.
其次,long double 参照来源于80387 FPU中的80bits临时实数类型,也就是编译器一般将long double设为10字节。
之所以说“一般”,是因为上面已经讲过,C/C++标准没有做任何强制规定。比如 VC++5.0之后,VC的long double其实只有8bytes,和double是一样的;gcc的long double占12bytes,虽然起作用的只有10bytes。
其次,即使“long double 的精度有16个字节”,那也应该是小于 2^(16*8) 呀,2^16等于65536你知道不?
另外,即便是16个字节,那也只代表其『最多』能表达出2^(16*8)个不同的数值,何其取值范围是无关的。
最后,我不知道你说的“精度”指什么鸟玩意儿,猜吧
float的尾数有23bits,及1个隐藏位,因此 log(2^24)=7.22,所以有人说float有效位数是7个
double的尾数有52bits,及1个隐藏位,因此 log(2^53)=15.95,所以有人说double有效位数是16个
long double的尾数有64bits,无隐藏位,因此 log(2^64)=19.26,所以有人说long double有效位数是19个