float,double精度

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/asdfgggggggg/article/details/73480486

Double与float类型

(1)基本存储方式:与int、long存储方式不同,double与float在内存中是以符号位、指数位与尾数位三部分进行存储的,其中符号位表示数字分正负,占位1位;指数位表示浮点的位置,占位8位,无符号存储,取值范围:0-256,其与实际指数的偏差值为127,尾数表示数值的精度,占位23位。

我们以8.25为例来进行说明:

8.25用二进制表示可表示为1000.01,使用2进制的科学计数法的方式为1.000001*2^3,按照上述方式,符号为+,符号位为1;指数为3,指数位为11;尾数为1,则尾数位为1,其存储方式为:

符号位(1位)

指数位(8位)

尾数位(23位)

1

11

1

注:对于尾数,每个十进制转换成二进制之后,最高位必为1,最高位为0没有意义,所以为了提高取值范围,省略最高位1,也就导致尾数的取值位数是24位。(其中不足位数的前面用0进行补齐)

(2)计算float的精度,精度是指精确到数值的某一位,是指float类型可以表示的数值最大的位数,在十进制中也表示最大的位数。在用二进制表示的时候都是以转换成科学计数法,其最高位为1。在好多博客与知乎都是以2^23= 8388608为由,所以精度是6~7位为准,我在这里不能想通;查阅在wiki的ieee上对此已经进行说明。


这里面的24原因是尾数位数其实也是指取值范围,所以需要将尾数部分全部取到,也是就是实际的23位加上默认的1位,然后转换为10进制,即得到十进制的位数,因此在十进制上其实也就只有7位。

(3)计算float的取值范围:


截图来自wiki,(-1)sign指代符号位,括号里面指代的是数据的精度,隐藏的1是固定不变的,括号右边指代的是指数部分,其中127是差值。这样的话,value的取值范围是根据上式得到的,所以其取值范围是-2^128~2^128。

推论:对于double类型,其推导方式一致,不同的是指数位为11位,尾数位52位,差值1023。

猜你喜欢

转载自blog.csdn.net/asdfgggggggg/article/details/73480486