• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
gddzkw
博客园    首页    新随笔    联系   管理    订阅  订阅
浮点数在内存中的存储

问题引入:整型家族在内存中存储时有大端、小端模式。而浮点型是怎么在内存中存储的:

根据国际标准IEEE 754(电气工程师协会),任意一个二进制浮点数v可以表示成以下形式:

  # (-1)^S*M*2^E

  # (-1)^S表示符号位,当S=0时:v为正数。当S=1时:v为负数

  # M表示有效数字位

  # 2^E表示指数位

IEEE 754规定:对于32位浮点数,最高1位是符号位S,接着8位是指数E,剩下的23位为有效数字M。

 

对于64为浮点数,最高位是符号位S,接着11位是指数E,剩下52位为有效数字M。

IEEE 754规定:计算机内部保存M时,默认这个数的第一位总是1,因此可以舍去,只保留后面的小数部分。这样做的目的可以节省空间。

节省了1位有效数字,使得保留的有效数字多1位,因此M就是24bit。

对于指数E:E位一个无符号整数,这意味着,如果E为8位,它的取值范围为0~255.E为11位,取值范围为(0~2047)

IEEE 754规定:存入内存时E的真实值必须加上一个中间数。

E(8bit):255/2=127

E(11bit):2047/2=1023

例如创建变量float f=5.5存入内存(转化成二进制:101.1)

得到:S=0

   M=1.011

   E=2

给E的真实值加上127--------------->2+127=129

所有得到:0   10000001   01100000000000000000000

       S         E             M

那么如何从内存中取出呢?(分3中情况)

@E不全为0或不全为1

  浮点数采用下面的规则表示:即指数E的计算值减去127(或者1023).得到真实值。在将有效数字M前加上第一位的1.

(由于规定有效数字M正数部分必须为1,即小数点右移一位)

@E全为0

  显然读取E的时候:0-127=-127,那么2^E=2^-127会趋于无穷小(0).计算机此时的浮点数就会表示为0

@E全为1

  这时2^E就会非常大:255-127=128.即达到浮点数的极值。

 

posted on 2021-10-20 17:29  又菜又爱玩丶  阅读(80)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3