作者iamlouis (2块钱立顿红茶包)
看板ASM
标题Re: [问题] 定点数运算(Q格式)
时间Sat Dec 25 14:58:39 2010
※ 引述《scrush (阿庆)》之铭言:
: 这题可能有点牵涉韧体的范畴,请问一下,如果使用Q格式来做定点数运算,是不是乘上
: 一个值量化之後,到最後在除上同样倍数的值除回来就行了?比方说我用Q15的格式来
: 对0.5做运算,得到的值是4000H,到最後是不是除上2的负15次方就算还原了?
: 可是要用什麽方法验证数值有确定转换成功?
: ex.
: signed short i = 0x4000; (假设i是0.5,变成Q15後的值)
: i = i/32768;
: 这样做i就已经视同有转换过了吗?还是说我的步骤有错呢?
: 恳请指教,谢谢!
Q 格式转换的过程中, 容易有 overflow 和 underflow 的问题,
以 i = i / 32678 来说, 因为是做 integer 除法运算, 所以小数的部份就会舍弃了.
所以, 可以先将 32678 转成 float, 那麽就会进行 float 的除法.
底下是稍微 generic 一点的 code:
// 先将 float 转成 Q 格式後, 再除以 PI (圆周率) 的 Q16 值, 再转回 float.
float MyQnDivPi(int Qn, float f) {
// 转换成 Q 格式
signed short i = f * (1 << Qn);
// 做你的 Q 格式运算, 例如: 除以 PI (圆周率)
signed long l = i;
l = (l << 14) + (l << 12) + (l << 8) + (l << 7) + (l << 5) + (l << 4) +
(l << 3) + (l << 2) + l;
i = l >> 16;
// 将 Q 格式还原成 float
f = i / (float)(1<<Qn);
return f;
}
int main() {
printf("Q15: %f\n", MyQnDivPi(15, 0.5)); // 约有 0.3% 误差
printf(" Q8: %f\n", MyQnDivPi( 8, 0.5)); // 约有 1.9% 误差
printf(" Q4: %f\n", MyQnDivPi( 4, 0.5)); // 约有 27.3% 误差
}
要注意 A = B */ C 当中, A B C 的 type 各是什麽, 因为会影响 cast (转型) 与
乘除的先後顺序. 对结果影响很大.
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 221.169.204.127