首页 > 代码库 > 数值计算小问题

数值计算小问题

数值范围转换

243=0xF3 是在寄存器显示的值实际上这是一个负值
那么真实的整数值是 0xF3-256 = 243-256=-13

算法定点化

1=======================
Q(16,13)   表示数值的位数是16bit,低13bit是属于小数
例子:
除以25,经过Q(16,15)之后的值是0x51F
计算:0.04*2^15 = 1310.72 取整后=1311=0x51F

2=======================
Q(16,16)*Q(16,15) 后,小数点数15乘以小数点数16的结果是31位小数点
需要右移15bit,才能成为Q(16,16)的定点化


3======================
12用3bit表示,12=3*4=3*2^2

4 舍入  ==================
四舍五入或向下向上取整:
四舍五入取整:round
朝零取整:fix
进1取整:ceil
向下取整:floor

有符号数扩展

INT16 wReal = 0xe96c;
INT16 wImag = 0xfae2;

UINT32 dTemp;

dTemp = (wReal<<16) + wImag;
  = (0xe96c << 16) + 0xfae2
  = 0xe96c0000 + 0xfffffae2
  = 0x1e96dfae2
  = 0xe96dfae2

由于wImag是有符号数,扩展成32bit就变成了0xfffffae2,导致相加以后出问题了。

移位先后造成比特误差精度问题

假设 
x1=3,x2=2.
那么
(x1>>1)*x2 = 1*2 = 2
(x1*x2)>>1 = 6>>1 =3

移位放在最后做,精度会高一些

饱和问题

Q(16,14) 与 Q(16,13)相乘结果是Q(32,27)

Q(32,27)右移1bit是Q(32,26)

右移1bit,去掉最右1bit。Q(32,27)变成Q(31,26)。
Q(31,26)高位补1bit,变成Q(32,26),结果是一样的。也可以不补这1bit

 

数值计算小问题