我有一个相当理论的问题: 将y乘以2 ^ x并将y减去 将y乘以[(2 ^ x)-1]直接?
(y*(2^x) - y)
vs (y*((2^x)-1))
我对从传感器获得的一些数据实施了移动平均滤波器。我的基本想法是,我希望通过获取旧的平均值,将其乘以2^x
,添加新值,再次除以[(2^x)-1]
来平均最后2^x
个值。但是因为我必须每秒执行500次以上,所以我希望尽可能地优化它。
我知道浮点数用IEEE754表示,因此,乘以2除以2的幂应该相当快(基本上只是改变尾数),但如何最有效地做到这一点?我应该只是简单地乘以((2^x)-1)
,或者乘以2.0f
并更好地减去y,或者我甚至可以通过在尾数上执行lefthift来更有效地做到这一点?如果可能的话,如何正确实施?
非常感谢你!
答案 0 :(得分:1)
我不认为将浮点数乘以2的幂在实践中比在通用乘法中更快(尽管我同意在理论上它应该更快,假设没有溢出/下溢)。换句话说,我不认为有硬件优化。
现在,我可以假设您有一个现代处理器,即使用FMA。在这种情况下,如果以(y*(2^x) - y)
执行,fma(y,2^x,-y)
会更快(您必须编写表达式的方式取决于您的语言和实现):FMA应该与实践中的乘法一样快。
另请注意,速度也可能取决于上下文。例如,我在简单的代码中观察到,做更多的工作可以令人惊讶地产生更快的代码!因此,您需要测试(在您的真实代码上,而不是任意基准测试)。