float的取值范围的计算,以及float和int数值差别大的原因,以及为什么float的有效位数是6-7位

float的取值范围的计算

类型                   存储需求                                                         取值范围

float                     4 字节                                                 大约   ±3.40282347E+38F(有效位数为6-7位)

任意一个二进制浮点数V可表示成下面形式:

S表示符号位,E为指数为,M表示尾数

 

 

 符号位1位

指数位8位

尾数为23位

根据IEEE float类型一共占4个字节共32位

 

最高位符号通过0/1来区分S为0时为正数,S为1时为负数。

E指数为8位,对于8位补码-128~127,可得到对应的阶码表示为0~255,其中0和255分别用来表示0和无穷大,1~254用来表示规范数字,即指数范围从-126到127,也就是说实际的指数等于指数位表示的数值减127;

M在计算机内部保存时整数部分固定为1,M的范围是[1.0,2.0)之间默认这个数的第一位可以被舍弃,所以float尾数其实不是23位而是24位

M尾数为为23位则取二进制1.1......1(小数点23为),则取到2-2^-23 约等于2.

所以V的绝对值最大为2^127*(2-2^-23)约等于2^128=3.4E+38。加上符号之后可表示为(3.4E+38)。

实际上尾数决定了浮点数的精度,尾数只有23位,加上省略的那位就是24位。如果一个int类型的值小于224,那么float是完全可以表示的。如果int类型大于224就不一定能表示了。假如一个int数值的二进制表示形式是100000000000000000000000,表示成指数形式是1.00000000000000000000000*223,对应的float的类型,尾数位全部为0,指数位是23+127=150,这样完全没有问题。假如一个int数值的二进制表示形式是1000000000000000000000001,表示成指数形式是1.000000000000000000000001*224,对应的float的类型尾数位是000000000000000000000001一共24位,这样就完全超出了float最多容纳23位尾数的能力。所以就不能正确表达这个int值了。由此也可以得出不能被float准确表达的最小int值是224+1。我们再将1000000000000000000000001的值加1,变成了1000000000000000000000010,这样变换为指数形式可以看出尾数又变为了23位,也就是说25位的二进制整数最后一位是0才能被float准确表示,每2个数就有一个不能被准确表示。如果是26位的二进制整数最后两位都是0才可以被float准确表达,每4个数就有3个不能被准确表示,以此类推。

现在再来回答为什么在编程的过程中似乎没怎么引起注意,这是因为,我们平时用的数值基本都小于224+1=16777217。

转自博客:https://www.cnblogs.com/LittleTiger/p/3969562.html(仅上面一段)

float和int数值差别大的原因:首先int类型在内存中存储是连续的差为1 例如 -1 0  1 2 3

而float在内存中存储并不是间隔固定的

并且float有8位指数位范围所以表示范围大。

float的有效位数是6-7位:10进制到2进制,2进制到10进制 转换,化得净的效数字7位,化不净的效数字6位,因为最后一位有舍入误差。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值