基于FPGA的数字信号处理(2)--什么是定点数?

在实际的工程应用中,往往会进行大量的数学运算。运算时除了会用到整数,很多时候也会用到小数。而我们知道在数字电路底层,只有「高电平1」和「低电平0」的存在,那么仅凭 0和1 该如何表示小数呢?

数字电路中,小数可以用两种形式来表示:「定点数」和「浮点数」。浮点数的内容我们下篇文章再讲,本文只讲定点数。

什么是定点数?

首先要明确的是,「定点数」的说法是相对「浮点数」来说的。要理解什么是定点数,可以先从要理解它的名字开始–定是什么?点又是什么?

定点数」是英语「fixed-point number」的中文翻译,fixed的意思是固定的point的意思是小数点,所以「定点数」其实也可以叫「固定小数点的数」。同样的,「浮点数」自然就是「浮动小数点的数」。

在10进制中,小数的表示是通过小数点和它所在位置来实现的。比如12.5,它表示的值是十二点五;而1.25则是一点二五。尽管12.5和1.25都用了「1 2 5」这3个数来表示,但由于小数点位置的不同,使得前者的数值是后者的十倍。

遗憾的是,电路只能表示1和0,无法直接表示小数点,所以上面的方法在电路中是行不通的。

假如你现在收到一条信息「我传一个小数过来,10100111」,看到这样一条信息,你恐怕只会觉得莫名其妙!10100111是哪门子小数?慢着,10100111如果直接转换成10进制数就是167,167当然不是小数,因为它没有小数点。但是仔细想想?它真的没有小数点吗?如果把167看做是167.0呢?也就是默认它的小数点是在最右边呢?

image-20240407204338665

接着你很快又收到了第二条信息「我再传一个小数过来,10100111,它的小数点在从右往左数第1位」。这次你终于能看懂了 ,这不就是1010011.1吗?也就是10进制数83.5。那么直接说83.5不就完事了吗?说这么多干吗?

image-20240407204521135

然后是第三条消息「我再传一个小数过来,10100111,它的小数点在从右往左数第2位」。这次传的是101001.11,即10进制数41.75。

image-20240407204616934

······(省略后面的10086条消息)······

看到这是不是清晰很多了–尽管我们无法直接用小数点来表示2进制小数,但可以通过指定小数点的位置来说明这是一个小数啊!

约定小数点的位置,且这个位置固定不变,小数点前、后的数字,分别用2进制表示,组合起来就可以用来表示和使用2进制小数了。用这种方式表示的数就叫做「定点数」。

定点数如何表示数字?

很容易想到,定点数除了能表示小数外,也可以表示整数。因为你可以把小数点的位置约定在最右面,这样其实相当于没有小数点,所以表示的都是整数;同样的,你也可以把小数点规定在最左边,这样表示的就是一个整数部分为0的小数。

所以定点数的表示可以分为三种情况:

纯整数

这种情况约定小数点在最右边。例如10进制数85用8位无符号2进制数表示就是0101_0101,因为小数点在最右边,所以可以看做是0101_0101.0 。

image-20240407205843367

纯小数

定点纯小数是指整数部分为0的小数。根据是无符号数还是有符号数,分为两种情况:

(1)无符号数

无符号数的最高位不表示符号,仅表示数值。这种情况约定小数点的位置在最左边。例如10进制数0.125用8位无符号2进制数表示就是0.0010_0000,因为小数点在最左边,所以是0010_0000。

image-20240407210804688

(2)有符号数

有符号数的最高位表示符号,不表示数值。这种情况约定小数点的位置在次高位。例如10进制数-0.125用8位无符号2进制数表示就是1.0010_000,因为小数点在次高位,所以是1010_0000。

image-20240407211159470

整数 + 小数

除了纯整数和纯小数这两种情况外,其实定点数主要是用来表示 「整数 + 小数」的情况,例如3.14、1.5、25.125等等。这种情况需要确定以下信息才能正确表示该数:

  • 整数部分长度
  • 小数部分长度
  • 是否有符号位

image-20240407211936944

整数和小数的长度之和确定了用多大的电路来表示定点数,而二者的长度之比则确定了小数点的位置。符号位则确定了该数是一个有符号数还是一个无符号数。

