从计算机组成原理看浮点数取值范围

一、浮点数在计算机中的存储

浮点数的存储方案来源于IEEE 754标准。如何在只能存0和1的计算机中存储浮点数呢?关键是做到浮点数的三部分信息分别存储,包括正负号,尾数,和指数。
于是我们想到了科学计数法。但是我们常接触的科学计数法是类似于2*10^2这种,十进制的科学计数法,要想将浮点数表示为0或1,必须使用二进制的科学计数法,下面一张表格介绍一下二进制的科学计数法:

1111.1111
23222120小数点2-12-22-32-4

比如3.5=二进制11.1=21+20+2-1
科学计数法表示为:1.11*21
于是我们分离出三部分信息:S(正负号)E(尾数)M(指数)
常见浮点数分为两种:4字节(如java的float)浮点数,8字节(如java的double)浮点数;无论如何,第一位都要存正负号的,0正1负;指数占据8bit(4字节)或11bit(8字节);

  • 为了避免指数为负数,指数按补码存储,所以要添加偏移量,4字节8位偏移量127,8字节11位偏移量1023。
  • 尾数部分,由于小数点之前必然是1,所以只需存储小数点之后的部分即可。
  • 循环小数使用0舍1入处理
  • 大端存储与小端存储的区别:大端与阅读习惯一致

二、java中float与double的表示范围与精度

注意float的指数部分8位,最大值为01111111(首位是符号位),即127,所以最大值就是2127,最小值就是-2128,浮点数的表示范围按指数表示,所以float范围-2128-2127,就是 3.4 e − 45 3.4e^{-45} 3.4e45 ~ 1.4 e 38 1.4e^{38} 1.4e38,同理,double范围-21024-21023,就是 4.9 e − 324 4.9e^{-324} 4.9e324 ~ 1.8 e 308 1.8e^{308} 1.8e308
而精度取决于尾数,float尾数范围是223 = 8388608,最多能有7位有效数字,绝对能保证的为6位,所以float的精度为6~7位有效数字;
double尾数的范围是252 = 4503599627370496,一共16位,精度为15~16位。

三、关于补码的补充

  • 0和正数的补码是本身,负数的补码是对应正数按位取反+1
    比如4位,1111补码就是1001,实际上就是负数补码与对应正数(补码)和为0,其中第一位表示符号
  • 补码-0就是最小值(8位:-2128),+0就是0值
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值