什么是定点数?

在实际的工程应用中,往往会进行大量的数学运算。运算时除了会用到整数,很多时候也会用到小数。而我们知道在数字电路底层,只有「高电平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.5(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,像这样:

Sm.n

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

总结

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

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

这篇文章我们主要讲了:在计算机中如何使用定点数表示一个数字。总结如下:

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

共享股东模式:实体门店的创新商业模式

大家好,我是微三云周丽,今天给大家分析当下市场比较火爆的商业模式! 小编今天跟大伙们分享什么是共享股东模式? 在传统的商业模式中,实体门店通常由单一的老板或少数股东掌控,并且经营模式相对封闭。然而&…

grafana报错This panel requires Angular (deprecated)

1.原因 报错解释: Grafana在更新到7.0版本后,弃用了AngularJS(一种用于构建大型Web应用的JavaScript框架)。在早期的Grafana版本中,某些面板可能依赖于AngularJS,但这种依赖已经逐步被新的React或Vue面板所…

基于SSM+Vue的护工预约服务小程序和后台管理系统

1、系统演示视频(演示视频) 2、需要请联系

每日一题 — 二分查找

704. 二分查找 - 力扣(LeetCode) 朴素二分查找模板: while(.......){//防止溢出int mid left(right - left)/2;if(........){right mid-1;}else if(......){left mid1;}else{return mid;}} 代码: public int search(int[] num…

【Python进阶实战】Flask接口并发实战

【Python进阶实战】Flask接口并发实现 前言Flask阻塞接口接口实现接口阻塞 Flask并发接口接口实现接口并发 服务部署Windows部署Linux部署gunicorn安装gunicorn运行 结语 前言 Python版本:3.12.3 IDE:Pycharm 2024.1 对于Flask接口阻塞问题&#xff0…

沙漠里的气膜场馆,你见过吗?

在茫茫的沙漠之中,一座独特的建筑傲然而立,宛若一朵盛开的奇葩。这并非是传统的砖瓦建筑,也不是典型的钢筋混凝土构造,而是一座气膜场馆,以其轻盈的身姿和独特的设计,在沙漠中展现出了无与伦比的魅力。 这座…

java锁常识

AQS框架 AQS(AbstractQueuedSynchronizer)是 Java 中用于构建锁和同步器的基础框架。它提供了一种实现同步器的方式,使得开发者可以基于 AQS 构建各种类型的同步工具,如独占锁、共享锁、信号量等。 AQS 主要基于 FIFO 队列&…

Qt 集成OSG

Qt 你好 | 专注于Qt的技术分享平台 一&#xff0c;新建一个 QOsgWidget 类&#xff0c;继承自osgQOpenGLWidget #ifndef QOSGWIDGET_H #define QOSGWIDGET_H#include <QObject> #include <osgViewer/Viewer> #include <osgQOpenGL/osgQOpenGLWidget> class…

一种基于PET和ICT的双功能荧光探针,用于同时识别活细胞中的Cys和H2S

文章解读 文章设计了一种易于合成的双功能荧光探针NJB&#xff0c;通过明显的颜色和荧光变化用于对Cys和H2S的双位点响应&#xff0c;。在检测过程中&#xff0c;发生了光诱导电子转移 (photoinduced electron transfer, PET)和分子内电荷转移 (ICT)过程&#xff0c;NJB的颜色和…

ffmpeg支持MP3编码的方法

目录 现象 解决办法 如果有编译包没有链接上的情况 现象 解决办法 在ffmpeg安装包目录下 &#xff0c;通过./configure --list-encoders 和 ./configure --list-decoders 命令可以看到&#xff0c;ffmpeg只支持mp3解码&#xff0c;但是不支持mp3编码。 上网查寻后发现&…

SpringBoot之@Conditional衍生条件装配详解

文章目录 ☃️前言☃️简介☃️示例❄️❄️ConditionalOnProperty❄️❄️ConditionalOnClass❄️❄️ConditionalOnBean❄️❄️自定义条件 ☃️SpringBoot源码中使用☃️总结 欢迎来到 请回答1024 的博客 &#x1f353;&#x1f353;&#x1f353;欢迎来到 请回答1024的博客…

【圆桌论坛】个人作为嘉宾参与问答环节的总结,Create 2024百度AI开发者大会之AI智能体开发与应用论坛

目录 ⭐前言⭐讨论话题✨本质和价值✨端侧部署✨应用商业模式✨商业模式 ⭐主题总结⭐有趣分享 ⭐前言 首先&#xff0c;非常荣幸和开心作为开发者和创业者代表参加百度Create AI大会分论坛圆桌论坛的问答环节。 在分论坛活动开始前&#xff0c;参加了文心智能体平台&#xff…

JS 删除数组元素( 5种方法 )

No.内容链接1Openlayers 【入门教程】 - 【源代码示例300】 2Leaflet 【入门教程】 - 【源代码图文示例 150】 3Cesium 【入门教程】 - 【源代码图文示例200】 4MapboxGL【入门教程】 - 【源代码图文示例150】 5前端就业宝典 【面试题详细答案 1000】 文章目录 一、五种…

vue3中web前端JS动画案例(四)侧边栏横幅效果-右下角广告-淘宝案例

myJsAnimation.js, 这里使用了上次封装的动画方法&#xff0c;并进行了改造 /*** 动画的函数* dom 当前对象* JSON 传入元素对象的属性 {"width": 300, "opacity": 50}* * -------------------- 多物体运动&#xff0c;同时运动 ---传入JSON-------------*…

爬虫零基础学习,第一天,安装环境,requests库常用命令的讲解

Python爬虫 爬虫学习思路 URL内容获取,requests的基本常用语法 import requests # 先向目标网站发送请求 url = "http://www.baidu.com" r

【TensorFlow深度学习】人工智能绪论与深度学习前瞻

人工智能绪论与深度学习前瞻 【引言】人工智能的起源与发展机器学习与深度学习的关系深度学习的兴衰与复兴深度学习的特点与前瞻 【引言】 在信息技术蓬勃发展的今天&#xff0c;人工智能已成为推动科技革新和社会进步的关键驱动力。从最初的计算机辅助人类处理信息&#xff0…

UDP文件传输工具之UDP传输的优点和缺点

在当今快节奏的网络通信时代&#xff0c;UDP以其独特的优势&#xff0c;在众多应用场景中扮演着关键角色。本文将深入探讨UDP的优缺点及其应用场景&#xff0c;并重点介绍镭速软件如何通过技术创新&#xff0c;显著提升UDP传输的效率和可靠性。 UDP传输的优点 UDP的显著优势在…

从奇门WMS-A到金蝶云星空通过接口配置打通数据

从奇门WMS-A到金蝶云星空通过接口配置打通数据 接入系统&#xff1a;奇门WMS-A 用于菜鸟的仓库&#xff08;使用其他支持奇门的仓库同理&#xff09;&#xff0c;故而希望能和仓库的wms系统打通&#xff0c;这样我们采购收货&#xff0c;采购入库&#xff0c;销售出库&#xff…

HTML随机点名程序

案例要求 1.点击点名按钮&#xff0c;名字界面随机显示&#xff0c;按钮文字由点名变为停止 2.再次点击点名按钮&#xff0c;显示当前被点名学生姓名&#xff0c;按钮文字由停止变为点名 案例源码 <!DOCTYPE html> <html lang"en"> <head> <m…

流量反作弊算法简介

参考&#xff1a;流量反作弊算法实践 1. 背景 阅读记录阿里流量作弊的风控文章。甄别阿里妈妈逾千亿商业流量中作弊 与 低质量的部分&#xff0c;保护广告主和平台的利益是风控团队的核心工作之一。 2. 广告风控流程 广告主投放内容与风控团队、下游业务团队的简易交互流程如…