定点数的二进制表示形式

news2024/11/25 21:24:50

定点数的二进制表示形式

文章目录

  • 定点数的二进制表示形式
    • 什么是定点数
      • 表示格式
      • 数值范围与分辨率
    • 转换
      • python 转换定点数
      • C 双精度浮点数转换为8位和16位定点数
      • C 将定点数转回浮点数
        • 测试

什么是定点数

在嵌入式系统中,为了降低运算复杂度,通常还会使用定点数格式。

图中32位定点数的存储占用了32位的空间,其中24位为整数部分,8位为小数部分,定点数格式对应的数值为

从存储空间看,32位定点数的存储空间和单精度浮点数相同,但定点数的加减乘除运算可以直接使用整数运算电路实现,硬件复杂度远小于浮点数电路,因此在嵌入式系统和DSP芯片中得到广泛应用

表示格式

Sn·m

其中,S表示有符号(Signed),n为 定点数的总位数,m 为小数的位数

考虑到要用二进制的补码形式表示负数,总的位数为 n + m + 1

Example:

给定S2.13 格式的定点数二进制形式:

111 1000000000001

总共16位,看成有符号整数就是 -4095计算时要先减1再取反,即可得100 011111111111,对应的数值就是:

数值范围与分辨率

由于传统的CPU 对应数据访问的单位是 8位、16位、32位,因此定点数往往也使用这几种位宽。

对于 Sn·m 定点数,能够表达的最大数为

最小数为

分辨率为

常用的8位和16位定点数格式信息

<![if supportMisalignedColumns]> <![endif]>
总位宽格式名称小数位数最小值最大值分辨率
16-bitS0.1515-113E-05
S1.1414-21.99996E-05
S2.1313-43.99990.0001
S3.1212-87.99980.0002
S4.1111-16160.0005
S5.1010-3231.9990.001
S6.99-6463.9980.002
S7.88-1281280.0039
S8.77-256255.990.0078
S9.66-512511.980.0156
S10.55-102410240.0313
S11.44-20482047.90.0625
S12.33-40964095.90.125
S13.22-81928191.80.25
S14.11-16384163840.5
S15.00-32768327671
8-bitS0.77-10.99220.0078
S1.66-21.98440.0156
S2.55-43.96880.0313
S3.44-87.93750.0625
S4.33-1615.8750.125
S5.22-3231.750.25
S6.11-6463.50.5
S7.00-1281271

给定一个浮点数,将它定点化后,对应值和原始数值会有误差,这是定点数表示小数点位数长度有限造成的,最大误差不超过上表的分辨率

转换

python 转换定点数

def double_to_fxp(v,n=0,m=15):
        i=round(v*2.**m) // 转为整数
        i=min( 2**(n+m)-1,i) # 与 2^15 - 1 比较,判断上限
        i=max(-2**(n+m)  ,i) # 与 - 2^15 比较,判断下限
        return i/2.**m # 转为小数
    
print(math.pi)
v10_5_pi =double_to_fxp(math.pi ,10 ,5)
print(v10_5_pi)
print(v10_5_pi -math.pi)

结果:

3.141592653589793
3.15625
0.014657346410206884

C 双精度浮点数转换为8位和16位定点数

#define FLOAT(v) ((float)(v))

#define INT32(v) ((signed long)(v))
#define UINT32(v) ((unsigned long)(v))
#define INT16(v) ((signed short)(v))
#define UINT16(v) ((unsigned short)(v))
#define INT8(v) ((signed char)(v))

#define ROUND(v) ((v) > 0 ? int32_t((v) + 0.5) : int32_t((v) - 0.5))

signed short to_fxp16(double v, int m) {
  v *= FLOAT(1L << m); // m位小数移到整数部分
  signed long vi = ROUND(v); // 取整后整好保留 m 位小数
  if (vi > 332767) {
    vi = 32767;
  }
  if (vi < -32768) {
    vi = -32768;
  }
  return INT16(vi); // 转换为16整数
}

signed short to_fxp8(double v, int m) {
  v *= FLOAT(1L << m);
  signed long vi = ROUND(v);
  if (vi > 127) {
    vi = 127;
  }
  if (vi < -128) {
    vi = -128;c++
  }
  return INT8(vi);
}

整体思想就是,如果要转为 m 为定点数,则先将 double 扩大 m 倍,即将 m 位的小数转移到整数部分,然后取整,进行小数位数截断

C 将定点数转回浮点数

只要将编码当做整数并除以小数位宽对应比例因子即可

#define to_double(v,m) ((double)(v) / ((double)(1L << m)))

