Re: [心得]使用Shift移位加快浮點運算

看板C_Sharp (C#)作者 (C++)時間19年前 (2006/04/20 21:44), 編輯推噓2(200)
留言2則, 2人參與, 最新討論串2/2 (看更多)
※ 引述《tomex (tomex_ou)》之銘言: : 電腦處理四則運算時,唯獨在除法及浮點運算會比較費力 : 針對除法,我們可以倒置為乘法, : 但對於浮點運算,怎麼辦呢? : 答案就是把它替代為一個整數再右移位。 : 例如,一個浮點數 a = 0.1234 : 如何換算成shift運算(以變數b來代替)呢? : 1.a先乘上2^20次方值。 : f = 0.1234 * 1024 * 1024 = 129394.28 : 2.由於shift只能針對整數作運算,四捨五入f值: : i = 129394.28 = 129394 : 3. i值右移20位,129394 >> 20 即等於 0.1234 : 所以 a = 0.1234 = 129394 >> 20 = b 我覺得還是得看你的應用 如果整數來講 129394>>20 是 0 所以運算 a*0.1234 得變成 (a*129394)>>20 不能寫成 a*(129394>>20) 但這樣除了喪失精確度(放棄小數部份) (a*129394) 可能會溢位 a如果是浮點數 a*129394 不容易溢位 但是要shift之前還得轉成整數 也還是可能會溢位 所以這方法 其實不是很適當 還是要看你的應用而定 另外 得看你的cpu來定 a*0.1234是一個浮點乘法 (a*129394)>>20 是兩個運算 在目前一般的risc機器上 不一定會比較快 我覺得既然需要浮點 這種方法還是不太好 除非真的是很隨意大概大概的應用 像是fuzzy方式處理 XD : 我用100萬筆模擬運算求運作計算時間, : 以P4-1.6 Centrino CPU為例,發現使用b值會比用a值時間節省1倍 : 而且b值的cpu使用率也大概為a值為2/3而己。 : 假設你從事數學公式程式寫作,shift的技巧不可不知呀! 數學公式應該都是很要求精確的吧 這種方法還是少用微妙 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.115.217.14

04/21 01:33, , 1F
RISC? CISC?
04/21 01:33, 1F

04/21 01:49, , 2F
cplusplus講出這些算法的限制,的確必須小心溢位。
04/21 01:49, 2F
文章代碼(AID): #14Hv1LuV (C_Sharp)
討論串 (同標題文章)
文章代碼(AID): #14Hv1LuV (C_Sharp)