浮点代码转定点加速中定点化原理分析

update:2022年2月10日

基本概念


在分析讲解定点和浮点之间映射前,我们需要了解以下基本概念。

位宽

  • 一个浮点数用多少位的整数来表示
  • 如(16, 4),则表示用16位整数来表达浮点数
    • 假设为有符号数
    • 则其中:1位为符号位,4位数为表达整数,剩余11位表达(0, 1)的小数

分布如图:

标值

  • 即指用多少位,来保存小数

  • 若位宽表示为(16, 4),则标值为Q15

浮点数与定点数映射转换


浮点到定点

一句话表达:浮点数乘以2^Q,然后圆整或截断成整数,即得定点数。其中Q为定标值。

总体过程如下图

由于定点到浮点是浮点转换的逆过程,所以核心只要掌握浮点到定点的映射即可。

主要思路:

  • 查看对应变量的浮点值范围

  • 取绝对值后,找到最大值,并截断取整为maxNum

  • 分析需要多少位来存maxNum,剩余的位数则一个留给符号位,其余位留给小数位

  • 如用32位定点存浮点数,用25位来存整数,留1位符号位,剩6位给小数,故位宽表示(32, 25),标值为Q6

  • 定点值 fix = float * 2^6,将整数左移6位,低6位则是小数转换而来

  • 定点能表示的浮点数精度为:1/2^6=0.015625,用最小的定点数1,来转化成最小浮点数,得到精度值

定点到浮点

一句话表达:二进制转化为十进制整数,定点整数除以2^Q,做浮点运算,结果即为对应浮点数。

总体过程如下图

主要步骤:

  • 知道标值Q,则定点是浮点转换的逆过程
  • 公式为 float = fix / 2^6
  • 整数部分,fix右移6位后得到的结果
  • 小数部分,就是用定点除法运算fix/2^6的余数mod,mod / 2^6做浮点运算所得结果

定点数与浮点数存储的区别

联系之前文章《计算机中浮点数存储的本质》,下面将定点数与之对比:

  • 总述:核心原理类似,具体实现不同
  • 核心相同处
    • 都是将整数移至高位,剩余位给小数位
    • IEEE算法里科学计数法前面的步骤跟定点数相同
      • 如:19.625,用32bit浮点存
      • IEEE科学计数法前的结果:10011.101,假设用8位存整数,1位存符号位,剩余23位存小数
      • 用Q23的定点表达:00010011.10100000000000000000000
  • 具体不同处
    • 定点数的标是可变的,32位浮点数IEEE算法固定只用8位来存指数部分,1位来存符号位,剩余位数存尾数
    • 浮点数存储算法更复杂,定点数步骤仅相当于只到IEEE算法科学计数法前面
    • IEEE算法中,后面继续采用科学计数法将整数再次压缩成指数来存储,从而提高了精度
      • 为什么能提高精度?
        • 用更少位数来存整数,更多位数来存小数,以提高精度
    • 注意:在科学计数法后,8位的指数是整数相关信息,但剩余位数存的尾数,不全是小数,也有整数移位后的信息

参考资料


  1. 腾讯云:C语言浮点数float类型的秘密
  2. 计算机中浮点数存储的本质分析
  3. A Fixed-Point Introduction by Example
全部评论

相关推荐

来,说点可能被同行“骂”的大实话。🙊当初接数字马力Offer时,朋友都说:“蚂蚁的“内包”公司?你想清楚啊!”但入职快一年后的今天,我反而对他有了不一样的看法!🔹 是偏见?还是信息差!之前没入职之前外面都在说什么岗位低人一等这类。实际上:这种情况不可至否,不能保证每个团队都是其乐融融。但我在的部门以及我了解的周边同事都还是十分好相处的~和蚂蚁师兄师姐之间也经常开一些小玩笑。总之:身份是蚂蚁公司给的,地位是自己挣的(一个傲娇女孩的自述)。🔹 待遇?玩的就是真实!试用期工资全额发!六点下班跑得快(早9晚6或者早10晚7,动态打卡),公积金顶格交。别听那些画饼的,到手的钱和下班的时间才是真的(都是牛马何必难为牛马)。🔹 能不能学到技术?来了就“后悔”!我们拥有权限直通蚂蚁知识库,技术栈多到学不完。说“学不到东西”的人,来了可能后悔——后悔来晚了(哈哈哈哈,可以不学但是不能没有)!💥 内推地址:https://app.mokahr.com/su/ueoyhg❗我的内推码:NTA6Nvs走我的内推,可以直达业务部门,面试流程更快速,进度可查!今天新放HC,之前挂过也能再战!秋招已经正式开始啦~机会就摆在这,敢不敢来试一试呢?(和我一样,做个勇敢的女孩)
注意格局:去年超发意向是忘了
帮你内推|数字马力 校招
点赞 评论 收藏
分享
27双非本,最近面试被挂麻了面试官说简历内容太简单了,技术栈要单独一行,各位佬有啥建议吗
LZStarV:项目太简单了,你像用什么开发的技术栈没必要写一句话,按点写就好了;有特色的比如说WebSocket、视频流这种狠狠吹,那就好看多了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务