打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
zz 浮点数存储格式
浮点数有两个基础类型:float和double。float占据4个字节,double占据8个字节。下面将以float类型为例,介绍浮点数的存储方式。double类型和float类型的存储方式雷同。
 
1.浮点数的存储方式
 
    浮点数的存储格式比较特殊,下图是4字节的float变量的存储示意图:
     
 
    根据IEEE754浮点数表示标准,一个float变量在存储中由三部分组成,分别是:
    符号位:1位(31),表示float的正负,0为正,1为负
    幂指数:8位(23-30),表示2进制权的幂次
    有效位:23位(0-22),表示有效数字
 
2.浮点数的取值范围

    在float的存储中,有4个特殊的存储值,分别是:
    0x7f800000:正无穷大,Float.intBitsToFloat()打印显示为infinity
    0xff800000:负无穷大,打印显示为-infinity
    0x00000000:正零,打印显示为0.0
    0x80000000:负零,打印显示为-0.0


    注意,infinity!=-infinity,但是0.0==-0.0

 

    以上4个特殊存储值将float的存储分为4个段
    [0x00000001,0x7f7fffff]:正float数,共2^31-2^23-1个
    [0x7f800001,0x7fffffff]:非数字,打印显示NaN,共2^23-1
    [0x80000001,0xff7fffff]:负float数,共2^31-2^23-1个
    [0xff800001,0xffffffff]:非数字,打印显示NaN,共2^23-1

3.浮点数的格式转换

      令bits表示一个整数,其存储空间为4字节,下面我们求出这4个字节表示的float类型数字为多少。

 

      int s = ((bits>>31) == 0)?1:-1;  //取出1bit符号位
      int e = ((bits>>23) & 0xff); //取出8bit的幂指数

      //取出23位有效位
      int m = (e==0)?((bits & 0x7fffff) << 1):((bits & 0x7fffff) | 0x800000);


    则该存储空间表示的浮点数为 s*m*2^(e-150)

 

    分析:[0x00000001,0x007fffff]:相应实数范围为[(2^-149),(2^-126)-(2^-149)],即大约为[1.4E-45,1.2E-38],离散间隔固定为(2^-149)即约为1.4E-45,实数个数为2^23个。[0x00800000,0x7f7fffff]:相应实数范围为[(2^-126),(2^128 - 2^104)],即大约为[1.2E-38,3.4E38],以后每增加2^23个实数,离散间隔增大一倍。

    所以,浮点数设计完成了整个A=[0x00000000,0x7f7fffff]离散空间
到B=[0.0,3.4E38]区间部分值的一个映射,该映射具有以下属性:
    <1>B中被映射实数的初始间隔为c=2^-149,并且每经过2^23个数间隔变为c=2*c
    <2>该映射是单调递增的

 

    评价:浮点数的存储设计,从本质上来说是设计了一个优秀的数值映射,充分利用了2进制存储的特点

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
浮点数的秘密
float精度丢失问题
Java基础类型与其二进制表示
你知道什么是浮点数吗
float与double的范围和精度_本为贵公子,平生实爱才
简要记录浮点型数据的二进制存储格式
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服