![]() |
發布時間: 2021-10-19 15:20
正文摘要:本帖最后由 yermsir 于 2021-10-19 15:37 編輯 PIC33單片機乘法器小數模式,是小數轉換為Q15的形式,然后進行計算。轉換成Q15的形式是單片機自己轉換的,還是程序員轉換完成然后賦值給寄存器的。 比如,將W4平方 ... |
本帖問題已經解決,感謝論壇大神的幫助。![]() |
Hephaestus 發表于 2021-10-21 15:04 您批評的是,網頁的確是舉例的特殊情況,我被誤導了,謝謝您的指教,我明白了。 |
yermsir 發表于 2021-10-21 14:37 瞎扯淡,那個網頁舉得栗子就是特殊情況,-0.5和+0.5只差一個符號位所以可以得到正確答案,你算個-0.25試試?去掉符號位-0.25不就變成0.75了??? 說了半天你還是沒弄懂Q15是什么,以16位Q15為例: 0~7fff表示0~0.99999 ffff~8000表示-0.00001~-1.0 |
Hephaestus 發表于 2021-10-21 12:25 https://blog.csdn.net/yanxiaopan/article/details/76853040 我在這個網站上看到Q15格式的數,直接把兩個負數相乘,右移15位就可以得到結果。比如網址中舉例:-0.5*-0.5。 ‘’對于Q15,例如計算-0.5×-0.5,0.5表示為二進制為0100000000000000,取反加1后為1100000000000000,則-0.5×-0.5的二進制相乘結果為10010000000000000000000000000000,右移15位,得到10010000000000000‘’ 難道Q15的負數,并不是兩個負數直接相乘?而是先轉化為正數,然后再相乘? |
yermsir 發表于 2021-10-21 10:54 A022是負數啊!對應的絕對值相同的正數是5FDE,他的平方就是47CD0908,不就是你例1里面你用藍筆勾出來的20000000+47CD0908=67CD0908嗎? |
Hephaestus 發表于 2021-10-20 22:40 謝謝您的回復,讓我了解了Q15小數的運算規則。我用您的方法來計算例1,卻發現結果和例子對不上。 計算過程如下: A022(Q15)=-0.7489624 A022(Q15)^2 = 642A8484 A022(Q15)^2 *2 = C8550908(Q31) =1.56509507 而真正的結果為:(-0.7489624)*(-0.7489624)=-0.56094467 可見我的計算是錯誤的,例1和例2的區別就是負數和正數,網上查了一些資料,但是都是間接的說明,自己還是悟不透,您能不能進一步解釋一下例1是怎么計算出來的? |
Hephaestus 發表于 2021-10-20 22:40 好的,我知道了 |
Y_G_G 發表于 2021-10-20 22:23 我負責的第一個電子項目是一個壓力計,核心算法用最小二乘法擬合標定數據,中間就是用Q31定點數運算,寫了3000行8051匯編。 定點數跟匯編沒有你死我活的關系,相反有很多位操作,用匯編實現更方便,關鍵是你要理解定點數。如果你什么都不懂,就閉嘴,隨便置喙只能被人笑掉大牙。 |
Hephaestus 發表于 2021-10-20 20:50 我是不懂這個運算,因為我之前一直是用匯編的,沒有定點數這個概念,所以我不會這個 你既然知道,又是在這個論壇逛的,就沒有必要數落我,我一沒得罪你,二我也說了并不會這個 很顯然,我來這的目的和你是不一樣的 我一個是打發時間,二個是相互學習 而你,我不知道,當然,也不想知道 |
好吧,我把數給你算出來了,不要聽那個啥都不懂的呱噪。 76AE * 76AE * 2 + FE98344500 = FF063E0188 這里面最關鍵的是莫名其妙出現的這個2,你的原數是16位Q15格式,如果直接按整數平方,得到一個32位的整數結果,如果把它看成是Q定點格式,那么將是Q30格式——平方之前小數點在第15位前,平方后小數點在第30位前,而是Q30格式定點數是沒啥用的,要轉成更通用的Q31格式才好用,畢竟把Q51的低16位扔掉就回到了Q15格式,太方便了。 從表達的數字上講可以這么分析 76AE(Q15)= 0.927185 76AE(Q15)^2 = 3704DE44(Q31) = 0.429836 ——這個結果顯然是錯的,差了2倍。 76AE(Q15)^2 *2 = 6E09BC88(Q31) = 0.859672 6E09BC88 + FE98344500 = FF063E0188 完美的解釋了你的例2!!! |
yermsir 發表于 2021-10-20 18:37 沒有用過16位單片機,不知道 我只用過8位的,一般都是編譯器處理的,不需要去了解匯編方面的運算,在C語言中有乘除運算,就會對應的生成乘除法匯編指令,單片機內部自動用乘法器運算 至于這個數怎么來的,不知道 我以前只用過PIC的8位機,而且是匯編,匯編沒有小數正負數的說法 |
Y_G_G 發表于 2021-10-20 15:54 我還是想要知道附圖中,例子計算的結果是怎么來的,這樣我心里會對小數的計算才有把握。 |
Hephaestus 發表于 2021-10-20 17:07 我見過什么數跟樓主的"PIC33單片機乘法器小數模式"主題有什么關系嗎? |
Y_G_G 發表于 2021-10-20 15:54 Q15是定點(fixed point)數,你只見過float point,鑒定完畢。 |
這個是硬件乘法器,計算過程是硬件執行的,不是軟件計算的 你只要知道,你要進行什么運算,通過控制寄存器來選擇運算選項就可以了 再看一下用不用讀取輸出,有的編譯器是直接就是浮點型結果,有的是則是保存在某個寄存器,需要讀取的 這個專業性很強的,沒有真正用過的人也只能是給個指導性知識而已,真正的,還是要你自己去看的 |