待填坑--浮点算法和除法运算

1.定点数

 

    定点小数的加减法和整数的相同,并且和小数点的位置无关。乘法就不同了。 1.2*3.4=4.08。这里1.2的小数点在第1位之前,而4.08的小数点在第2位之前,小数点发生了移动。所以在做乘法的如果小数点位数不同就舍弃最低位。
 也就说1.2*3.4=4.1,这样我们就得到正确的定点运算的结果了。所以在做定点小数运算的时候不仅需要牢记小数点的位置,还需要记住表达定点小数的有效位数。上面这个例子中,有效位数为2,小数点之后有一位。

    现在进入二进制。我们的定点小数用16位二进制表达,最高位是符号位,那么有效位就是15位。小数点之后可以有0 - 15位。我们把小数点之后有n位叫做Qn,例如小数点之后有12位叫做Q12格式的定点小数,而Q0就是我们所说的整数。

    定------》整:Q12的正数的最大值是 0 111 . 111111111111,对应定点是是 0x7fff / 2^12 = 7.999755859375。定转整数,是它的整数值除以2^n。

   整------》定:就是x*2^n了。例如 0.2的Q12型定点小数为:0.2*2^12 = 819.2,由于这个数要用整数储存, 所以是819 即 0x0333。因为舍弃了小数部分,所以0x0333不是精确的0.2,实际上它是819/2^12 =0.199951171875。

对于FPGA而言,FPGA对小数是无能为力的,一种解决方法是采用定标,就是将运算的浮点数扩大很多倍,然后取整,再用这个数进行运算,运算结束后再缩小相应的倍数。

通过设定小数点在16位数中的不同位置,就可以表示不同大小和不同精度的小数了。数的定标有Q表示法和S表示法两种。表1.1列出了一个16位数的16种Q表示、S表示及它们所能表示的十进制数值范围。

同样一个16位数,若小数点设定的位置不同,它所表示的数也就不同。例如:

      16进制数2000H=8192,用Q0表示

      16进制数2000H=0.25,用Q15表示

不同的Q所表示的数不仅范围不同,而且精度也不相同。Q越大,数值范围越小,但精度越高;相反,Q越小,数值范围越大,但精度就越低。

例如,Q0 的数值范围是一32768到+32767,其精度为1,而Q15的数值范围为-1到0.9999695,精度为1/32768=0.00003051。因此,对定点数而言,数值范围与精度是一对矛盾,一个变量要想能够表示比较大的数值范围,必须以牺牲精度为代价;而想精度提高,则数的表示范围就相应地减小。在实际的定点算法中,为了达到最佳的性能,必须充分考虑到这一点。

例如,浮点数x=0.5,定标Q=15,则定点数xq=L0.5*32768J=16384,式中LJ表示下取整。反之,一个用Q=15表示的定点数16384,其浮点数为16384*2-15=16384/32768=0.5。浮点数转换为定点数时,为了降低截尾误差,在取整前可以先加上0.5。

一般在FPGA中处理小数定点数,需要自己去定点,比如用16位,就可以分成8位整数和8位小数,即(8,8),即"定点"在第8位。那么:

1 -> 16'h0100

1.5 -> 16'h0180

-1.5 -> -1.5*256 + 65536(补码) -> 16'hFE80

......

1.164 -> 1.164*256 = 298 = 16'h012A
如果两个小数相乘,即表示定点数相乘,比如,Q15表示的4000H(浮点数0.5)乘以Q15表示的4000H,4000H×4000H=1000 0000H,那么乘完之后的Q值为15+15=30.即浮点数表示0.25.

https://blog.csdn.net/github_33678609/article/details/53465626

2.除数为常数的除法

例子:m=n/9;怎样计算一个数除以9(这个数不是2的整数倍)m是要求的结果,n是原来的数   首先我们可以先解决9,比如我们利用1024(这个数正好是2^10,便于移位计算),因为1024/9=113.7我们取整即为113(64+32+16+1),因此可以得到9=1024/113,这样我们就把1024/113这个数当成9,   即m=n/(1024/113)=(n*113)/1024         =(n*113)>>10,这样就有可以转换为移位操作了,就变的简单了,其中那个113可以用乘法的移位来计算   这其中1024是自己任意取的主要是要和2的指数倍相关,便于移位,其中这个1024取的越大,出来的结果的精度就越高,比如还能取2048,4096等,越大精度越高。 
 

你可能感兴趣的:(待填坑--浮点算法和除法运算)