標(biāo)題: PIC33單片機(jī)乘法器小數(shù)模式的如何計(jì)算的疑問(wèn)? [打印本頁(yè)]

作者: yermsir    時(shí)間: 2021-10-19 15:20
標(biāo)題: PIC33單片機(jī)乘法器小數(shù)模式的如何計(jì)算的疑問(wèn)?
本帖最后由 yermsir 于 2021-10-19 15:37 編輯

PIC33單片機(jī)乘法器小數(shù)模式,是小數(shù)轉(zhuǎn)換為Q15的形式,然后進(jìn)行計(jì)算。轉(zhuǎn)換成Q15的形式是單片機(jī)自己轉(zhuǎn)換的,還是程序員轉(zhuǎn)換完成然后賦值給寄存器的。
比如,將W4平方并將結(jié)果加到ACCB中的指令語(yǔ)句:MAC W4*W4,B。 比如我要算0.5的平方,然后加到累加器B中,W4中直接賦值0.5這種小數(shù),還是要賦值32768。
芯片說(shuō)明資料有兩個(gè)例子,請(qǐng)幫忙看看累加器中B的結(jié)果是如何計(jì)算出來(lái)的?希望能夠給出詳細(xì)點(diǎn)的計(jì)算過(guò)程。

捕獲.JPG (61.94 KB, 下載次數(shù): 83)

捕獲.JPG

作者: Y_G_G    時(shí)間: 2021-10-20 15:54
這個(gè)是硬件乘法器,計(jì)算過(guò)程是硬件執(zhí)行的,不是軟件計(jì)算的
你只要知道,你要進(jìn)行什么運(yùn)算,通過(guò)控制寄存器來(lái)選擇運(yùn)算選項(xiàng)就可以了
再看一下用不用讀取輸出,有的編譯器是直接就是浮點(diǎn)型結(jié)果,有的是則是保存在某個(gè)寄存器,需要讀取的
這個(gè)專業(yè)性很強(qiáng)的,沒(méi)有真正用過(guò)的人也只能是給個(gè)指導(dǎo)性知識(shí)而已,真正的,還是要你自己去看的
作者: Hephaestus    時(shí)間: 2021-10-20 17:07
Y_G_G 發(fā)表于 2021-10-20 15:54
這個(gè)是硬件乘法器,計(jì)算過(guò)程是硬件執(zhí)行的,不是軟件計(jì)算的
你只要知道,你要進(jìn)行什么運(yùn)算,通過(guò)控制寄存器來(lái)選 ...

Q15是定點(diǎn)(fixed point)數(shù),你只見(jiàn)過(guò)float point,鑒定完畢。
作者: Y_G_G    時(shí)間: 2021-10-20 18:15
Hephaestus 發(fā)表于 2021-10-20 17:07
Q15是定點(diǎn)(fixed point)數(shù),你只見(jiàn)過(guò)float point,鑒定完畢。

我見(jiàn)過(guò)什么數(shù)跟樓主的"PIC33單片機(jī)乘法器小數(shù)模式"主題有什么關(guān)系嗎?
作者: yermsir    時(shí)間: 2021-10-20 18:37
Y_G_G 發(fā)表于 2021-10-20 15:54
這個(gè)是硬件乘法器,計(jì)算過(guò)程是硬件執(zhí)行的,不是軟件計(jì)算的
你只要知道,你要進(jìn)行什么運(yùn)算,通過(guò)控制寄存器來(lái)選 ...

我還是想要知道附圖中,例子計(jì)算的結(jié)果是怎么來(lái)的,這樣我心里會(huì)對(duì)小數(shù)的計(jì)算才有把握。
作者: Y_G_G    時(shí)間: 2021-10-20 20:08
yermsir 發(fā)表于 2021-10-20 18:37
我還是想要知道附圖中,例子計(jì)算的結(jié)果是怎么來(lái)的,這樣我心里會(huì)對(duì)小數(shù)的計(jì)算才有把握。

