0010.01 | 2.25 | 2^? | |
---|---|---|---|
<<1 | 100.1 | 4.5 | 2^1 |
<<2 | 1001 | 9 | 2^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 进行定点化时需要,整数部分和小数部分均需要量化。
-
选择 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 -
选择 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 即可。 -
选择 11 bit 量化时
整数部分四位,小数部分剩余 7 bit,可表示 128 个刻度,每个刻度 0.0078125,小数部分需要的刻度数为:0.918 / 0.0078125 = 117.504,量化时四舍五入为 118 个刻度,则量化误差为 0.504 * 0.0078125 = 0.0039375,四舍五入取四位小数为:0.0039。
因此,该题答案为:C。