定点数和浮点数的转化

0010.012.252^?
<<1100.14.52^1
<<2100192^2

可见将二进制数左移多少位等价于将二进制对应的十进制数乘上 2 的多少方。

#include "stdio.h"  
int main() {  
  
    double floatingPointValue = 3.14159;  
    int scaleFactor = 1 << 15; // 2^15  
    int fixedPointValue = (int) (floatingPointValue * scaleFactor);
  
    printf("Original floating-point value: %f\n", floatingPointValue);  
    printf("Fixed-point value (Q15): %d\n", fixedPointValue);  
    printf(" =%f\n", (float) fixedPointValue / scaleFactor);  
  
    printf("还原值%d", scaleFactor);  
  
    return 0;  
} 

1 转化过程

待定点数 a 假设为 3.14159,将此数定点化,定点的要求为 Qn=12。
Qn=12 表示小数位占据了 12 位:
这是因为在代码中如果 a 被定义成了 int,那么 a 的位宽就是 4 字节,共 32 位。在计算机中数是按照二进制数存储的,将二进制数左移 12 位,整数位还是整数位,小数位的前 12 位被移到了整数位,所以说 Qn=12 表示小数位占据了 12 位。

2 量化误差

这是因为在转化过程中选择小数点位数不同导致的。例如使用 Qn=12,则最大量化精度位 1/2^12 = 0.00024。
如果量化误差小于量化精度的一半就可以认为是无损化量化。


对 12.918 做无损定点化,需要的最小位宽是多少位?位宽选择 11 位时的量化误差是多少?
A. 12 位,0.118
B. 13 位 , 0.0039
C. 12 位 , 0.0039
D . 13 位 , 0.0118

解析:
根据上面所写定点化知识点,对 12.918 进行定点化时需要,整数部分和小数部分均需要量化。

  1. 选择 12 bit 量化时
    整数部分 12,则需要四位进行量化 1100,(正数直接当作无符号数对待,则符号位可以不要),假设使用 12 bit 进行量化,则小数 0.918 部分只剩 8 位可用,因此量化精度为 1/(2^8) = 0.00390625。(也可以理解为 8 bit 可表示 256 个刻度,每个刻度为 0.00390625)。则小数 0.918 需要的刻度数位:0.918 / (0.00390625) = 235.008,小数位数小于 0.5,可认为无损量化。
    因此,12 bit 可以无损量化 12.918

  2. 选择 13 bit 量化时
    整数部分依旧使用 1100 四位即可,小数 0.918 剩余 9 bit 可用,量化精度为 1 / (2^9) = 0.001953125,(即 9 bit 可表示 512 个刻度,每个刻度 0.001953125)。因此需要 0.918 / 0.001953125 = 470.016,小数部分小于 0.5,也可实现无损量化。
    根据题意,最小位宽选择 12 bit 即可。

  3. 选择 11 bit 量化时
    整数部分四位,小数部分剩余 7 bit,可表示 128 个刻度,每个刻度 0.0078125,小数部分需要的刻度数为:0.918 / 0.0078125 = 117.504,量化时四舍五入为 118 个刻度,则量化误差为 0.504 * 0.0078125 = 0.0039375,四舍五入取四位小数为:0.0039。

因此,该题答案为:C。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值