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