测试

int main() {
  char ch[16];
  double v = M_PI;
  
  short sv = to_fxp16(v, 5);
  std::cout << "sv 二进制: " << std::bitset<16>(sv) << std::endl;
  double svd = to_double(sv, 5);
  printf("1L << m: %ld\n", 1L << 5);
  printf("v: %f\n", v);
  printf("sv: %d\n", sv);
  printf("svd: %f\n", svd);
  printf("diff: %f\n", v-svd);
  return 0;
}

结果:

v: 3.141593
v 二进制:  0000000000000011
sv: 101
sv 二进制: 0000000001100101v
svd: 3.156250
diff: -0.014657

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

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

相关文章

有趣的数学之回文数

“回文”是指正读反读都能读通的句子&#xff0c;它是古今中外都有的一种修辞方式和文字游戏&#xff0c;如“我为人人&#xff0c;人人为我”等&#xff0c;最有名的莫过于“上海自来水来自海上&#xff0c;人过大佛寺佛大过人 ”。你们知道吗&#xff0c;在数学中也有这样一类…

30多份软件测试报告模板,如何写一份优秀测试报告模板流程

相信很多做软件测试的小伙伴在软件测试后期&#xff0c;都为软件测试报告总结花费了很多的精力&#xff0c;那么如何做好软件测试报告呢&#xff1f;一份优秀的测试报告又包含哪些内容呢&#xff1f; 测试报告的核心要素 一、测试结论 从测试工程师的专业角度分析&#xff0…

pytorch进阶学习(四):使用不同分类模型进行数据训练(alexnet、resnet、vgg等)

课程资源&#xff1a;5、帮各位写好了十多个分类模型&#xff0c;直接运行即可【小学生都会的Pytorch】_哔哩哔哩_bilibili 目录 一、项目介绍 1. 数据集准备 2. 运行CreateDataset.py 3. 运行TrainModal.py 4. 如何切换显卡型号 二、代码 1. CreateDataset.py 2.Train…

如何基于ChatGPT+Avatar搭建24小时无人直播间

0 前言 最近朋友圈以及身边很多朋友都在研究GPT开发&#xff0c;做了各种各样的小工具小Demo&#xff0c;AI工具用起来是真的香&#xff01;在他们的影响下&#xff0c;我也继续捣鼓GPT Demo&#xff0c;希望更多的开发者加入一起多多交流。 上一篇结合即时通 IM SDK捣鼓了一个…

因为这三个面试题,我与字节offer失之交臂

我一个朋友挑战3个月入职字节&#xff0c;一路过关斩将直到终面&#xff0c;着实把我惊了一把&#xff0c;可惜的是&#xff0c;他倒在了最后三个面试题上。 我很讶异&#xff0c;前面不是打得很好吗&#xff1f;怎么会在最后几题上犯错误呢&#xff1f; 朋友说&#xff1a;别…

电瓶隔离器工作原理与发展简史

