0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一文了解FPGA浮点小数与定点小数的换算及应用

Hx 作者:工程师陈翠 2018-06-28 15:49 次阅读

定点小数运算

有些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.

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1629

    文章

    21729

    浏览量

    602986
收藏 人收藏

    评论

    相关推荐

    小数在内存中是如何存储的?为什么C语言中的浮点数不支持位移操作?

    小数在内存中是如何存储的?为什么C语言中的浮点数不支持位移操作?
    发表于 08-16 09:24 1048次阅读
    <b class='flag-5'>小数</b>在内存中是如何存储的?为什么C语言中的<b class='flag-5'>浮点</b>数不支持位移操作?

    第7章 DSP定点数和浮点

    转dsp系列教程本期教程主要跟大家讲解一下定点数和浮点数的基础知识,了解这些基础知识对于后面学习ARM官方的DSP库大有裨益。特别是初学的定要理解这些基础知识。 7.1
    发表于 09-22 13:02

    基于牛顿迭代法的FPGA定点小数计算

    倒数算法的HDL实现,只需要进行次到两次迭代便可获得相对精确的结果。在些实时图像处理场合中,对算法的运算速度和Latency要求较高,因此可以采用定点小数适当地降低精度以获得更高的
    发表于 07-18 07:33

    LABVIEW 保留小数精度与进制换算

    LABVIEW 保留小数精度与进制换算
    发表于 05-14 18:55

    定点小数的表示方法

    定点小数的表示方法   定点小数,是指小数点准确固定在数据某个位置上的小数,从实用角度看,都把
    发表于 10-13 17:12 8222次阅读

    定点小数的编码方法

    定点小数的编码方法  用定点小数引出数值的三种编码(原码、补码和反码)方法是最方便的。   (1) 原码表示法,是用机器数的最高位代表
    发表于 10-13 17:19 3358次阅读
    <b class='flag-5'>定点</b><b class='flag-5'>小数</b>的编码方法

    LM4F定点格式于浮点格式的对比和浮点运算的应用详细中文资料

    定点数指小数点在数中的位置是固定不变的,通常有定点整数和定点小数。在对小数点位置作出选择之后,运
    发表于 05-09 11:40 11次下载
    LM4F<b class='flag-5'>定点</b>格式于<b class='flag-5'>浮点</b>格式的对比和<b class='flag-5'>浮点</b>运算的应用详细中文资料

    FPGA定点小数的常规格式、相对于浮点小数的优势与劣势和计算的概述

    所谓定点小数,就是小数点固定地隐含在某位置上的数据。由于小数点的位置是固定的,所以就没有必要储存它(如果储存了
    的头像 发表于 06-12 19:34 9509次阅读
    <b class='flag-5'>FPGA</b><b class='flag-5'>定点</b><b class='flag-5'>小数</b>的常规格式、相对于<b class='flag-5'>浮点</b><b class='flag-5'>小数</b>的优势与劣势和计算的概述

    FOC之定点小数运算

    许多MCU 芯片只支持整数运算,如果要在这些芯片上进行小数运算,定点运算应该是最佳选择了;此外即使芯片支持浮点数,定点小数运算也是最佳的速度
    的头像 发表于 07-11 15:10 6375次阅读
    FOC之<b class='flag-5'>定点</b><b class='flag-5'>小数</b>运算

    FPGA浮点数转化为定点数方法

    FPGA在常规运算时不能进行浮点运算,只能进行定点整型运算,在处理数据的小数乘加运算和除法运算时FPGA
    的头像 发表于 10-13 16:23 4776次阅读

    浮点定点运算以及数据定标和精度问题

    计算机体系结构中浮点定点数据的表示 1、定点数: 定点数指小数点在数中的位置是固定不变的,通常有定点
    的头像 发表于 12-06 10:00 4843次阅读

    python小数数字对象Decimal

    python的小数数字对象,类似于浮点数,只不过小数数字有固定的位数和小数点。 python小数数字是有固定精度的
    的头像 发表于 03-10 10:04 694次阅读

    FPGA定点数截位的基本准则

    FPGA内部表示正负数,小数的规则。两者相比之下,定点数实现简单,表达更为直观,所以在很多时候FPGA通常使用定点数表示
    发表于 06-19 10:44 1506次阅读
    <b class='flag-5'>FPGA</b><b class='flag-5'>定点</b>数截位的基本准则

    定点数和浮点数的概念 浮点数二进制序列与指数表达式之间的转化

    数的缺点:由于小数点位置固定不变,定点数所表示的数的范围非常有限,不能同时表达特别大或特别小的数,所以才出现了浮点数,以此来扩充数的范围,同时浮点数也广泛应用于精度要求高的场合。简单的
    的头像 发表于 08-22 16:06 8065次阅读
    <b class='flag-5'>定点</b>数和<b class='flag-5'>浮点</b>数的概念 <b class='flag-5'>浮点</b>数二进制序列与指数表达式之间的转化

    python如何保留小数

    对Python中的小数处理有更深入的理解。 引言: 在计算机编程中,浮点数是种最常用的数据类型,用于表示实数。然而,由于计算机的内部存储方式以及浮点数的特性,导致
    的头像 发表于 11-23 16:37 1998次阅读