浮点小数和定点小数的相互转换:



  • 浮点数和定点数:

    • 前言: 在FPGA中为了减少存储空间,使用的小数多为定点小数,故在此记录一下浮点小数转换为 定点小数的方法
    • 定点数: 约定数值的小数点固定在某一位置
    以8位为例,最高位为符号位:
    -若整数位占4位,小数位占3位,则其最大精度为0.125,最大值为15.875
    -若整数位占5位,小数位占2位,则其最大精度为0.250,最大值为31.750
    -若整数位占6位,小数位占1位,则其最大精度为0.500,最大值为63.500
    -若整数位占7位,小数位占0位,则其最大精度为1.000,最大值为127
    
    • 浮点数: 小数点可以任意浮动
      • IEEE 754标准:

    0_1614836593819_01.png
    0_1614836617492_02.png

    0_1614837142751_03.png

            # (-1)^S表示符号位
            # M表示有效数字, 1≤M<2  M=1.fraction
            # 2^E表示指数位, E = exponent - 127  %%单精度
            #                E = exponent - 1023 %%双精度
    
    • 浮点数和定点数的相互转化:

      考虑一个浮点型变量a:

    1. 计算 b=a2Fb = a*2^F, F是定点小数的小数位数.

    2. 将b约分取整: 四舍五入、就近原则.
      round(3.56)=4; round(-1.9)=-2; round(-1.5)=-2.

    3. 将b转换为二进制.

    4. 假设需要的定点小数是w位的, 转换后b是c位的, 则将b符号位不变,符号位后填充(w-c)个零



  • 实例:
    0_1614837348300_04.png



  • 参考代码: python版本

    # # 参数含义: f: 浮点数; w: 定点位宽; x: 定点小数位数
    def FloatToFixed(f,w,x):
      sign = 0 ## 符号位
      if f < 0:
        sign = 1
      temp = f*(2**x)
      temp = abs(round(temp)) # 取整并取正值
      stri = '{0:0'+str(w)+'b}' # 指定位宽和填充0
      result = stri.format(temp)
      if sign == 1: # 最高位为符号位
        result = '1' + result[1:]
      return result
    


  • @zongjie 彭神语言就是强


 

Copyright © 2018 bbs.dian.org.cn All rights reserved.

Looks like your connection to Dian was lost, please wait while we try to reconnect.