沒(méi)有用過(guò)16位單片機(jī),不知道
我只用過(guò)8位的,一般都是編譯器處理的,不需要去了解匯編方面的運(yùn)算,在C語(yǔ)言中有乘除運(yùn)算,就會(huì)對(duì)應(yīng)的生成乘除法匯編指令,單片機(jī)內(nèi)部自動(dòng)用乘法器運(yùn)算
至于這個(gè)數(shù)怎么來(lái)的,不知道
我以前只用過(guò)PIC的8位機(jī),而且是匯編,匯編沒(méi)有小數(shù)正負(fù)數(shù)的說(shuō)法
作者: Hephaestus    時(shí)間: 2021-10-20 20:50
好吧,我把數(shù)給你算出來(lái)了,不要聽(tīng)那個(gè)啥都不懂的呱噪。
76AE * 76AE * 2 + FE98344500 = FF063E0188

這里面最關(guān)鍵的是莫名其妙出現(xiàn)的這個(gè)2,你的原數(shù)是16位Q15格式,如果直接按整數(shù)平方,得到一個(gè)32位的整數(shù)結(jié)果,如果把它看成是Q定點(diǎn)格式,那么將是Q30格式——平方之前小數(shù)點(diǎn)在第15位前,平方后小數(shù)點(diǎn)在第30位前,而是Q30格式定點(diǎn)數(shù)是沒(méi)啥用的,要轉(zhuǎn)成更通用的Q31格式才好用,畢竟把Q51的低16位扔掉就回到了Q15格式,太方便了。

從表達(dá)的數(shù)字上講可以這么分析
76AE(Q15)= 0.927185
76AE(Q15)^2 = 3704DE44(Q31) = 0.429836     ——這個(gè)結(jié)果顯然是錯(cuò)的,差了2倍。
76AE(Q15)^2 *2 = 6E09BC88(Q31) = 0.859672

6E09BC88 + FE98344500 = FF063E0188

完美的解釋了你的例2。。
作者: Y_G_G    時(shí)間: 2021-10-20 22:23
Hephaestus 發(fā)表于 2021-10-20 20:50
好吧,我把數(shù)給你算出來(lái)了,不要聽(tīng)那個(gè)啥都不懂的呱噪。
76AE * 76AE * 2 + FE98344500 = FF063E0188

我是不懂這個(gè)運(yùn)算,因?yàn)槲抑耙恢笔怯脜R編的,沒(méi)有定點(diǎn)數(shù)這個(gè)概念,所以我不會(huì)這個(gè)
你既然知道,又是在這個(gè)論壇逛的,就沒(méi)有必要數(shù)落我,我一沒(méi)得罪你,二我也說(shuō)了并不會(huì)這個(gè)
很顯然,我來(lái)這的目的和你是不一樣的
我一個(gè)是打發(fā)時(shí)間,二個(gè)是相互學(xué)習(xí)
而你,我不知道,當(dāng)然,也不想知道
作者: Hephaestus    時(shí)間: 2021-10-20 22:40
Y_G_G 發(fā)表于 2021-10-20 22:23
我是不懂這個(gè)運(yùn)算,因?yàn)槲抑耙恢笔怯脜R編的,沒(méi)有定點(diǎn)數(shù)這個(gè)概念,所以我不會(huì)這個(gè)
你既然知道,又是在這個(gè) ...

我負(fù)責(zé)的第一個(gè)電子項(xiàng)目是一個(gè)壓力計(jì),核心算法用最小二乘法擬合標(biāo)定數(shù)據(jù),中間就是用Q31定點(diǎn)數(shù)運(yùn)算,寫(xiě)了3000行8051匯編。

定點(diǎn)數(shù)跟匯編沒(méi)有你死我活的關(guān)系,相反有很多位操作,用匯編實(shí)現(xiàn)更方便,關(guān)鍵是你要理解定點(diǎn)數(shù)。如果你什么都不懂,就閉嘴,隨便置喙只能被人笑掉大牙。
作者: Y_G_G    時(shí)間: 2021-10-21 09:05
Hephaestus 發(fā)表于 2021-10-20 22:40
我負(fù)責(zé)的第一個(gè)電子項(xiàng)目是一個(gè)壓力計(jì),核心算法用最小二乘法擬合標(biāo)定數(shù)據(jù),中間就是用Q31定點(diǎn)數(shù)運(yùn)算,寫(xiě) ...

好的,我知道了
作者: yermsir    時(shí)間: 2021-10-21 10:54
Hephaestus 發(fā)表于 2021-10-20 22:40
我負(fù)責(zé)的第一個(gè)電子項(xiàng)目是一個(gè)壓力計(jì),核心算法用最小二乘法擬合標(biāo)定數(shù)據(jù),中間就是用Q31定點(diǎn)數(shù)運(yùn)算,寫(xiě) ...

