浮点数定点化的初步认识

本文转载,点击此处查看原文


  FPGA只能处理定点数,Alteral stratix 10可以支持硬浮点,如军方雷达、机器视觉等硬件加速。

  浮点数:2.918 3.1415986
  浮点转定点:(如16位,表示范围32767~-32768)
    定义小数需求多少位(如12位)
    整数需求多少位(如3位)
    最高位为符号位(针对有符号数,1位)**
  对于低15位,整数最大表示7,小数最大精度1/(212)=0.000244140625,小数最大能表示(1/(212))4095=0.999755859375
  即使用15位二进制数(最大32767)表示浮点小数(最大7.999755859375)
  如对2.918定点化的过程:
    量化精度:(8/32768)
    量化结果:2.918/(8/32768)=11952.128~=11952
    定点化会产生量化误差。
  如对3.1415926定点化过程;
    3.1415926/(8/32768)=12867.9632896~=12868

    浮点数运算:2.918*3.1415926=9.1671672068
    11952x12868=153798336
    153798336=(0)_(00_1001)_(0010_1010_1100_0110_1100_0000)
    符号位1位,表示正数,
    整数6位,表示十进制数为9,
    小数24位,为(0010_1010_1100_0110_1100_0000)b=(2803392)d,
    2803392/(2^24)=0.167095184326171875
    所以153798336转换为浮点数为9.167095184326171875
    与原浮点数结果有误差。
综上:
    第一步:规定位宽
        整数位宽:能够表示整数部分的最少bit数。
        小数位宽:能够满足最大小数精度的bit数,如小数位宽为N,则能表示的小数精度为1/(2^N)
    第二步:确定最大值与最小值
    第三步:定点化处理

FPGA 中,通常使用定点数进行数值计算,因为定点数可以更高效地实现。如果需要对浮点数进行计算,需要将浮点数转换为定点数。下面是一种简单的方法来将浮点数转换为定点数。 假设我们要将一个浮点数 x 转换为定点数 Q,其中 Q 有 n 位整数部分和 m 位小数部分,总共有 n+m 位。则可以按照以下步骤进行转换: 1. 将浮点数 x 乘以 2^(m),得到一个整数 y。 2. 将整数 y 左移 n 位,得到一个 n+m 位的整数 z。 3. 将整数 z 再除以 2^(m),得到定点数 Q。 这个方法的原理是将浮点数的小数部分转换为整数部分,然后将整数部分左移 n 位,再将小数部分除以 2^(m),得到定点数的小数部分。 在 Verilog 中,可以使用 shift 和 divide 操作来实现这个方法。以下是一个示例代码: ```verilog module float2fix(input [31:0] x, output reg [15:0] Q); integer y, z; always @* begin y = x * 65536; // 2^16 = 65536 z = y << 16; // shift left by 16 bits Q = z >> 16; // shift right by 16 bits end endmodule ``` 这个例子将浮点数 x 乘以 2^16,然后将整数部分左移 16 位,最后将结果右移 16 位得到定点数 Q。这个例子中,定点数 Q 有 16 位整数部分和 16 位小数部分。 需要注意的是,这个方法只是一个简单的转换方法,可能会存在精度损失。如果需要更高精度定点数转换,可以使用更复杂的算法,例如 CORDIC 算法或者牛顿迭代法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值