定点数和浮点数

所谓定点格式,即约定机器中所有数据的小数点位置是固定不变的。通常将定点数据表示成纯小数或纯整数。为了将数表示成纯小数,通常把小数点固定在数值部分的最高位之前;而为了把数表示成纯整数,则把小数点固定在数值部分的最后面,如图。

这里写图片描述

假设用一个n位字来表示一个定点数x= x0x1x2 …xn-1,其中一位x0用来表示数的符号位,其余位数代表它的量值。
为了对所有n位进行统一处理,符号位x0通常放在最左位置,并用数值01分别代表正号和负号。
对于任意定点数x= x0 x1 x2 … xn-1。
如果x表示的是纯小数,那么小数点位于x0和x1之间,数的表示范围为:      0|x|≤1-2-(n-1);
如果x 表示的是纯整数,则小数点位于最低位xn-1的右边,数的表示范围为:      0|x|≤2n-1-1。

此处声明一下,下文摘自一则博客,网址:http://blog.jobbole.com/86371/

浮点数的二进制转换
这里写图片描述

这里写图片描述
单精度浮点数

三个主要成分是:
Sign1bit):表示浮点数是正数还是负数。0表示正数,1表示负数
Exponent8bits):指数部分。类似于科学技术法中的M*10^N中的N,只不过这里是以2为底数而不是10。需要注意的是,这部分中是以2^7-1127,也即01111111代表2^0,转换时需要根据127作偏移调整。
Mantissa(23bits):基数部分。浮点数具体数值的实际表示。

下面我们来看个实际例子来解释下转换过程。

Step 1 改写整数部分
以数值5.2为例。先不考虑指数部分,我们先单纯的将十进制数改写成二进制。
整数部分很简单,5.101.。
Step 2 改写小数部分
小数部分我们相当于拆成是2^-1一直到2^-N的和。例如:
0.2 = 0.125+0.0625+0.007825+0.003906252^-3+2^-4+2^-7+2^-8….,也即.00110011001100110011
Step 3 规格化
现在我们已经有了这么一串二进制101.00110011001100110011。然后我们要将它规格化,也叫Normalize。其实原理很简单就是保证小数点前只有一个bit。于是我们就得到了以下表示:1.0100110011001100110011 * 2^2。到此为止我们已经把改写工作完成,接下来就是要把bit填充到三个组成部分中去了。
Step 4 填充
指数部分(Exponent):之前说过需要以127作为偏移量调整。因此22次方,指数部分偏移成2+127129,表示成10000001填入。
整数部分(Mantissa):除了简单的填入外,需要特别解释的地方是1.010011中的整数部分1在填充时被舍去了。因为规格化后的数值整部部分总是为1。那大家可能有疑问了,省略整数部分后岂不是1.0100110.010011就混淆了么?其实并不会,如果你仔细看下后者:会发现他并不是一个规格化的二进制,可以改写成1.0011 * 2^-2。所以省略小数点前的一个bit不会造成任何两个浮点数的混淆。
具体填充后的结果见下图

这里写图片描述
参考:
http://blog.csdn.net/hongdi/article/details/5390924
http://blog.jobbole.com/86371/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值