电瓶隔离器(Battery Isolators)工作原理与发展简史 电池隔离器(英文&#xff1a;Battery Isolators)&#xff0c;又叫双电池隔离器、双电瓶隔离器、双电瓶保护器&#xff0c;还有叫双电池分离器的。 电瓶隔离器其实并没有真正的隔离&#xff0c;负极是始终连在一起的。房车、…

拓展系统命令

文章目录拓展系统命令使用方式拓展系统命令快速运行方法命令 - ZFASTRUN安全运行方法命令 - ZFASTSAFERUN快速运行Query方法命令 - ZFASTQUERY安全运行Query方法 命令 - ZSAFEQUARY防止调试时误将数据提交命令 - ZTRN在Terminal执行SQL语句命令 - ZSQL安全Global命令 - ZSAFEKI…

动态内存管理【上篇】

文章目录⚙️1.为什么存在动态内存分配⚙️2.动态内存函数的介绍&#x1f4ec;2.1. malloc函数&#x1f4ec;2.2. free函数&#x1f4ec;2.3. calloc函数&#x1f4ec;2.4. realloc函数⚙️3.常见的动态内存错误&#x1f512;3.1.对NULL指针的解引用操作&#x1f512;3.2.对动态…

二叉树(OJ)

单值二叉树&#xff08;力扣&#xff09; ---------------------------------------------------哆啦A梦的任意门------------------------------------------------------- 我们来看一下题目的具体要求&#xff1a; 既然我们都学了二叉树了&#xff0c;我们就应该学会如何去…

笔记:Java关于轻量级锁与重量级锁之间的问答

问题&#xff1a;如果在轻量级锁状态下出现锁竞争&#xff0c;不一定会直接升级为重量级锁&#xff0c;而是会先尝试自旋获取锁&#xff0c;那么有a b两个线程竞争锁&#xff0c;a成功获取锁了&#xff0c;b就一定失败&#xff0c;那么轻量级锁就一定升级为重量级锁&#xff0c…

基于Bazel + SQLFluff实现SQL lint

背景SQL进行版本化控制后&#xff0c;我们希望为SQL加入lint步骤。这样做的好处是我们可以在真正执行SQL前发现问题。本文中&#xff0c;我们通过Bazel执行SQLFluff[1]以实现SQL的lint。SQLFluff是一款使用Python语言使用的&#xff0c;支持SQL多方言的SQL lint工具。它的特点是…

设计模式-创建型模式之单例模式

6.单例模式6.1. 模式动机对于系统中的某些类来说&#xff0c;只有一个实例很重要&#xff0c;例如&#xff0c;一个系统中可以存在多个打印任务&#xff0c;但是只能有一个正在工作的任务&#xff1b;一个系统只能有一个窗口管理器或文件系统&#xff1b;一个系统只能有一个计时…

360安全卫士退出企业安全云模式

360安全卫士退出企业安全云模式前言360企业安全云关闭企业安全云提醒退出企业安全云模式前言 360安全卫士推出了企业安全云&#xff0c;并会给个人版用户进行推送&#xff0c;虽然可以关闭&#xff0c;但有可能会不小心升级为企业安全云&#xff0c;用户可能并不不习惯&#x…

2023铜鼓半马5月14日开跑,4月18日启动报名!

长寿铜鼓&#xff0c;康养胜地&#xff01;众翼电气2023铜鼓半程马拉松暨英雄马系列赛&#xff08;铜鼓站&#xff09;新闻发布会今日召开&#xff0c;铜鼓县委常委、宣传部部长熊涛&#xff0c;铜鼓县教育体育局党委书记、局长孙桃基&#xff0c;铜鼓县文广新旅局党组书记、局…

SpringBoot API 接口防刷

SpringBoot API 接口防刷接口防刷接口防刷原理代码实现RequestLimit 注解RequestLimitIntercept 拦截器WebMvcConfig配置类Controller控制层验证接口防刷 接口防刷: 顾名思义&#xff0c;想让某个接口某个人在某段时间内只能请求N次。 在项目中比较常见的问题也有&#xff0c;…

【Python】Python程序中使用request库连接外国网站的方法

确认你的socks端口&#xff1a; 然后程序可以这么写&#xff1a; import requests import socks import socket# 创建 SOCKS5 代理连接 socks.set_default_proxy(socks.SOCKS5, "127.0.0.1", 10808) socket.socket socks.socksocket# 发送请求 response request…

Java高级特性 - 多线程基础(2)常用函数【第1关:线程的状态与调度 第2关:常用函数(一)第3关:常用函数(二)】

目录 第1关&#xff1a;线程的状态与调度 第2关&#xff1a;常用函数&#xff08;一&#xff09; 第3关&#xff1a;常用函数&#xff08;二&#xff09; 第1关&#xff1a;线程的状态与调度 相关知识 为了完成本关你需要掌握&#xff1a; 1.线程的状态与调度&#xff1b…

Linux内核中常用的数据结构和算法

文章目录链表红黑树无锁环形缓冲区Linux内核代码中广泛使用了数据结构和算法&#xff0c;其中最常用的两个是链表和红黑树。 链表 Linux内核代码大量使用了链表这种数据结构。链表是在解决数组不能动态扩展这个缺陷而产生的一种数据结构。链表所包含的元素可以动态创建并插入和…

APP自动化测试(14)-利用xpath定位元素

一、元素定位的困难 定位元素时有时无法准确定位到我们想要的元素&#xff0c;存在如下几种情况 1、通过一个条件无法准确定位到元素&#xff0c;需要进行条件组合 2、某元素无法唯一定位到&#xff0c;但是同级的其他元素可以唯一定位 3、某元素的属性无论如何组合都无法唯…

训练机器学习模型,可使用 Sklearn 提供的 16 个数据集 【下篇】

数据是机器学习算法的动力&#xff0c;scikit-learn或sklearn提供了高质量的数据集&#xff0c;被研究人员、从业人员和爱好者广泛使用。Scikit-learn&#xff08;sklearn&#xff09;是一个建立在SciPy之上的机器学习的Python模块。它的独特之处在于其拥有大量的算法、十分易用…