我有这个 C 函数:
double f(int x)
{
if (x <= 0)
return 0.0;
else
return x * log(x);
}
我在一个紧密的循环中调用它,并且想摆脱分支以查看它是否提高了性能。
我不能使用这个:
double f(int x)
{
return x * log(x);
}
因为它在 x == 0
时返回 NaN
(大约 25% 的时间是正确的。)
是否有另一种实现方式,使其在x == 0
时返回0
,但仍然摆脱分支?
(我不太关心负输入,因为这些是错误,而零不是。)
最佳答案
首先注意 log(1) = 0。然后你可以将问题写成 x * log(y),其中如果 x <= 0 则 y = 1,否则等于 x;如果 y = 1,则 x 无关紧要,因为 log(y)=0。
类似 y = (x > 0)*x + (x <= 0) 的东西会这样做,然后:
double f(int x) {
return x * log((x > 0)*x + (x <= 0));
}
这仅取决于 log(1) 和四个整数操作是否比分支差。
关于c - f(x) := if x == 0 then 0 else (x * log(x)) 的无分支实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13403333/