前言
本文讲述float、double的浮点型内存存储方式,浮点型存储和整形存储方式不同,所以字节大小或许一样,但是内容含义不一样。而float和double都涉及到精度问题,那么我们先来说说什么是精度!
精度:用科学记数法表示后,小数点能保留几位有效数字。
例如:11234.2234化成科学记数法,为1.12342234。小数点后有8位,则该精度为8位
注: 浮点型(float和double)在内存中使用科学计数法存储,即一个浮点数有2部分组成:底数m和指数e,而指数e前面还有一位bit位是符号位,即代表了正负。
对了,本文还需要会计算小数的二进制哦
一.Float
Float是单精度浮点类型,在计算机当中采用4个字节存储(采用IEEE754标准:标准规定了计算机程序设计环境中的二进制和十进制的浮点数自述的交换、算术格式以及方法),虽然是四个字节,但实际上并不是32位比特位全用于存储。
如上图,float虽然占有了4个字节,32位bit位,但内存实际被分成了三部分,首位bit代表了符号位,之后8位代表了指数位,最后23位代表了底数位。
符号位: 1位,表示负数,0表示正数
指数位: 8位,表示指数,可表示数据范围(00000000-11111111,对应的十进制为0-255)
因为指数可以是正数也可以是负数,IEEE754标准规定:指数减去127才是实际的指数(这是规定)
float的指数表示范围是-127到128;
底数位:只存储23位,最大值为2^23=8388607(7位数),由于我们输入的是十进制,因此对应十进制数为7位,故该float型的精度为7~8位有效数字(有的编译器为7位,有的为8位)
float精度的展示:
例如:23.625
23的二进制为10111
0.625的二进制 :0.625*2=1.25取整1,小数部分为0.25
0.25*2=0.5取整为0,小数部分为0.5
0.5*2=1取整为1,小数部分为0. //停止取整,0.625二进制值:0.101
因此,23.625的二进制:10111.101
10111.101用科学记数法:1.0111101*2^4 //类比十进制数123.5—>1.235*10^2
指数:4,但是实际指数需要加127,为131,转换为二进制为:10000011
该数字为正数,所以符号位为0
内存存储形式:0 10000011 01111010000000000000000
//符号位 + 指数二进制 + 科学记数法的小数部分 + 其余位为0
注:指数加127的原因是,计算机是为了更好的计算,当需要展示时会自动减去127的。
二.double
double是双精度浮点类型,在计算机中拥有8个字节,也就是64位bit位。
符号位: 1位,表示负数,0表示正数
指数位: 11位,表示指数,可表示数据范围(00000000000-11111111111,对应的十进制为0-2047)
因为指数可以是正数也可以是负数,IEEE754标准规定:指数减去1023才是实际的指数(这是规定)
double的指数表示范围是-1023到1024;
底数位:只存储52位,最大值为2^52=4503599627370496(16位数),由于我们输入的是十进制,因此对应十进制数为16位,故该double型的精度为16~17位有效数字(有的编译器为16位,有的为17位)
例如:23.625
23的二进制为101110.625的二进制 :0.625*2=1.25取整1,小数部分为0.25
0.25*2=0.5取整为0,小数部分为0.5
0.5*2=1取整为1,小数部分为0. //停止取整,0.625二进制值:0.101
因此,23.625的二进制:10111.101
10111.101用科学记数法:1.0111101*2^4 //类比十进制数123.5—>1.235*10^2
指数:4,但是实际指数需要加1023,为1027,转换为二进制为:10000000011
该数字为正数,所以符号位为0
内存存储形式:0 10000000011 0111101000000000000000000000000000000000000000
//符号位 + 指数二进制 + 科学记数法的小数部分 + 其余位为0
注:指数加1024的原因是,计算机是为了更好的计算,当需要展示时会自动减去1024的。
三.float和double对比
(1)在内存中占有的字节数不同
- 单精度浮点数在机内占4个字节
- 双精度浮点数在机内占8个字节
(2)有效数字位数不同
- 单精度浮点数有效数字7/8位
- 双精度浮点数有效数字16/17位
(3)所能表示数的范围不同
- 单精度浮点的表示范围:-3.40E+38 ~ +3.40E+38
- 双精度浮点的表示范围:-1.79E+308 ~ +1.79E+308
(4)在程序中处理速度不同
一般来说,CPU处理单精度浮点数的速度比处理双精度浮点数快。