光说不练云玩家,接下来看几个例子。

(1)1.25 的定点数表示

首先约定用无符号数来表示,然后约定5 位为整数部分,3 位为小数部分。所以有:

1.25(D) = 1.01(B) = 00001.010 = 00001010

(2)-9.5 的定点数表示

首先需要用有符号数来表示,因为整数9需要4位来表示,而小数0.5仅需1位就可表示。为此可以约定5位为整数部分(注意最高位为符号位),3 位为小数部分。所以有:

-9.5(D) = 10110.1(B) = 10110.100 = 10110100

定点数的数值范围

定点数用来表示小数很方便,但是它也有个很大的问题–它的表示范围很小。

以5 位表示整数部分,3 位表示小数部分的无符号定点数为例,它的整数部分可以表示的范围是00000-11111,即0-31,步长是1;小数部分的范围是0.000-0.111,即0-0.875,步长是0.125。综合起来范围是0-31.875,步长为0.125。

有符号数的因为是用补码表示,所以它的范围取值比较特殊。以5 位表示整数部分,3 位表示小数部分的有符号定点数为例,它能表示的最小值是10000_000,即-32,它能表示的最大值是01111_111,即15.875。

若以m表示定点数的整数位宽(m不包含符号位),以n表示定点数的小数位宽,则有符号数和无符号数的定点数的表示范围为:

有符号数-2^m ~ (2^m - 2^-n)
无符号数0 ~ (2^m - 2^-n)

如果想表示更大范围、更高精度的值,怎么办?

  • 扩大整体位宽:比如使用 16位、32位来表示, 这样相应地整数部分和小数部分的宽度都可以增加,自然表示范围也就变大了。但是位宽的增加,也会带来更多的硬件开销
  • 改变小数点的位置:小数点向后移动,那么整个数字范围就会扩大,但是小数部分的精度就会越来越低。小数点向前移,表示的精度会变高,但是数字的表示范围又会降低。所以说定点数小数点位置的确定是一个范围和精度的trade off(权衡)

一些定点数的表示格式

除了可以用类似「以5 位表示整数部分,3 位表示小数部分的无符号定点数」的语言来描述定点数的格式外,还有多种定点数的表示格式。常见的有以下几种:

Q格式(Q notation)

Q格式的一般形式是:

Qm.n

默认情况下,用Q格式描述的都是有符号定点数。其中m表示整数部分的长度(这个值不包括符号位),n表示小数部分的长度。所以用Q格式描述的定点数的整体长度为:

w = m + n + 1 //整数部分长度 + 小数部分长度 + 符号位长度

例如 「 Q3.12 」描述的是一个整体长度为16位的2进制有符号定点数,它的整数部分长度是3,而小数部分长度是12。根据小数部分的长度,可以推断出分辨率为 2^-12。

在Q前面加一个 U 即可用来表示无符号的2进制定点数。例如 「 UQ1.15」描述的就是一个整数部分长度为1,小数部分长度为15的无符号的2进制定点数。

整数部分的长度值和小数点可以被省略,而只描述小数部分的长度。例如「 Q12 」描述的就是一个小数部分长度是12的2进制有符号定点数,但是它的整体长度是不确定的,你可以额外指定整体长度,或者说整体长度就取决于存储这个定点数的寄存器。

如果这个定点数存储一个16位的寄存器,那它的值就是:

xxxx . xxxx_xxxx_xxxx

如果这个定点数存储一个32位的寄存器,那它的值就是:

xxxx_xxxx_xxxx_xxxx_xxxx_xxxx . xxxx_xxxx_xxxx

其实也可以看出来,这种表示方法就是把它的值乘以 2^-12 。

这种整数长度m不包括符号位的Q格式主要是TI公司的DSP在使用,ARM公司也有一种类似的Q格式,但是它的整数长度m是包含符号位的。表示方式的不同不是什么大不了的事,只要是使用过程中确定好了就行,为此你甚至也可以自己创造一套定点数表示方式(只要不怕没人用就行,嘿嘿)。

S表示法

S表示法的一般形式是:

Sm.n