謝謝您的回復(fù),讓我了解了Q15小數(shù)的運(yùn)算規(guī)則。我用您的方法來(lái)計(jì)算例1,卻發(fā)現(xiàn)結(jié)果和例子對(duì)不上。
計(jì)算過(guò)程如下:
A022(Q15)=-0.7489624
A022(Q15)^2  = 642A8484
A022(Q15)^2 *2 = C8550908(Q31) =1.56509507
而真正的結(jié)果為:(-0.7489624)*(-0.7489624)=-0.56094467
可見(jiàn)我的計(jì)算是錯(cuò)誤的,例1和例2的區(qū)別就是負(fù)數(shù)和正數(shù),網(wǎng)上查了一些資料,但是都是間接的說(shuō)明,自己還是悟不透,您能不能進(jìn)一步解釋一下例1是怎么計(jì)算出來(lái)的?
作者: Hephaestus    時(shí)間: 2021-10-21 12:25
yermsir 發(fā)表于 2021-10-21 10:54
謝謝您的回復(fù),讓我了解了Q15小數(shù)的運(yùn)算規(guī)則。我用您的方法來(lái)計(jì)算例1,卻發(fā)現(xiàn)結(jié)果和例子對(duì)不上。
計(jì)算過(guò) ...

A022是負(fù)數(shù)。(duì)應(yīng)的絕對(duì)值相同的正數(shù)是5FDE,他的平方就是47CD0908,不就是你例1里面你用藍(lán)筆勾出來(lái)的20000000+47CD0908=67CD0908嗎?
作者: yermsir    時(shí)間: 2021-10-21 14:37
Hephaestus 發(fā)表于 2021-10-21 12:25
A022是負(fù)數(shù)。(duì)應(yīng)的絕對(duì)值相同的正數(shù)是5FDE,他的平方就是47CD0908,不就是你例1里面你用藍(lán)筆勾出來(lái)的2 ...

https://blog.csdn.net/yanxiaopan/article/details/76853040
我在這個(gè)網(wǎng)站上看到Q15格式的數(shù),直接把兩個(gè)負(fù)數(shù)相乘,右移15位就可以得到結(jié)果。比如網(wǎng)址中舉例:-0.5*-0.5。
‘’對(duì)于Q15,例如計(jì)算-0.5×-0.5,0.5表示為二進(jìn)制為0100000000000000,取反加1后為1100000000000000,則-0.5×-0.5的二進(jìn)制相乘結(jié)果為10010000000000000000000000000000,右移15位,得到10010000000000000‘’

難道Q15的負(fù)數(shù),并不是兩個(gè)負(fù)數(shù)直接相乘?而是先轉(zhuǎn)化為正數(shù),然后再相乘?

作者: Hephaestus    時(shí)間: 2021-10-21 15:04
yermsir 發(fā)表于 2021-10-21 14:37
https://blog.csdn.net/yanxiaopan/article/details/76853040
我在這個(gè)網(wǎng)站上看到Q15格式的數(shù),直接把兩 ...

瞎扯淡,那個(gè)網(wǎng)頁(yè)舉得栗子就是特殊情況,-0.5和+0.5只差一個(gè)符號(hào)位所以可以得到正確答案,你算個(gè)-0.25試試?去掉符號(hào)位-0.25不就變成0.75了???

說(shuō)了半天你還是沒(méi)弄懂Q15是什么,以16位Q15為例:
0~7fff表示0~0.99999
ffff~8000表示-0.00001~-1.0

作者: yermsir    時(shí)間: 2021-10-21 15:19
Hephaestus 發(fā)表于 2021-10-21 15:04
瞎扯淡,那個(gè)網(wǎng)頁(yè)舉得栗子就是特殊情況,-0.5和+0.5只差一個(gè)符號(hào)位所以可以得到正確答案,你算個(gè)-0.25試 ...

您批評(píng)的是,網(wǎng)頁(yè)的確是舉例的特殊情況,我被誤導(dǎo)了,謝謝您的指教,我明白了。
作者: yermsir    時(shí)間: 2021-10-21 15:31
本帖問(wèn)題已經(jīng)解決,感謝論壇大神的幫助。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1