• 数值计算小问题


    数值范围转换

    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
  • 相关阅读:
    图床_shell命令passwd
    图床_shell命令usermod
    图床_shell命令groupadd
    图床_shell命令userdel
    图床_shell命令useradd
    图床_shell命令whereis
    图床_shell命令find
    图床_shell命令which
    图床_shell命令locate
    图床_shell命令free
  • 原文地址:https://www.cnblogs.com/McKean/p/6084843.html
Copyright © 2020-2023  润新知