曾经的一道题目中,用double定义,输出结果仍然不准确,精度不够! double表示的范围是-2^1024 ~ +2^1024,也即-1.79E+308 ~ +1.79E+308。虽然double表示的范围很大,但是仍不能正常输出,其原因是double表示的范围不能精确表示要走输出的值。
在网上找过相关的资料,但不能完全看明白!内容具体如下:
本文为原创,转载请保留出处以及作者, 谢谢
C语言和C#语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit, double数据占用64bit,我们在声明一个变量float f= 2.25f的时候,是如何分配内存的呢?如果胡乱分配,那世界岂不是乱套了么,其实不论是float还是double在存储方式上都是遵从IEEE的规范 的,float遵从的是IEEE R32.24 ,而double 遵从的是R64.53。
无论是单精度还是双精度在存储中都分为三个部分:
- 符号位(Sign) : 0代表正,1代表为负
- 指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储
- 尾数部分(Mantissa):尾数部分
其中float的存储方式如下图所示:
而双精度的存储方式为: