一道简单的笔试题_浮点数无损定点化

浮点数无损定点化

量化为定点数格式:m位定点数,n个小数位,无符号位,那么n称作量化系数

对于0111表示的定点数:

如果设定小数点位于最后一位,即0111.  则其表示7,最大精度1;

如果设定小数点位于后一位的,即011.1 则其表示3.5,最大精度0.5;

如果设定小数点位于后二位的,即01.11 则其表示1.75,最大精度0.25;

由上可得:

  • 小数位数越多,表示的精度越高。若小数点后有n位,则其表示的最大精度为1/(2^n)

  • 整数位数越多,可表示的最大值越大。

某疆笔试题

对12.918做无损定点化,首先需要确定对整数部分的量化位数。整数为12,无损量化4bit;小数部分为0.918,假如采用12bit位宽,整数部分4bit,那么小数部分只有8bit。

其实,无论有多少小数位,2进制编码的精度都是以5结尾的,因此2进制编码并不能完全无损的表示任意小数,但是根据数学上误差的概念只要误差小于精度的一半,就可以认为是“无损”的了。

如果小数位用8位表示,0.918*2^8=235.008取整,舍弃0.008,235即为对0.918做8bit量化后的整数值。

   对235进行反量化:235/2^8=0.91796875,得到量化误差0.918-0.91796875=0.00003125,而精度为1/(2^8)=0.00390625, 量化误差小于精度的一半,满足“无损条件”。

如果小数位用7位表示,0.918*2^7=117.504取整,舍弃0.504,  117即为对0.918做7bit量化后的整数值。

对117进行反量化:117/2^7=0.9140625,得到量化误差0.918-0.9140625=0.0039375,而精度为1/(2^7)=0.0078125, 量化误差大于精度的一半,无法无损量化。

故答案选择 D

下面某疆题

同理:答案选择 A

在 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、付费专栏及课程。

余额充值