Re: [問題] 定點數運算(Q格式)
※ 引述《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
討論串 (同標題文章)
ASM 近期熱門文章
PTT數位生活區 即時熱門文章
11
20