Re: [問題] 定點數運算(Q格式)

看板ASM (組合語言)作者 (2塊錢立頓紅茶包)時間14年前 (2010/12/25 06:58), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/2 (看更多)
※ 引述《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
文章代碼(AID): #1D5POXf_ (ASM)
討論串 (同標題文章)
本文引述了以下文章的的內容:
1
9
14年前, 2010/12/21 12:09
完整討論串 (本文為第 2 之 2 篇):
1
9
14年前, 2010/12/21 12:09
文章代碼(AID): #1D5POXf_ (ASM)