浮点数二进制制科学计数法理解

Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu

1. 引言

对于浮点数,主要是单精度-float、双精度-double两种类型。

对于浮点类型,我们知道其采用科学计数法,准确来说应该是二进制科学计数法。
为什么准确说是是二进制科学计数法,而不是称为科学计数法?

2. 数学书中的科学计数法

我们已知,在数学书上学习到科学计数法,也即10进制时的科学计数法。

科学计数法的特点是:±[1-9].[0-9]… * 10n
小数点前的数字是需要大于0,并且小于指数的底数10,范围是0<abs(x)<10,取值的话就是±[1-9]。

表达123.456,科学计数法的表达是唯一的:
1.23456 * 102

注意不能是0.123456 * 103,因为科学计数法要求是小数点前有值的,且是[1-9]。

再比如,表达这个值0.00123的时候,科学计数法表达的唯一是,
1.23 * 10-3

同样的道理,这个也不能表达成 0.123 * 10-2,虽然值是一样的,但不符合科学计数法的要求—“小数点前有值的,且是±[1-9]”。

3. 二进制科学计数法

对于计算机里的浮点数来说,采用的是二进制科学计数法,为什么是二进制科学计数法?
因为对于计算机中,浮点数的表达使用的特点是
±1.[0-1]… * 2n

对于所乘的指数,底数是2,而不是10;所乘的指数,使用的是底数为2的指数。
指数的底数为2,那么对于科学计数法来说,小数前的数字需要大于0,并且小于底数2,就只能是0<x<2,也就只有1这个取值了。
小数点后的值,也因为二进制原因,取值只有[0,1]两个取值,毕竟二进制逢二要进一的。
对于计算机存储而言,每个bit取值只有两个,使用二进制科学计数法,恰如其分,特别的适合。

同十进制的科学计数法一样,对于一个有效值,也只有一种表达的方式,浮点数针对某个值的表达也是唯一的。

例如:1这个数字的表达唯一
二级制1.0 * 20

例如:8这个数字的唯一表达
二级制1.0 * 23

例如:1/2=0.5这个数字的唯一表达
二级制1.0 * 2-1

例如:1/8=0.125这个数字的唯一表达
二级制1.0 * 2-3

例如: 1/2 + 1/8 = 0.625这个数字的唯一表达
二级制1.01 * 2-1

从上面的这些例子也可以看出,每个数字的使用二进制科学计数法的表达也都是唯一的。

4. 浮点数的表达

回到浮点数的存储上来看,计算机中,浮点数的表达使用的特点是:二进制科学计数法
±1.[0-1]… * 2n

在这里插入图片描述

对于固定的值1,小数点前的值1,存储时是缺省带上的,这有效节省了浮点数的存储空间。
对于float类型,每个bit都有着固定的意义,1.缺省带了以后,后续的精度位依次向后表达,float有23个精度位;精度为前面有8个指数位,1个符号位。

float精度位-小数位缺省带了1之后,后面的二进制位数–23个精度位fraction,依次向后表达。
1/2要不要带
1/4要不要带
1/8要不要带
1/16要不要带
1/32要不要带
1/64要不要带
1/128要不要带

这样,±1.[0-1]… * 2n中,±1.[0-1]…被表达之后,n的表达就在指数位上了。

指数位呢,相对比较简单,就是整形的方式,表达2n的n值是多少,可以取值正值,也可以取值负值,取值方法参加下面的附录中。

5. 附:指数位取值位数与取值范围

浮点数的指数位是无符号的,它的正负区分通过采用一个偏移值来确定。
下表可以查到float指数位为8位,单精度的偏移值是127;
下表可以查到double指数位为11位,双精度的偏移值是1023;
float单精度偏移前表达范围[0,255],经过-127偏移后,8位指数位所能表达的范围是:[-127,128]。
double双精度便宜前表达范围是[0, 2047],经过-1023便宜后,11位指数位所表达的范围是: [-1023, 1024]
但是浮点数是需要表达NaN-not a number与Inf-Infinite的,此时指数位需要来标示,所以全1情况被用掉,另外0特殊表达,指数全0情况也被用掉。
float单精度所以去掉一个最大值,一个最小值,指数表达的范围是:[-126,127]
double双精度去掉一个最大值,一个最小值,指数表达的范围是:[-1022,1023]

TypeSignExponentSignificand fieldTotalExponent BiasBits PrecisionNumber of decimal digits
Half1510161511~3.3
Single18233212724~7.2
Double1115264102353~15.9

Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

春夜喜雨

稀罕你的喜欢!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值