其中S表示这是一个有符号的定点数,m表示整数位数(m不包括符号位),n表示小数位数。这种方法其实跟Q格式很像,只不过它的表示无符号定点数的方法不是在前面加 U ,而是去掉 S,像这样:

m.n

例如「 2.4 」表示的就是一个整数位数为2,小数位数为4的无符号定点数。

总结

总的来说,用定点数表示的小数,不仅数值的范围表示有限,而且其精度也很低。要想解决这 2 个问题,人们就提出了使用「浮点数」的方式表示数字,关于浮点数的表示方法,我们会在下一篇文章进行讲解。

定点数和浮点数都可以表示小数,而定点数的精度固定,表现范围比较有限;但是,定点数在硬件上比较容易实现,在实际的数据算法中,定点数运算效率比浮点数的运算效率高很多,同时定点数使用的资源也比较少。因此,定点数被广泛地应用在数字信号处理的各种应用场景中。

  1. 定点数是在计算机中表示数字的一种方式,它既可以表示整数,也可以表示小数
  2. 在固定 bit 下,约定小数点的位置,然后把整数部分和小数部分分别转换为二进制,就是定点数的结果
  3. 受限于小数点的位置,用定点数表示小数时,数值的范围和小数精度是有限的
  4. 在现代计算机中,定点数通常用来表示整数,对于高精度的小数,通常用浮点数表示

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/5226.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙原生应用元服务开发-Web加载本地页面

将本地页面文件放在应用的rawfile目录下,开发者可以在Web组件创建的时候指定默认加载的本地页面 ,并且加载完成后可通过调用loadUrl()接口变更当前Web组件的页面。 在下面的示例中展示加载本地页面文件的方法: 将资源文件放置在应用的resou…

Arcpy入门学习笔记(三):数据属性的读取

Arcpy入门学习笔记(三):数据属性的获取 文章目录 Arcpy入门学习笔记(三):数据属性的获取常用的属性Describe对象属性(部分)数据集属性(部分)表属性&#xff0…

锂电池SOH预测 | 基于LSTM的锂电池SOH预测(附matlab完整源码)

锂电池SOH预测 锂电池SOH预测完整代码锂电池SOH预测 锂电池的SOH(状态健康度)预测是一项重要的任务,它可以帮助确定电池的健康状况和剩余寿命,从而优化电池的使用和维护策略。 SOH预测可以通过多种方法实现,其中一些常用的方法包括: 容量衰减法:通过监测电池的容量衰减…

[docker] 多容器项目 - PHP+MySQL+Nginx+utility containers

[docker] 多容器项目 - PHPMySQLNginxutility containers 这个项目总共会配置 6 个容器,主要还是学习一下 docker 的使用和配置,目标是: 本机不安装 PHP、Nginx 安装部分全都交给 docker 容器实现 可以运行一个 Laravel 网页项目 修改本机…

基于遗传算法的TSP算法(matlab实现)

一、理论基础 TSP(traveling salesman problem,旅行商问题)是典型的NP完全问题,即其最坏情况下的时间复杂度随着问题规模的增大按指数方式增长,到目前为止还未找到一个多项式时间的有效算法。TSP问题可描述为:已知n个城市相互之间的距离&…

万兆以太网MAC设计(12)万兆UDP协议栈上板与主机网卡通信

文章目录 一、设置IP以及MAC二、上板效果2.1、板卡与主机数据回环测试2.2、板卡满带宽发送数据 一、设置IP以及MAC 顶层模块设置源MAC地址 module XC7Z100_Top#(parameter P_SRC_MAC 48h01_02_03_04_05_06,parameter P_DST_MAC 48hff_ff_ff_ff_ff_ff )(input …

开源代码分享(26)-考虑预测不确定性的综合能源调度优化

参考文献: [1]崔杨,周慧娟,仲悟之,等.考虑源荷两侧不确定性的含风电电力系统低碳调度[J].电力自动化设备,2020,40(11):85-93.DOI:10.16081/j.epae.202009019. 1.基本原理 考虑碳交易机制能够有效提高风电消纳量,但是随着风电并网容量的增大&#xff0c…

【安卓13】谷歌桌面Launcher3屏蔽全部应用里面的部分app

