今天看到浮点数的范围是-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位。