浮点数的存储和范围
今天看到浮点数的范围是-3.4E-38~3.4E38,我就有些奇怪了,为什么和int同是4个字节,浮点数表示的范围比int大得多得多?虽说不准,但是怎么存储的呢?由于智商有限,花了半个多小时才理解。下面介绍下浮点数的存储。
浮点数的存储方式
- 以float为例,浮点数在内存中分为符号(1位)阶码(8位)尾数(23位)三部分存储。
浮点数小数部分二进制存储
小数点后第一位是2-1,第二位为2-2……以此类推
浮点数存储举例
以100.1为例,正数,符号位为0,100二进制表示为1100100,0.1二进制表示为0.00011000001……无穷尽,懒得算到那么多位了……(PS:由于到达位数会截断,这也是为什么浮点数有误差的原因)
- 符号位的由来:0为正,1为负。
- 尾数的由来:
那么100.1就可以表示为1100100.00011000001……。由于数字第一位一定为1,所以把1省略,小数点向前移动6位,尾数为10010000011000001…… - 阶码的由来:上面提到移动了6位,由于要表示正负,阶码8位,所以阶码为0其实是1000 0000,移动6位,加上6后的阶码为1000 0110
- 最终存储表示:【0】【1000 0110】【1001 0000 0110 0000 1……】
浮点数的范围由来
【0】【1111 1111】【1111 1111 1111 1111 1111 111】
移动127位,大约达到2127,最小约为2-127.
浮点数的精度
例如float精度是6~7位,其实因为float尾数23位,可以存储223为7位,能精确表示的就是6位。
而double精度为15~16位,其实因为double尾数52位,可以存储252为16位,能精确表示的就是15位。