定点小数运算
有些fpga中是不能直接对浮点数进行操作的,只能采用定点数进行数值运算。
所谓定点小数就是把小数点的位置固定,我们要用整数来表示小数。
先以10进制为例。如果我们能够计算12+34=46的话,当然也就能够计算1.2+3.4 或者 0.12+0.34了。所以定点小数的加减法和整数的相同,并且和小数点的位置无关。乘法就不同了。 12*34=408,而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,第一个0是符号位,后面的数都是1,那么这个数是十进制的多少呢,很好运算,就是 0x7fff / 2^12 = 7.999755859375。对于qn格式的定点小数的表达的数值就它的整数值除以2^n。在计算机中还是以整数来运算,我们把它想象成实际所表达的值的时候,进行这个运算。
反过来把一个实际所要表达的值x转换qn型的定点小数的时候,就是x*2^n了。例如 0.2的q12型定点小数为:0.2*2^12 = 819.2,由于这个数要用整数储存, 所以是819 即 0x0333。因为舍弃了小数部分,所以0x0333不是精确的0.2,实际上它是819/2^12 =0.199951171875。
我们用数学表达式做一下总结:
x表示实际的数(*一个浮点数), q表示它的qn型定点小数(一个整数)。
q = (int) (x * 2^n)
x = (float)q/2^n
验证:
由于/ 2^n和* 2^n可以简单的用移位来计算,所以定点小数的运算比浮点小数要快得多。下面我们用一个例子来验证一下上面的公式:
用q12来计算2.1 * 2.2,先把2.1 2.2转换为q12定点小数:
2.1 * 2^12 = 8601.6 = 8602
2.2 * 2^12 = 9011.2 = 9011
(8602 * 9011) 》》 12 = 18923
18923的实际值是18923/2^12 = 4.619873046875 和实际的结果 4.62相差0.000126953125,对于一般的计算已经足够精确了。
小数的定标精度、范围
采用定点数进行数值运算,其操作数一般采用整型数来表示。一个整型数的最大表示范围取决于dsp芯片所给定的字长,一般为16位或24位。显然,字长越长,所能表示的数的范围越大,精度也越高。
对于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)转换为定点数(xq):xq=(int)x* 2^q
定点数(xq)转换为浮点数(x):x=(float)xq*2^(-q)
例如,浮点数x=0.5,定标q=15,则定点数xq=l0.5*32768j=16384,式中lj表示下取整。反之,一个用q=15表示的定点数16384,其浮点数为16384*2-15=16384/32768=0.5。浮点数转换为定点数时,为了降低截尾误差,在取整前可以先加上0.5。
q和s表示方法,如下表所示。
q表示 s表示 十进制表示范围
q15 s0.15 -1≤x≤0.9999695
q14 s1.14 -2≤x≤1.9999390
q13 s2.13 -4≤x≤3.9998779
q12 s3.12 -8≤x≤7.9997559
q11 s4.11 -16≤x≤15.9995117
q10 s5.10 -32≤x≤31.9990234
q9 s6.9 -64≤x≤63.9980469
q8 s7.8 -128≤x≤127.9960938
q7 s8.7 -256≤x≤255.9921875
q6 s9.6 -512≤x≤511.9804375
q5 s10.5 -1024≤x≤1023.96875
q4 s11.4 -2048≤x≤2047.9375
q3 s12.3 -4096≤x≤4095.875
q2 s13.2 -8192≤x≤8191.75
q1 s14.1 -16384≤x≤16383.5
q0 s15.0 -32768≤x≤32767
一般在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.
动物疫病快速诊断仪的性能
华为最快在今年秋天发布自己的操作系统鸿蒙
宽带RF接收机架构选项综述
CORDIC算法简介
电力监控系统在西安科技大学中心配电室中的应用
一文了解FPGA浮点小数与定点小数的换算及应用
机器视觉在电池领域中的应用与设计思考
ADALM1000 SMU培训主题17:基本运算放大器配置
开关电源知多少!开关电源工作原理分析
【教程】贝启RK3568开发板搭载寒武纪MLU220加速卡使用说明
赛灵思--为客户塑造全新价值
实验证实任意子存在,为费米子玻色子外另一基本粒子
由TEA1522T构成的3W精密开关电源电路
第三版HBM2存储标准发布,环比提升33%
实现多方共赢,vivo公布游戏生态新战略
三星成首家在DRAM生产采用EUV技术的存储器供应商
格芯退出7纳米制程或导致IBM订单转交台积电
华为和KBIZ韩国广播通信产业签订5G生态系统的合作谅解备忘录
锡林郭勒盟阿旗225兆瓦风电项目开工 由中国能建江苏电建三公司承建
美国电塔以94 亿美元收购西班牙电信移动基站业务