Ser*_*rge 19 c c++ floating-point optimization performance
我们在项目中进行了大量的浮点到整数转换.基本上,这样的事情
for(int i = 0; i < HUGE_NUMBER; i++)
int_array[i] = float_array[i];
Run Code Online (Sandbox Code Playgroud)
执行转换的默认C函数非常耗时.
是否有任何工作(可能是手动调整功能)可以加快一点点的过程?我们不太关心精度.
Lar*_*itz 15
这里的大多数其他答案只是试图消除循环开销.
只有deft_code的答案才能解决真正问题的核心 - 在x86处理器上将浮点转换为整数是非常昂贵的.deft_code的解决方案是正确的,但他没有给出任何引用或解释.
以下是技巧的来源,有一些解释以及特定于是否要向上,向下或向零的版本:了解您的FPU
很抱歉提供一个链接,但真的写在这里的任何东西,除了再现那篇优秀的文章,都不会让事情变得清晰.
def*_*ode 14
inline int float2int( double d )
{
union Cast
{
double d;
long l;
};
volatile Cast c;
c.d = d + 6755399441055744.0;
return c.l;
}
// this is the same thing but it's
// not always optimizer safe
inline int float2int( double d )
{
d += 6755399441055744.0;
return reinterpret_cast<int&>(d);
}
for(int i = 0; i < HUGE_NUMBER; i++)
int_array[i] = float2int(float_array[i]);
Run Code Online (Sandbox Code Playgroud)
双参数不是错误的!有办法直接用浮子做这个技巧,但是试图覆盖所有角落的情况变得丑陋.在当前形式中,如果要截断,则此函数将使浮点数舍入最接近的整数,而不是使用6755399441055743.5(少0.5).