MATLAB小数转换二进制及补码运算
(2011-06-02 12:40:14)
标签:
科普matlab补码二进制it |
分类: 杂谈 |
今天写篇科普贴,编程转换二进制。如有错误,敬请指出!
虽然MALTAB提供了dec2bin这个函数,但是它的参数只能是整数。那么,怎样用尽可能少的代码,把小数转化成二进制数呢?好像四年前还做了不少这样的题。当需要转换的数很多的时候,当然就不能手算或用windows的科学计算器来算了。
先明确下二进制数表示的含义,它小数点前的第n位的权重是2^(n-1),而小数点后的第n位的权重是2^(-n).例如11.11(2)对应的十进制数就应该是2+1+0.5+0.25=3.75.反过来就是将小数转化为十进制。例如,8.125的二进制表示就是100.001.
这就带来了一个问题,倘若精度有限,只有2位小数位,又如何去表示8.125呢?显然这是无能为力的,这样就引入了量化误差。
所以在程序中,当要把小数转化成二进制的时候,首先需要指定整数位用a个bit,小数位用b个bit,加上符号位,这样转化成的小数一共是(a+b+1)位。
把需要转化的小数写成x,首先看看x在不在a位二进制数的表示范围中,如果不在需要进行限幅。然后转化的时候,先将x乘以2的b次方,得到y。那么y就相当于用b位小数对x进行了量化,只是小数点往左移动了b位而已。接下来把y用二进制表示即可。
将y用二进制表示的时候,还需要注意如果y是一个负数,应当用补码表示。上网查了查,都说MATLAB没有求补码的函数。求补码就是把原码按位取反再加1,并置符号位为1,这样就牵涉比较多的位运算。那么能不能尽量地只利用dec2bin这个函数,完成求补码的过程呢?
我们注意到补码实质上是利用了某种循环特性。对一个(a+b)位的负数y求补码,就相当于把y加上2^(a+b)以后再求原码,只不过符号位不同而已。因此,可以根据这种方法,仅仅使用dec2bin函数,即可完成求补码的过程,避免了大量的位运算。
小结一下过程:(要转换的是x,转换为a bit整数,b bit小数)
1.将x乘以2^b,结果为y;
2.看y是否在(a+b) bit的表示范围中,若不在,则用最极端的值来表示;
3.求y的补码;
3.1 若y为正数,直接求原码,并置符号位为0;
3.2 若y为负数,加上2^(a+b)以后求原码,并置符号位为1.
一种可能的代码如下:
function fixed_bin=my_fix_flr_bin(a,numint,numdec)
%a 为被定点化的矩阵或标量,为实数
%numint位整数,numdec位小数
%选取的总位数为1+numint+numdec,其中1为符号位所占用。
fixed_a=floor(a*2^numdec);
%模拟计算机中直接截位的结果
%限幅
if
((fixed_a>=2^(numint+numdec))||(fixed_a<-2^(numint+numdec)))
end
%转化为补码
if (a<0)
else
end
前一篇:门头沟灵山一日游