作者cplusplus (C++)
看板C_Sharp
标题Re: [心得]使用Shift移位加快浮点运算
时间Thu Apr 20 21:57:01 2006
※ 引述《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
1F:推 ithinkurdumb:RISC? CISC? 04/21 01:33
2F:推 tomex:cplusplus讲出这些算法的限制,的确必须小心溢位。 04/21 01:49