我们可以用C / C ++做左移位运算符,以便更快地将整数乘以2的幂。
但我们不能将左移运算符用于浮点数或双精度数,因为它们以不同的方式表示,具有指数分量和尾数分量。
我的问题是,
有什么办法吗?像左移运算符的整数更快地乘以浮点数?即使权力为2 ??
答案 0 :(得分:13)
无论如何,如果您正在优化浮点乘法,那么在99%的情况下您会查找错误的位置。如果没有对过早优化进行大肆宣传,至少可以通过执行适当的分析来证明这一点。
答案 1 :(得分:5)
你可以这样做:
float f = 5.0;
int* i = (int*)&f;
*i += 0x00800000;
但是你有把把浮子从寄存器中移出,进入内存,然后回到另一个寄存器的开销,只是被刷回内存......大约15个左右的循环更多比你刚刚完成fmul
。当然,这甚至假设您的系统具有IEEE浮动 。
不要试图优化它。您应该查看程序的其余部分以查找算法优化,而不是尝试发现微优化浮点数等方法。它只会以鲜血和泪水结束。
答案 2 :(得分:1)
浮点运算的速度显然取决于指令组合。在这里解释:
What's the relative speed of floating point add vs. floating point multiply
一种替代方法是使用定点浮点而不是“真实”浮点数。
答案 3 :(得分:1)
确实,任何体面的编译器都会识别静态时间的两次幂常量并使用最智能的操作。
答案 4 :(得分:0)
在Microsoft Visual C ++中,不要忘记"浮点模型"开关。默认值为/fp:precise
,但您可以将其更改为/fp:fast
。快速模型可以交换一些浮点精度以获得更快的速度。在某些情况下,加速可能会非常激烈(下面引用的博客文章指出在某些情况下加速比高达x5)。请注意,默认情况下,使用/fp:fast
开关编译Xbox游戏。
我刚从/fp:precise
切换到/fp:fast
我的数学应用程序(有很多float
次乘法)并立即获得27%的加速,几乎没有精度损失我的测试套件。
阅读Microsoft博客文章,了解此切换的详细信息here。似乎不启用此功能的主要原因是,如果您需要所有可用的准确度(例如,具有大世界的游戏,可能累积错误的长时间运行的模拟)或者您需要强大的{{1或} double
NaN处理。
最后,还要考虑启用SSE2指令扩展。这使我的应用程序额外增加了3%。其效果将根据算术中操作数的数量而变化 - 例如,这些扩展可以在您一次添加或乘以2个数字的情况下提供加速。