更快的方法来乘以浮点数

Ray*_*Ray 2 c c++

我们可以用C/C++中的左移位运算符来更快地将整数乘以2的幂.

但我们不能将左移运算符用于浮点数或双精度数,因为它们以不同的方式表示,具有指数分量和尾数分量.

我的问题是,

有什么办法吗?像左移运算符的整数更快地乘以浮点数?即使有2的幂?

小智 13

不,你不能.但是根据您的问题,您可以使用SIMD指令对几个压缩变量执行一次操作.阅读SSE2指令集. http://en.wikipedia.org/wiki/SSE2
http://softpixel.com/~cwright/programming/simd/sse2.php

无论如何,如果您正在优化浮点乘法,那么在99%的情况下您会查找错误的位置.如果没有对过早优化进行大肆宣传,至少可以通过执行适当的分析来证明这一点.


gre*_*ade 5

可以这样做:

float f = 5.0;
int* i = (int*)&f;
*i += 0x00800000;
Run Code Online (Sandbox Code Playgroud)

但你必须移动浮出寄存器,到内存中,然后再返回到一个不同的寄存器的开销,才得以冲回内存...约15个左右的周期比,如果你只是做了fmul.当然,这是即使假设您的系统具有IEEE浮在所有.

不要试图优化这个.您应该查看程序的其余部分以查找算法优化,而不是尝试发现微优化浮点数等方法.它只会以鲜血和泪水结束.

  • 嘎..那段代码给了我一些意志力.此外,在浮点寄存器CPU寄存器之间传递数据通常是非常昂贵的操作.这就是为什么即使是float-to-int转换也很糟糕的原因. (2认同)