所谓定点格式,即约定机器中所有数据的小数点位置是固定不变的。通常将定点数据表示成纯小数或纯整数。为了将数表示成纯小数,通常把小数点固定在数值部分的最高位之前;而为了把数表示成纯整数,则把小数点固定在数值部分的最后面,如图。
假设用一个n位字来表示一个定点数x= x0x1x2 …xn-1,其中一位x0用来表示数的符号位,其余位数代表它的量值。
为了对所有n位进行统一处理,符号位x0通常放在最左位置,并用数值0和1分别代表正号和负号。
对于任意定点数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/
浮点数的二进制转换
单精度浮点数
三个主要成分是:
Sign (1bit):表示浮点数是正数还是负数。0表示正数,1表示负数
Exponent(8bits):指数部分。类似于科学技术法中的M*10^N中的N,只不过这里是以2为底数而不是10。需要注意的是,这部分中是以2^7-1即127,也即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.00390625即2^-3+2^-4+2^-7+2^-8….,也即.00110011001100110011
Step 3 规格化
现在我们已经有了这么一串二进制101.00110011001100110011。然后我们要将它规格化,也叫Normalize。其实原理很简单就是保证小数点前只有一个bit。于是我们就得到了以下表示:1.0100110011001100110011 * 2^2。到此为止我们已经把改写工作完成,接下来就是要把bit填充到三个组成部分中去了。
Step 4 填充
指数部分(Exponent):之前说过需要以127作为偏移量调整。因此2的2次方,指数部分偏移成2+127即129,表示成10000001填入。
整数部分(Mantissa):除了简单的填入外,需要特别解释的地方是1.010011中的整数部分1在填充时被舍去了。因为规格化后的数值整部部分总是为1。那大家可能有疑问了,省略整数部分后岂不是1.010011和0.010011就混淆了么?其实并不会,如果你仔细看下后者:会发现他并不是一个规格化的二进制,可以改写成1.0011 * 2^-2。所以省略小数点前的一个bit不会造成任何两个浮点数的混淆。
具体填充后的结果见下图
参考:
http://blog.csdn.net/hongdi/article/details/5390924
http://blog.jobbole.com/86371/