2008年12月7日 星期日

移位加法

在microchip的討論區找資料時,發現一個有趣的問題


原討論文章出處笨鴨上班啦裡面在討論如何取得較精的20%


那我也來做個比較好了


設y=200;


t=y*0.2;


使用浮點數運算,可以得到0x0028;運算時間392個指令時間。



使用hellowanz大大的方式:y=t>>3+t>>4+t>>7+t>>8 ,移位數值不捨去。


可以得到0x0027,運算時間15個指令時間。


使用master大大的方法:y=t>>3+t>>4。


可以得到0x0025,運算時間6個指令時間。


使用之前的移位除法:y=t*819>>12。


可以得到0x0027,運算時間16個指令時間。


結論:使用hellowanz大大的方式,單純只用移位器和加法器,一樣可以做到精準度小數1位。


不過,用移位除法的精準度可以準到小數3位。


呵呵,很有趣的題目。給大家參考一下。


4 則留言:

  1. 其實這個現象可以看出你所用的MCU是具有乘法器,所以指令時間才會少。若是沒有乘法器,使用數值模擬一樣是用移位加法代替乘法。
    所以使用時機,應是看使用的MCU是否有乘法器。若有,使用乘法及移位除法會比較好。
    若是沒有乘法器,使用移位加法,因為可以省下精算的時間。

    [版主回覆12/08/2008 15:17:43]因為我接觸的MCU比較少,因為Microchip很支持,且大概都有免費的Sample可以使用,所以就很習慣的用dsPIC了。

    回覆刪除
  2. 點數又不能當飯吃2010年2月21日 晚上10:19

    可否請教一下 y=t*819>>12裡面的數字819跟12是如何找出來的 e041128@ms28.url.com.tw
    [版主回覆02/22/2010 15:34:01]http://tw.myblog.yahoo.com/sn903209ss/article?mid=461&prev=478&next=456&l=a&fid=5
    照著聯結進去,你就可以看到結果了。

    回覆刪除
  3. 我今天才看到,原來我的東西也有人仔細研究,這表示論談的資料很有用,真的有幫助到人,我就很開心了
    Hellowanz
    [版主回覆05/22/2011 09:10:14]也感謝你們這樣熱心的人,才讓我有學習的空間
    題外話,Hellowanz 大大和ASUS有關係嗎?因為我找你的資訊會和ASUS有聯結

    回覆刪除
  4. 你怎麼去搜尋這個...?我跟ASUS沒什麼關係,我只是買了EPC,註冊了一個帳號,在ASUS網頁上回答問題而已,不過很久沒上去看了

    回覆刪除