1、需求 我们在做谷歌桌面时,移植了一些我们自己的应用,但是有些应用是服务型的app,不需要显示在主页,要隐藏掉 2、解决方案 方法1: 解决办法很简单,阅读源码发现,谷歌桌面添加全部应用的源…

使用yolo识别模型对比两张图片并标记不同(2)

上篇文章有漏洞,在这里补充下,比如要识别第二张图相对于第一张图的违建是否拆除了 第一步旋转对其后,图片会有黑色的掩码,如果旋转角度大的话,没识别出来的框可能不是已经拆除了,而是因为黑色掩码遮挡&…

数字旅游:通过科技赋能,创新旅游服务模式,提供智能化、个性化的旅游服务,满足游客多元化、个性化的旅游需求

目录 一、数字旅游的概念与内涵 二、科技赋能数字旅游的创新实践 1、大数据技术的应用 2、人工智能技术的应用 3、物联网技术的应用 4、云计算技术的应用 三、智能化、个性化旅游服务的实现路径 1、提升旅游服务的智能化水平 2、实现旅游服务的个性化定制 四、数字旅…

Linux编辑器调试器 gcc/g++ gdb 编译过程及使用讲解

这恋爱呀 我有两不谈 第一异性不谈 因为我们性别不一样 我知道的她不知道相处起来太累 第二同性不谈 因为我们性别一样 我知道的他也知道相处起来太无聊了 –❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀-正文开始-❀–❀–❀–❀–❀–❀–…

【介绍下Android开发环境的搭建】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…

什么是域名解析?域名解析的完整流程是什么?如何清理DNS缓存?(附源码)

目录 1、什么是域名? 2、为什么使用域名? 3、域名解析的完整流程 4、调用gethostbyname系统接口将域名解析成IP地址 5、为什么需要清理系统DNS缓存? 6、使用cmd命令清理DNS缓存 7、通过代码去清除系统DNS缓存 C软件异常排查从入门到精…

使用量排名前50的GPTs趋势和特征

Chatgpt的gpt商店已经有几千gpts了。目前哪些gpts比较受欢迎呢?有哪些趋势和投资呢? 根据whatplugin.ai(截止日期为2024年3月),使用量最多的50个gpts数据分析结果如下: GPTs类型的分布情况如下: 图像生成…

21.Nacos集群搭建

模拟Nacos三个节点,同一个ip,启动三个不同的端口: 节点 nacos1, 端口:8845 节点 nacos2, 端口:8846 节点 nacos3, 端口:8847 1.搭建数据库,初始化数据库表结构 这里我们以单点的数据库为例 首先新建一…

【C#】基础知识

0.参考 C#语言入门详解 1.几种打印hello_world的方式 1.1 console控制台 新建一个console,直接打印: Console.WriteLine("Hello_world");启动一闪而过,在vs调试中选择开始执行不调试(without debug)。 …

通话记录生成器怎么使用

通话记录生成器是一种可以模拟生成通话记录的软件工具,使用起来相对简单。以下是使用步骤: 导入目标号码:您需要将想要生成通话记录的目标号码输入到软件中。这可以通过直接复制粘贴电话号码,或者如果是图片或纸质文件中的号码&am…

分布式与一致性协议之CAP和Paxos算法(一)

CAP 理论 如何使用BASE理论 以InfluxDB系统中DATA节点的集群实现为例。DATA节点的核心功能是读和写,所以基本可用是指读和写的基本可用。我们可以通过分片和多副本实现读和写的基本可用。也就是说,将同一业务的数据先分片,再以多份副本的形…

四种网络IO模型

📝个人主页:五敷有你 🔥系列专栏:面经 ⛺️稳中求进,晒太阳 IO的定义 IO是计算机内存与外部设备之间拷贝数据的过程。CPU访问内存的速度远高于外部设备。因此CPU是先把外部设备的数据读取到内存,在…

有趣的大模型之我见 | Llama AI Model

Llama 开源吗? 我在写《有趣的大模型之我见 | Mistral 7B 和 Mixtral 8x7B》时曾犹豫,在开源这个事儿上,到底哪个大模型算鼻祖?2023 年 7 月 18 日,Meta 推出了最受欢迎的大型语言模型(LLM)的第…