心胸决定格局,眼界决定境界...

Q值注意事项

short a = 51;//没有所谓的Q9 <2^6
short b = 200;//没有所谓的Q7,因为它们不是由浮点数转换而来 <2^8

可以直接做运算,但是精度低,分子小于分母。

 

只有移位的概念,目的是保证精度。
float c = 1 - a/b;
float c_f = 1 - (float)a/b;
int c1 = (1<<3) - (a<<3)/(b);//
float result1 = (float)c1 / 8;
int c2 = (1<<9) - (a<<9)/(b);//最多左移9位
float result2 = (float)c2 / (1<<9);

 

float a1 = 1.1;

如果浮点转成定点,可以查看表,确定Q,或者直接计算

Q14;

int_16 a1_f = a1 << 14;// -2 ~2        

 

Q13;

float b1 = 2.2;

int_16  b1_f = b1 << 13;//-4 ~ 4

 

做加法或者做减法,  先将Q13->Q14, 即 b1_f << 1  ,左移一位,Q对齐后,再运算,最后回到浮点时,  >>14.

做除法时,商是小数,很小,因此,要将分子放大,左移N位,最后结果要右移N位,同时因为Q14/Q13,所以总体要右移(N+1)位

 

如果分母左移一位,Q14,则结果为Q0。都能计算,但是结果很差。

如果分子右移一位,Q13,则结果为Q0,一样。

如果分子右移动4位,则Q10,则结果为Q-3,精度变得更差。真实结果缩小了Q-3倍,还原时*Q3。

如果分子左移动4位,则Q18,则结果为Q5,(早就溢出了,用int)真实结果方法Q5倍,精度提高了,再还原。

 

左移肯定变大,  一个数的大小,没法从Q的标记来判断。

Q值对于已变换成的定点数来说,表示一种尺度,目前的放大倍数(相对于原始值),放大倍数越高,精度越高(恢复原始结果时,缩小回)。

1个浮点转成定点的值,始终标记着它的Q值属性,中间经过原有的计算,(这个值得Q值不会改变),不同的值经过作用之后产生的结果,对应新的Q值,最后得还原

给定一个整数,如果没有标记,则认为是Q0,没有经过浮点转定点,无需还原。如果有Q值标记的,则认为是浮点转成的,最后要还原的。

经过浮点转定点的结果,一定要加上Q值标记

 一个数值大小对应的Q值所在数值范围,没有意义。Q值是个变换的量度。

Q值对于1个浮点数来说,标识它最大能放大的倍数,也就是最高的精度,超过这个值,会溢出。小于这个值,可能会有误差损失。

例如32674值对应Q0所在的范围, 它可能是由 32674/2经过 Q1得到的,也有可能就是32674经过Q0得到的等。

 

浮点转化为定点后,进行运算。

定点运算一般要快很多。

如果再对某些运算算法,转换逼近,可以更一步提升效率。

 

 

 

可以直接

posted @ 2016-03-08 20:04  WELEN  阅读(333)  评论(0)    收藏  举报